人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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>";
}
}
}
?>


●質問者: ak
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

質問者から

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


1 ● tomo_k
●34ポイント

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

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


akさんのコメント
ありがとうございます。 印刷して明日にでも目を通してみます!

2 ● tea_cup
●33ポイント

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

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

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

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


akさんのコメント
ありがとうございます。 >インジェクションに使える文字をエスケープする方法 そうらしいですね(#^.^#)ここがあって今回困っています。 ■体系的に学ぶ 安全なWebアプリケーションの作り方 ■プロになるための PHPプログラミング入門 を購入し、勉強したいと思うのですが、 それだと解決まで時間がかかるため、もう少し回答をいただきたく思います。 今回の質問に対し、ピンポイントで具体的にいただけると幸いです。

3 ● taroe
●33ポイント

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

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ