例えば、PHPを避けたくなった
これは勉強になりました。
特に下記の点。
- preg_replaceの第一引数がバイナリセーフでないこと
- e修飾子というものがあること
- 文字列リテラル内で関数が実行できること
2と3については、まず使わないから良いとして、問題は1です。これを「知らなかった」といってしまって良いのかどうか微妙な気もしますが、嘘をついても仕方がない。
いわゆるNULLバイト攻撃を防ぐため、バイナリセーフでない関数を実行する際には、NUL文字を削除するなり、その時点で処理を中断するなりの処理が必要だと認識しています。「PHP と Web アプリケーションのセキュリティについてのメモ」にあるような対処方法では、たとえば外部APIからのレスポンス値やDBの保存値なんかが漏れてしまいます。
そのためにはどの関数がバイナリセーフなのか把握しなければなりません、が、これもきつい話です。バージョンによって、同じ関数がバイナリセーフだったりそうじゃなかったりしますし。いっそ、PHPの全関数を呼び出す際に上記のチェックを行うことにしようか。でもパフォーマンスが落ちるしな…。
まつもとゆきひろさんは下記のように書かれています。
っていうか、バイナリセーフ関数とそうでない関数があるって必然性そのものが理解できないんだけど。ちょっと手抜きすぎじゃないかと。
Matzにっき(2008-01-25)
いや、もちろんC文字列を経由しないと呼び出せないものがあって、たとえばファイルパスとかにNUL文字が入れられないのはわかる。しかし、それだってできる限りちゃんとチェックして、 NULが入ってたらエラーにするとか、するもんじゃないの?
PHPがそういう実装になったら助かるなあ。パッチを書けばよいのだろうけど、自分の能力を超えているし、Rubyなら実装済みの話でもあるし…。
PHPerの方々がこうした問題についてどうお考えなのか、聞いてみたい。