ネタもと:なぜこうもレビューされてないコードを記事に書く?(がるの健忘録)より
ん、、、すごいです。この、勘違い、すごすぎます。おもしろいネタをありがとう>がるさん
えと、なんか、ネタの元ネタ、注記が入っています。それでも、だからこそ、ネタにする・・・ネタができた。
わずか数行で"ものすごいテーブル"に! - jQueryプラグイン「Flexigrid」(マイコミジャーナル)より:
ここではPHPを使用し、MySQLから郵便番号データを取り出してJSON形式で返すサンプルファイルを作成してみた。
function sanitizeTag($var)
{
if ( is_array($var) )
{
$var = array_map("sanitizeTag", $var);
}
else
{
$var = htmlspecialchars(trim($var));
}
return $var;
}
$postdata = sanitizeTag($_POST);
(以下略)
で、この、sanitizeTag 関数を通したものを、MySQL に、文字連結で渡している、と。
なんていうか。。。だからさぁ、「サニタイズ」という言葉だけで括るのやめようよ。
がるさんところに書いてあるように、また、注記が入っているように、この sanitizeTag 関数は、HTML に出力するためにはサニタイズしているけど、SQL としてはサニタイズしていない。単に「入力は、サニタイズしてから使う」などというから、こういう間違いをする。また、HTML としてのサニタイズも、おそらく不完全(なんだよね?>がるさん)。
「サニタイズ」は、使う対象に対して、使う直前に行う必要があります。もう一度書きますよ。「サニタイズ」は、使う対象に対して、使う直前に行う必要があります。
また、最近は「ハンガリアン使うな」が言われ出していますが、これ、正しくは、「型によるハンガリアン(システム ハンガリアン)使うな」です。そうではなく、変数の目的によるハンガリアン(アプリケーション ハンガリアン)は、大いに使うべきです。
変数 $postdata
を、アプリケーション ハンガリアンによって改名してみます。たとえば、$htmlEscapedPostdata
だったら。こうしておけば、HTML に対しては比較的安全に出力できるが、SQL に対しては安全ではないことがわかるでしょう。もちろん、「HtmlEscaped」だと長いので、適切に短くするのは可。ただし、ルールを決めて、そのルールを守りましょう。このように、アプリケーション ハンガリアンで変数を記述しておけば、「使う直前に」サニタイズすることの必要性は薄れます。
もっとも、この「使う直前」の元々の意味は、「ウェブアプリケーションで、ユーザ入力をサニタイズして、ユーザに確認させる画面に送付し、確認画面から戻ってきたものを使う」事に対する警告なので、ここで書いたこととは意味が違います。
投稿日時 : 2008年7月6日 16:54