PHPにて$_POST等のNULLバイト対策をしたいのですが、

function sanitize ($arr)
{
if (is_array($arr))
{
return array_map('sanitize', $arr);
}
if (preg_match('/\0/', $arr))
{
die('不正な入力です');
}
return str_replace('\0', '', $arr);
}
本に載っていた上記の関数にて
$_POST = sanitize($_POST);
としても、例えば$_POST['name']に
hogetarou\0<script>とかhogetaarou\x00<script>とか送っても、普通にそのままブラウザに出ます。
チェックされずに(die()されずに)通ってしまうのですが、これではダメなのでしょうか?
それともそもそも自分の指定方法がNULLバイト攻撃のようになっていないのでしょうか?
改善方法、または皆さんのNULLバイト対策法を教えていただきたいのですが。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/11/02 15:20:35
  • 終了:2011/11/09 15:25:04

回答(1件)

id:taknt No.1

きゃづみぃ回答回数13481ベストアンサー獲得回数11982011/11/02 15:46:28

http://www.nekomanma.jp/room/php/validation.php#index_null

エスケープ解除をしてあげないとダメなのかもしれませんね。

id:supersudo

ご返信ありがとうございます。

ごめんなさい、肝心な事を書き忘れておりました。

5.3.8です。

2011/11/02 16:30:45
id:supersudo

もう一つ書いておきます。

centOS6で、Apacheは2.2の最新をソースコードから入れております。

2011/11/02 16:32:08
  • id:rouge_2008
    > それともそもそも自分の指定方法がNULLバイト攻撃のようになっていないのでしょうか?

    普通にフォームに入力してそのまま送信しているのでしょうか?
    文字列として送信されているので、NULLバイトとして受け取っていないと思います。

    takntさんの回答のリンク先にあるようにGETで「***.php?name=yujinTODO&email=user@example.jp%00%09%0AEmail」のようなURLで試すか、あるいはテスト用に次の2行を「$_POST = sanitize($_POST);」の前に追加してそれぞれ確認してみてください。


    // Null文字を含まないデータ
    $_POST['text'] = urldecode("%54%68%69%73%20%69%73%20%74%65%73%74%20%74%65%78%74%2e%20%26%49%74%27%73%20%6e%75%6c%6c%2e%20%20");
    print_r($_POST);



    // Null文字を含むデータ
    $_POST['text'] = urldecode("%54%68%69%73%20%69%73%20%74%65%73%74%20%74%65%78%74%2e%20%00%49%74%27%73%20%6e%75%6c%6c%2e%20%20");
    print_r($_POST);


    ※Null文字を含むデータでは、「不正な入力です」と表示されます。(確認終了したら上記の記述は削除して置いてください。)


    ・アスキーコードの16進数
    http://ja.wikipedia.org/wiki/ASCII

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません