現在、”基礎からのPHP”という著書でPHPを学んでおります。
【質問】
以下の記述では、banのデータ型であるint以外は受けつけないとあります。
さらに、preg_matchを使い攻撃に対して防御しているのがわかります。
しかし、
今回私が作っているサイトが、フォームから数字ではなく、日本語(varchar)
例) 札幌、東京、神奈川 (ホワイトリストでと考えましたが、これらの単語が2000近くあり現実的ではない??)
といった内容を入れる場合どのように記述すれば安全でしょうか。
日本語のインジェクション対策がネット上で見つけれなかったので質問です。
<?php
$b = htmlspecialchars($_POST['a'],ENT_QUOTES);
if (preg_match("/[^0-9]/", $b)){
print "数字以外は入れないで";
}else{
$db = new PDO("mysql:host=localhost;dbname=db", "root", "1234");
$ps = $db->prepare("SELECT * FROM tb2 WHERE ban=:A");
$ps->bindParam(":A", $a);
$ps->execute();
if ($ps->rowCount() != 0){
while($i=$ps->fetch()){
print $i[0].$i[1]."<BR>";
}
}
}
?>
*http://qiita.com/tabo_purify/items/df8f2aa17094b1a60c82
こちらのサイトの、ひらがな、カタカナ、漢字を許可のpreg_matchを使うのが一般的に日本語のインジェクション対策になりますでしょうか。
http://www.ipa.go.jp/files/000017320.pdf
上記項番5.3にあるようなプレースホルダを使うのが一般的な方法だと思います。
これは、PHPに限らずたいていの言語においてSQLインジェクション対策で推奨される方法です。
『PHPとセキュリティの解説書12種類を読んでSQLエスケープの解説状況を調べてみた | 徳丸浩の日記』によると、『基礎からのPHP』には、プレースホルダの説明があるそうなので、確認してください。
他のSQLインジェクション対策には、インジェクションに使える文字をエスケープする方法がありますが、考慮漏れが発生しやすいのでお勧めできません。
トリビア:「大垣さん、自分のしたことを分かっていますか?」 - Togetterまとめ
また、住所をDBに蓄積するなら、住所コードの利用も検討してください。
公益財団法人国土地理協会 -住所マスター-
ありがとうございます。
>インジェクションに使える文字をエスケープする方法
そうらしいですね(#^.^#)ここがあって今回困っています。
■体系的に学ぶ 安全なWebアプリケーションの作り方
■プロになるための PHPプログラミング入門
を購入し、勉強したいと思うのですが、
それだと解決まで時間がかかるため、もう少し回答をいただきたく思います。
今回の質問に対し、ピンポイントで具体的にいただけると幸いです。
$db = new PDO("mysql:host=localhost;dbname=db", "root", "1234");
$ps = $db->prepare("SELECT * FROM tb2 WHERE ban=:A");
$ps->bindParam(":A", $a);
パラメータクエリを使用する場合は、この場所では「SQLインジェクション」関係の処理は必要ないです。
パラメータクエリを使わずに、SQL文を文字列で組み立てる場合に、
’
”
;
変数内に、この手の文字などが使われてると、別のSQLにすることが可能なので、その対策などをしないとダメだというのが、SQLインジェクションです。
ありがとうございます。
2014/01/28 23:02:39印刷して明日にでも目を通してみます!