読者です 読者をやめる 読者になる 読者になる

肉とビールとパンケーキ by @sotarok

少し大人になった「肉とご飯と甘いもの」

サニタイズかバリデートか

PHP

id:elfさん経由なんですが。そしてもうだいぶまとまってきているのに無粋な・・・というカンジもしますが。

サニタイズかバリデートか

$month  = $_POST{'month'};      //月を受け取る
$day    = $_POST{'day'};        //日を受け取る
  ↓ XSS対策
$month  = htmlspecialchars($_POST{'month'});    //月を受け取る
$day    = htmlspecialchars($_POST{'day'});      //日を受け取る

コメント欄

よっくん 08-01-07 (月) 13:52

この場合、htmlspecialchars()よりも、それぞれ半角数字でかつ1〜12、1〜31のみ認める処理にしたほうが良いと思います。

masayashi.com

バリデートとサニタイズの違いですね。
毒が入ってきていることを前提に、出力時*1にその毒を抜くのがサニタイズ、バリデートはそもそも毒を入れませんということです。
この場合、入力値に制限をかけずに出力時にhtmlsp(ry *2 をするのがサニタイズで、入力値に制限 *3 をかけるのがバリデート。(もちろん、バリデートしたからといって、完全に安全だとは考えてはいけません。DB(MySQL)に入れるならmysql_real_escape_stringするとかね。)

入力時にhtmls(ryしないで出力時にする

コメント欄

masayashi 08-01-07 (月) 23:39

>yoggyさん
SBMコメントですが、ここでお返事したいと思います。

どちらかというと出力時にhtmlspecialchars()するのが正解のような気がする…w

ありがとう!
まだどういうのかスタンダードな記述なのかわからないので、こういう意見は助かります。

それから、入力時にhtm(ry するのではなく、出力時のほうが良いよ、というのは、例えば入力値にht(ry してしまうと、そのデータをDBに突っ込むときには既にh(ry *4された値が入ってしまうと、そのデータを出力するときに2重エスケープされたりとか、そういう思わぬことが起こったりもします(2重エスケープ程度ならいいですが。。って今もっと危ない例が思い浮かばない)。
要は、どのタイミングでhして、っていうのをあらかじめポリシーとして決めておけば問題は起こらないのですが、そこかしこでhすると、「あれ?この値はしたんだっけ?」みたいなことになりかねないし、したり戻したりをするのはスマートじゃないよね、というお話です。

自分の思いもしないような攻撃を受ける可能性

よっくん 08-01-08 (火) 18:21

確かに、僕は、「もしかしたら、自分には到底思いつかないような攻撃をされるかも知れない・・・」と、必要以上の処理をしてしまってるかも知れません(笑)

ただ、受け取る時に一回処理をするだけなので、ものすごく多い回数行わなければならない状態ってあんまり無いのでは・・・・?

ウェブアプリを作る人は、「自分の思いもしないような攻撃を受ける可能性」があることを常にされることを想定して作らなければ頭に入れておかなければならないと、私は思っています。
使う人が、ただ一人!作った人だけ!しかもローカル内だけで使われる!というならとやかくは言いませんが、XSSの怖いところはそのアプリを作った人ではなく、使う人が被害にあう可能性のある点です。
しかもその攻撃の踏み台にされていることにもしかしたら作った人は気づけないかもしれません。
「では、あなたの作ったアプリを踏み台として、あなたの知らない人が知らないところで攻撃をうけていたとき、あなたは責任を取れますか?」という問題なのですね。

キャンペーン効果

サニタイズってそういえばここ1年くらいで全然きかなくなったなーと昨日つぶやいたら、

バリデートとサニタイズの問題。そういやサニタイズって聞かなくなったなw

Twitter / sotarok: バリデートとサニタイズの問題。そういやサニタイズって聞かなく ...

@sotarok キャンペーン効果ですね

Twitter / riaf: @sotarok キャンペーン効果ですね ...

と。そういえばそんなキャンペーンあったな、と思い出しましたので、
高木浩光@自宅の日記 - 続・「サニタイズ言うなキャンペーン」とは
こちらもあわせて読んでおくと良いかもしれません。(笑)

まぁ実際には、フレームワーク自体が、標準で入力値のバリデート機能を持ち合わせるものが多くなっているし、フレームワークを使う人も多くなっているから、という現状もあるのだと思いますが。



なんか抜けてることがあるかもしれませんが…このへんでw



(修正)想定はできねぇだろという話だそうなので、まぁそりゃそうだということで言葉を変更。そしてなんか日本語が破綻してたのでその辺も修正。。

*1:WEBに対する出力や、DBに対する出力、ようするにスクリプトから、値が出る瞬間

*2:なげえ関数名

*3:'day' => '/[0-9]{2}/' みたいな

*4:ちなみにたしかCakePHPではhtmlspecialcharsのエイリアスでhという関数が用意されていたりしますよね。