2008年2月 2日

[PHP-users 33230] Re:SQLインジェクションの可能性

こんばんは。

正直htmlspecialcharsをDBのエスケープに使うって考え方は新鮮ですが。。

DBの場合、エスケープする必要があると言われるメタ文字は
「';-」あたりかな。
シングルクォーテーションとセミコロンとハイフン。
他のDBだったら関係ないかもですが、MSSQLでは%と[も(]は平気だったかな?)

エスケープが必要です。

悪魔の証明って知ってますよね。若干異なりますが、SQLインジェクションの可能性が
あることの証明と、ないことの証明、どっちが簡単でしょう?
無いと思っても、それは「有る」ケースに思い至ってないだけかもしれません。

htmlspecialcharsでSQLインジェクションの可能性がないという自信がないのに、それで
エスケープ処理を代用しようってのはちょっと考え方の方向性が違う気がします。
エスケープ漏れや、不正なマルチバイト文字を利用したエスケープの回避などが原因で
SQLインジェクションの脆弱性が発生すると思うので、ちゃんとした手法でエスケープ
してください。

対策が確立してるんだし、一番確実と言われる方法が普通に使えるんだから、
問題がないかの検討が必要な別のやり方使うのはやめましょうよ。。


> $query = "SELECT * FROM table1 WHERE userID= '$val'";

$valを自前でエスケープしてアドホッククエリを書くのではなく、成田さんが
仰るようにPrepared Statementを使いましょう。
MSSQLの場合はエスケープ関数は用意されていないようですから。
(PDOがどうかは知りませんが)DBライブラリを使う場合、エミュレーション
してるだけでちゃんとPrepared Statementしていなかったり、また
その自前のエスケープ処理に不備があったりするので注意が必要
ですけどね。。

> $val=htmlspecialchars($_POST['input'],ENT_QUOTES,'SJIS');

あと、これも定石ですが、htmlspecialcharsはHTML出力の直前に
かけるようにしてください。
頭っからエスケープしたり、その値をDBに突っ込んだりすると、作った
直後は良くてもそのうち面倒なことになりかねないので。
_______________________________________________
PHP-users mailing list PHP-users@xxxxx
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3

投稿者 xml-rpc : 2008年2月 2日 05:41
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/69342
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。