何となく Blog by Jitta
Microsoft .NET 考

目次

Blog 利用状況
  • 投稿数 - 761
  • 記事 - 18
  • コメント - 24471
  • トラックバック - 222
ニュース
  • IE7以前では、表示がおかしい。div の解釈に問題があるようだ。
    IE8の場合は、「互換」表示を OFF にしてください。
  • 検索エンジンで来られた方へ:
    お望みの情報は見つかりましたか? よろしければ、コメント欄にどのような情報を探していたのか、ご記入ください。
It's ME!
  • はなおか じった
  • 世界遺産の近くに住んでます。
  • Microsoft MVP for Visual Developer ASP/ASP.NET 10, 2004 - 9, 2011
広告

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

その他

わんくま同盟

同郷

 

ネタもと:なぜこうもレビューされてないコードを記事に書く?(がるの健忘録)より

ん、、、すごいです。この、勘違い、すごすぎます。おもしろいネタをありがとう>がるさん

えと、なんか、ネタの元ネタ、注記が入っています。それでも、だからこそ、ネタにする・・・ネタができた。

わずか数行で"ものすごいテーブル"に! - 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
コメント
  • # サニタイズとハンガリアンとヒューマンエラーとアスペクト指向
    凪瀬 Blog
    Posted @ 2008/07/06 18:34
    サニタイズとハンガリアンとヒューマンエラーとアスペクト指向
  • # re: 「サニタイズいうな」と「ハンガリアン」
    がる
    Posted @ 2008/07/06 21:41
    やほです~。
    ………わ~いまともな会話ができる(号泣

    おいといて。

    んと。はいHTMLとしてのエスケープ処理も不完全です。
    …いやまぁそも「その関数仕様ってどうなのさ」って気はひしひしとするのですが。
    htmlspecialcharsという関数は、困ったチャンなことに「シングルクォートを無視する」習性があるです。
    ちなみに、にたよ~な関数にhtmlentitiesってのがあるのですが。…何が違うのか、マニュアル( http://jp2.php.net/manual/ja/function.htmlentities.php )読んだだけだとかなり不明です(正解は「エスケープ範囲がhtmlspecialcharsより広い」なのですが…あのマニュアル読んでもわからんですがな)。

    んでもって。
    いやまぁ随所で言われているとおり。「サニタイズ」とかいう言葉でくくるから、HTML出力用エスケープ処理とSQL文用エスケープ処理を混ぜるです。混ぜたら危険なのに。

    アプリケーションハンガリアン的に「htmlEscaped」は概ね賛成。賛成しないのは、個人的な好みで「html_escapedのほうが好き」ってところだけ(笑
    おいら的には。長くてもこのまんまのほうが安全な気はするですけどね。

    でも。この変数名なら、アプリケーションハンガリアンなら、もう少し多くの人(include 筆者)が「SQLでこの変数(==エスケープ処理されたデータ)使うのなんかおかしくね?」って気づくと思うんですがねぇ。
    なんていうか…残念。

    ちなみに。凪瀬さんはここに「アスペクト指向」を入れてますが。
    おいら的にはここに「随所に関所( http://d.hatena.ne.jp/gallu/20080225/p1 )」ながるパタをお勧めしてみたいです(笑
    したら。SQL文を「作る」ところとテンプレートエンジンに変数を「渡す」ところと。各一箇所だもん間違えないでしょ?

    むぅちょいと長くなってしまいましたが。
  • # re: 「サニタイズいうな」と「ハンガリアン」
    Jitta
    Posted @ 2008/07/06 23:57
    がるさん、コメントありがとうございます。

    > 個人的な好みで「html_escapedのほうが好き」ってところだけ(笑
    Camel とか Pascal とか、難しいです...
    N60-BASIC なおいらは、「変数は2文字」です...嘘です。

    昔、書いたように(http://blogs.wankuma.com/jitta/archive/2006/01/24/20817.aspx)、注記の「本サンプルはFlexigridの使用法を示すことに主眼を置いたものであり、セキュリティの観点からは不十分な点も存在するので注意していただきたい。」「このあたりの詳細については、改めて解説する予定だ。」は、気に入らない。次の連載を読まなかったらどうするんだ?!
    2年経っているのですが、「貧民プログラム解説者」が、蔓延しているのですね。
タイトル  
名前  
Url
コメント