きもちわるい(重箱的な意味で

TeXをWebで - TeX Wiki
で紹介されているdo.php
いやいや……プログラム名にhtmlspecialcharsって……
そのあと文字列定数と比較して*1から実行してるから問題はないけど、それを期待するなら、ここでhtmlspecialcharsする必要もない。エスケープしたいなら、この場合の用途としてはescapeshellcmdの方が正しい……と思う。
なんでHTML出力しないものにhtmlspecialcharsしてしまうか、というと、やはりサニタイズ病というか、とりあえず入力値はhtmlspecialcharsでエスケープしとけ、的なよくわからないしきたりがPHP界にかつてあったからだろう(今でもあるのかな)。


個人的に、エスケープはクリティカルな処理の直前に行なうのが望ましいと思っている。
htmlspecialcharsは出力する直前。
MDB2::escapeはsqlに埋め込む直前*2
そしてescapeshellcmdはpopenやsystemの直前に。
未加工の状態の方がデータをいじりやすいというのもあるし、ちゃんとエスケープされてるのかパッと見てわかるから、このようにしている。


このプログラムが脆弱だ、とかいうわけではないんだけど、なんとなくキモチワルイというだけ。

*1:これも数値との比較だとマズかったり

*2:そもそもストアドプロシージャ使えって話ではある。