![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_11.png?5a7ff87)
ヌルバイト攻撃の対策について教えて下さい。
一般的な"\0"を削除する方法なのですが、以下の場合ですと問題無ありません。が、
$arr = "abc\0def";
if (mb_strpos($arr, "\0")) {
$arr = str_replace("\0", "", $arr);
}
echo $arr;
※結果:abcdef
POST送信された値には、全く反応しません。
$arr = $_POST["arr"];//送信データは"abc\0def"
if (mb_strpos($arr, "\0")) {
$arr = str_replace("\0", "", $arr);
}
echo $arr;
※結果:abc\0def
スクリプトコードはUTF-8で、magic_quotes_gpcはOffです。
他にどこをチェックすればよいかわからず投稿しました。
チェックすべきところを教えていただけないでしょうか?
宜しくお願いいたします。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_15.png?5a7ff87)
No.5ベストアンサー
- 回答日時:
formの入力欄に文字列として\0を入れたのならurlencodeされて、%5C0 となります。
受信した時は、urldecode して文字\と文字0になるのでヌルバイトではありません。htmlにphpでヌルバイトを書き出してもブラウザ(operaでしかチェックしてませんが)は、その文字を無視します。データの終わりと認識するので。$_POST をvar_dumpしてみるとよいです。
本当に悪意のあるプログラムからヌルバイトが送信されていたのなら、削除法は、ご呈示のコード str_replaceで出来ます。が、if文は必要ないとおもいます、該当文字が無ければ置き換えが行われないだけですし。また、該当文字が先頭にあった場合、0が返り、スルーされてしまいますので。もしif文で文字位置を調べるなら !== false でチェックすべきです。
こんばんはhrm_mmmさん。
そういう事だったんですね。
とりあえずは問題無かったということで一安心です。
勉強になりました。
ありがとうございました。
No.4
- 回答日時:
>間違いは無いと思うのですが・・・
設定方法的には問題なさそうですが、
何らかの理由で、
「結果的にその指定が、効いてない」場合も考えられますので、
大事なのは、
そのスクリプトにおいて、
「実際に効いているのか、効いていないのか」
を確認することかな、と思います。
よって、以下の方法で確認頂くとして。
(※phpinfo();によっても確認できますが。)
get_magic_quotes_gpc();
→magic quotes gpc の現在の設定を得る
(http://php.benscom.com/manual/ja/function.get-ma …)
//そのスクリプトにおける「magic quotes gpc」の設定をチェック
//1:on 0:off
echo get_magic_quotes_gpc();
ここにも問題がないとなると、困りましたね^^;
ちなみに、POSTする値は、
「\0」以外にも、他の記号もエスケープされるのでしょうかね。
ダブル、シングルのクオテーションもエスケープされたり?
情報が多ければ、それだけ、レスも付きやすいかなと…。^^
この回答への補足
>echo get_magic_quotes_gpc();
結果は0でした。
>ダブル、シングルのクオテーションもエスケープされたり?
入力した状態でそのまま表示されますので、エスケープされていない状態かと思います。
他のサーバーでも試してみましたが、同じ結果でした。
違う結果がでれば、何かヒントが得られるかと思ったのですが、なかなか手強いですね。
もう少しがんばってみます。
いろいろとありがとうございました。
No.3
- 回答日時:
ちょっと補足を・・・
>ということは、ポストされた値は何らかの処理がされていると考えるべきでしょうか?
つまり、POST経由の場合、POSTで受け取った後の時点で、
「\0」が既に無害化(文字列の「\0」へと変えられてしまっている)ということなのだと思います。
しかし、「magic_quotes_gpcはOffです。」とのことなので…
なんらかの経路で、無害化が行われていると思われます。
本当に、magic_quotes_gpcはOffになっておりますでしょうか。
phpinfo()で、今一度確認されてみてはいかがでしょう?
ちなみに、テストサーバのphp.iniと、運用サーバのphp.iniで、
設定が異なることも考えられます。
そのあたりのケアレスミスなども、疑ってみると良いと思います。
このような偉そうなことを書いてますが、
私自身、それほど詳しい人間ではないので、
あくまで、参考程度にお読み下さい。^^;
変なことを言っている可能性は「大」ですから。笑
この回答への補足
何度もありがとうございます。
.htaccessで指定してあり、.htaccessは対象ディレクトリに設置してあります。
php_flag magic_quotes_gpc Off
間違いは無いと思うのですが・・・
>なんらかの経路で、無害化が行われていると思われます。
やはり、これが一番疑わしいのでしょうか?
無害になっていれば、問題は無いと思いますが、原因がわからないと気持ち悪いですね。
No.2
- 回答日時:
こちらが参考になる気がします。
ttp://d.hatena.ne.jp/elseif/20080421/1208604585
上記ページをもとに、簡単にお話しすると、
注目すべきは、クオテーションです。
POSTでキャッチする値に含まれる「\0」をサニタイズ(洗浄)したいのであれば、
$arr = str_replace('\0', "", $arr);
と、シングルクオテーションで「\0」をくくれば、
希望とする結果が得られると思います。
「\0」は、
ダブルクオテーションでくくると、展開されてヌルバイトとして機能し、
シングルでくくると、展開されずに文字列として扱われるようです。
No.1
- 回答日時:
回答にはなっていないかもしれませんが、
$arr = "abc\0def";
//$arr = "abc\0def";をチェック
echo var_dump($arr);
echo '<br>';
echo mb_detect_encoding($arr);
echo '<br>';
//--------------------------------------
//ポストで受け取った値をチェック
echo var_dump($_POST["arr"]);
echo '<br>';
echo mb_detect_encoding($_POST["arr"]);
echo '<br>';
//--------------------------------------
として、両者を比較し、
データの型とか、文字コードの種類などに違いがないか、
チェックされてみたらいかがでしょうか。
同じ文字列であるはずの両者で、結果が異なるわけですから、
恐らく、両者の文字列で何らかの違いが生じているのでは、
と私は思います。
以上、参考までに。^^
この回答への補足
こんにちはmarch4さん。
ありがとうございました。
以下、結果です。
> $arr = "abc\0def";
> //$arr = "abc\0def";をチェック
> echo var_dump($arr);
> echo '<br>';
> echo mb_detect_encoding($arr);
> echo '<br>';
string(7) "abc�def"
UTF-8
> //ポストで受け取った値をチェック
> echo var_dump($_POST["arr"]);
> echo '<br>';
> echo mb_detect_encoding($_POST["arr"]);
> echo '<br>';
string(8) "abc\0def"
UTF-8
ポストされてない方は文字化けしていません。
ということは、ポストされた値は何らかの処理がされていると考えるべきでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Excel(エクセル) excel vbaの配列なんですが・・・ 1 2022/12/26 18:50
- PHP c言語 文字 - '1'+26 3 2022/03/26 20:58
- Visual Basic(VBA) vb.netです。2次元配列の要素をFor Eachでひとつづつ取得したい。 4 2022/07/05 11:30
- C言語・C++・C# c言語 int temp = 0; if(isdigit(arr[i])){ temp=arr[i] 2 2022/03/27 01:44
- C言語・C++・C# int temp = 0; if(isdigit(arr[i])){//文字が数字であれば(0~9) 1 2022/03/27 01:37
- JavaScript 配列の1要素を代入した変数を使って元の配列要素を削除できるか 1 2023/07/28 03:34
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/03/09 10:07
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/03/09 14:24
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Dosブロンプトでtabを出力したい
-
バッチファイルでpingの結果を...
-
shシェルスクリプト 空白行の...
-
変数の中の<br>を消したい
-
phpでcookieがうまく保存されない
-
eとは?
-
syntax error, unexpected 'ech...
-
switch()文で値の大小比較
-
csvの特定のキーワードを指定し...
-
DBのハッシュ化したパスワード...
-
オブジェクトの中身の判定(PHP)
-
明日の18:00から!Amazon cyber...
-
ゼロとNULLを区別して number_f...
-
動的なPHPを静的なhtmlページに...
-
XMLのタグの有無をPHPで判定し...
-
phpにおいて$xを計算式の文字列...
-
Windowsのsetコマンドでの小数...
-
vbsのif文で複数条件の判定
-
php で 20連続ガチャ作成中な...
-
WIN FIXER2005
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Dosブロンプトでtabを出力したい
-
switch()文で値の大小比較
-
バッチファイルでpingの結果を...
-
shシェルスクリプト 空白行の...
-
phpでcookieがうまく保存されない
-
findstrのerrorlevel
-
syntax error, unexpected 'ech...
-
小数点以下0の非表示
-
バッチファイルで、全てのウィ...
-
オブジェクトの中身の判定(PHP)
-
PHPで訪問回数を表示するカウン...
-
ゼロとNULLを区別して number_f...
-
bashの関数の引数にスペースが...
-
ナベアツプログラム(3の倍数...
-
変数の受け渡しによる画像の表示
-
PHP一覧表示した項目にリンクを...
-
Windowsのsetコマンドでの小数...
-
Parse error というエラーの対...
-
pdftkを使った処理をバッチファ...
-
DBのハッシュ化したパスワード...
おすすめ情報