htmlspecialchars($_GET['text']);とかを普通にやっちゃう(しかも、それがゆえに初心者に優しいとかされてる)環境で安全なソフトウェアを書くのは、他の言語に比べて大変困難であろう。(Matzにっき(2008-01-29))
id:fuktommy
何が問題なのか、わからん。
id:rna
なにがまずいのかわからない。/バイナリ食わすとヤバイって話?/入出力を安易に直結しやすいのが問題?
taintされた文字列をそのまま出力するなんて、考えられへん!
RubyやPerlでは外部から入力された文字列にtaint(汚染)と呼ばれるマークがつく。taintされた文字列から加工された文字列にもtaintがつく。これをチェックすることで外部からの入力をチェック(サニタイズ)しないまま危険な操作(ファイル名にする、systemを呼び出す、HTML/SQLに埋めこむ、など)を禁止することができる。
外部から入力された$_GET['text']を チェックしないままhtmlspecialcharsで出力するのは危険。考えられへん!
<?php if (!mb_check_encoding($var, $encoding)) { throw new Exception('invalid encoding'); } ?> <p><?php echo htmlspecialchars($var); ?></p>
URL出力時には、「http://」または「https://」で始まることをチェックする必要があります(『安全なウェブサイトの作り方 改訂第3版』23頁)。
script要素やイベントハンドラ、style要素/属性などの内容も動的出力を避けるべきです(完全なエスケープが難しいため)。
外部から入力された文字列だろうが、自分で組み立てた文字列だろうが、たとえばURL出力時にはスキームのチェックが必要なはずです。
それは、不正文字エンコーディングのチェックについても同じです。taint か untaint かを問わず、行われなければなりません。
(゚⊿゚)イラネ
以上
ありがとうございました!