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

kanonbell kanonbell.sky @ gmail.com
2008年 2月 2日 (土) 05:41:01 JST


こんばんは。

正直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 メーリングリストの案内