ここから本文です

SQLインジェクションの対策について。

mon********さん

2010/3/2922:04:28

SQLインジェクションの対策について。

$_POST['value']をSQL構文にそのまま入れてはいけないようですが、例えば

$a = htmlspecialchars($_POST['value'])

をしてからなら大丈夫でしょうか。

$sql = $db->exec("SELECT * From a where youso LIKE '%$a%' ");

という形を作りたいです。

ちなみにPDOのSQLインジェクション対策でやろうとして

$sql = $db->prepare("SELECT * From a where youso LIKE '%:a%' ");
$sql->BindValue( ':a' , $_POST['value'] )
$sql->execute()

という形を取ったのですが、 '%:a%' の部分をうまく読み込んでくれないようです・・(シングルクォーテーションで囲っているから?)




質問をまとめます。

$a = $_POST['value']
$sql = $db->exec("SELECT * From a where youso LIKE '%$a%' ");

を対策するには、どうすればよいのでしょうか。(bindValueは使えないようだが、htmlspecialcharsでいいのかどうか、だめならばどうすればよいのか。)

よろしくお願いします。

閲覧数:
1,080
回答数:
1
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

とーさんさん

編集あり2010/3/2922:22:51

htmlspecialchars は<script>などの有害なタグを埋め込まれないように無害化するために使用します。
SQLインジェクションはPOSTされた値を使ってSQL文を組み立てたときに、意図したSQLとは違う有害な動作を引き起こさせるもので、この対策では防御できません。

この例の場合はSELECTなので、万が一意図していない条件に書き替えられたとしても実害は少ないですが、DELETE,INSERT,UPDATEで条件が書き換わるとデータが破損してしまいます。
一口にサニタイズと言ってもこのように色々なものがあって、どの部分の脆弱性に対して無害化しているかというのを認識して使う必要があります。

これで万全というような具体的な対応策を書くことはできませんが、SQLインジェクションの例を検索して色々なパターンを知ることが近道だと思います。

質問した人からのコメント

2010/3/30 00:00:47

感謝 なるほど、調べてみるとMySQLならhtmlspecialcharsではなくmysql_escape_stringを使えばサニタイズできるようですね。参考になりました

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる