まとめ ブログ ダウンロード 掲示板 メール

れぶろぐ

< 2008-07-13 (日) 2008-07-20 (日) > 最新


2008-07-15 (火)

ヌルバイト攻撃への対策

以下の記事に対するツッコミ。

で、これをPHPで対処するには下記のコードを使えとある。もちろん他のどのサイトをみてもそうしろと書いてある。

// 終端文字列を空に $v = str_replace( "\0", '', $v );

ただし、このコード、自分が試したPHP4系ではまったくもってスルーされてしまい、例えば値が空の場合を期待するようなコード、

If($v == '' ){ echo 'hello'; }

なんてのは格好の餌食。なぜなら\0が入ってるのでマッチしないから。。。正しく動くコードは下記の通り。

// 終端文字列を空に $v = str_replace( '\0', '', $v );

なんてことはなく、"(ダブルクォーテーション)を'(シングルクォーテーション)に変えるだけなのだけど、PHP5系だと逆の動作になるところがまたややこしい。。。ちなみに、微妙だけどちゃんと空にしているかは下記のコマンドで検証できる。

wget --post-data="v=%00" http://foo.com/bar.php

※ 08/04/28追記 php-5.2.6では'\0'や"\\0"じゃないとマッチしないことを確認。。。

そんなばかな、と思ったので確認してみる。

<?php

$str = "abc\0def";
echo bin2hex($str) . "\n";
echo bin2hex(str_replace("\0", '', $str)) . "\n";

これを実行すると、私のところでは、

61626300646566
616263646566

と表示されて、ちゃんと "\0" で NULL 文字を表せるんですけどねぇ。 (Debian の PHP 4.3.10 と PHP 5.2.6 で確認)

Tags: PHP | このエントリを含む del.icio.us | このエントリを含むはてなブックマーク | このエントリを含む livedoor クリップ | Permalink
本日のリンク元

編集