- ベストアンサー
null除去、これで大丈夫ですか?
function sanitize(&$arg){ if (is_array($arg)){ array_walk_recursive($arg,function(&$val,$key){if(is_string($val))$val=str_replace("\0", "", $val);}); }else{ if(is_string($arg))$arg=str_replace("\0", "", $arg); } return $arg; }
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
「NULL除去」ではなくというよりも「NULLバイト除去」が正しいですね。C言語においてはどちらもほとんど同じものを指しますが、PHPの場合は全くの別物です。 さて、本題に入りますが、まず検索していただきたいのはこちらのキーワードです: 「サニタイズ言うな」 https://www.google.co.jp/webhp?#safe=off&q=%E3%82%B5%E3%83%8B%E3%82%BF%E3%82%A4%E3%82%BA%E8%A8%80%E3%81%86%E3%81%AA 人によってはhtmlspecialchars関数の処理を「sanitize」と呼ぶこともありますし、この呼称は何を指しているのかが分かりにくいので使うべきではないです。私だったら以下のように書くと思います。(ついでにクロージャのキャッシュを利かせます) function strip_nullbytes(&$arg) { ....static $func; ....if (!$func) { ........$func = function (&$val) { ............if (is_string($val)) { ................$val = str_replace("\0", '', $val); ............} ........}; ....} ....if (is_array($arg)) { ........array_walk_recursive($arg, $func); ....} else { ........$func($arg); ....} ....return $arg; } また、「とりあえずNULLバイトを除去しておけば大丈夫?」という曖昧な目的でこの処理を行っている点も問題です。きっと「NULLバイト攻撃」対策ということで採用されたのだと思いますが、実はPHP5以降のほとんどの関数はバイナリセーフです。つまりNULLバイトを含んでいても正しく処理できるということです。 【バイナリセーフでない関数・言語構造】 ・ereg_replace(非推奨) ・eregi(非推奨) ・eregi_replace(非推奨) ・split(非推奨) ・spliti(非推奨) ・include(ファイル名が対象) ・include_once(ファイル名が対象) ・require(ファイル名が対象) ・require_once(ファイル名が対象) ・fopen(ファイル名が対象) ・file_get_contents(ファイル名が対象) ・readfile(ファイル名が対象) ・basename(ファイル名が対象) リストアップしてみると分かると思いますが、NULLバイトを正しく処理出来ない関数は以下の2つのタイプに限られます。 ・PCRE正規表現関数が実装される前に使われていたPOSIX正規表現関数 ・ファイル名をもとにファイルを操作する関数 前者は使わなければいいだけですし、気にすべきは後者だけです。「ユーザ入力をファイル名に対してそのまま使うのは危険」とだけ覚えておきましょう。それ以外のシーンでは一切気にする必要がありません。
お礼
回答ありがとうございます メール送信+記事投稿時のセキュリティー処理なのですが 処理の大半では必要なさそうですね しかしメールの文面のテンプレート呼び出しが ユーザからの受け取りで、よくよく考えてみたらincludeでした、危ない 規定のテンプレートの中に名前が一致するものがない場合 処理を切るようにしようと思います