SQLインジェクションについて教えてください。


現在、”基礎からの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>";
}
}
}
?>

回答の条件
  • 1人10回まで
  • 13歳以上
  • 登録:2014/01/28 19:21:28
  • 終了:2014/02/04 19:25:04
id:akakak

質問者から

ak2014/01/28 19:48:00

*http://qiita.com/tabo_purify/items/df8f2aa17094b1a60c82
こちらのサイトの、ひらがな、カタカナ、漢字を許可のpreg_matchを使うのが一般的に日本語のインジェクション対策になりますでしょうか。

回答(3件)

id:tomo_k No.1

tomo_k回答回数426ベストアンサー獲得回数262014/01/28 20:23:18

ポイント34pt

http://www.ipa.go.jp/files/000017320.pdf

上記項番5.3にあるようなプレースホルダを使うのが一般的な方法だと思います。
これは、PHPに限らずたいていの言語においてSQLインジェクション対策で推奨される方法です。

id:akakak

ありがとうございます。
印刷して明日にでも目を通してみます!

2014/01/28 23:02:39
id:tea_cup No.2

tea_cup回答回数1018ベストアンサー獲得回数1822014/01/28 21:23:51

ポイント33pt

PHPとセキュリティの解説書12種類を読んでSQLエスケープの解説状況を調べてみた | 徳丸浩の日記』によると、『基礎からのPHP』には、プレースホルダの説明があるそうなので、確認してください。

 他のSQLインジェクション対策には、インジェクションに使える文字をエスケープする方法がありますが、考慮漏れが発生しやすいのでお勧めできません。

 トリビア:「大垣さん、自分のしたことを分かっていますか?」 - Togetterまとめ

 また、住所をDBに蓄積するなら、住所コードの利用も検討してください。
公益財団法人国土地理協会 -住所マスター-

id:akakak

ありがとうございます。
>インジェクションに使える文字をエスケープする方法
そうらしいですね(#^.^#)ここがあって今回困っています。

■体系的に学ぶ 安全なWebアプリケーションの作り方
■プロになるための PHPプログラミング入門
を購入し、勉強したいと思うのですが、
それだと解決まで時間がかかるため、もう少し回答をいただきたく思います。

今回の質問に対し、ピンポイントで具体的にいただけると幸いです。

2014/01/28 23:19:51
id:taroe No.3

taroe回答回数1099ベストアンサー獲得回数1322014/01/30 15:55:31

ポイント33pt

$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インジェクションです。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません