- ベストアンサー
SQLインジェクションの対策についての質問
- SQLインジェクションの対策について質問があります。もともとのSQL文からエスケープ処理を追加しましたが、phpMyAdminで実行しても同じ結果が取得できてしまいます。他に有効な対策方法はありますか?
- SQLインジェクションの対策について質問があります。エスケープ処理を追加してもphpMyAdminで同じ結果が取得できます。もっと効果的な対策方法はありますか?
- 質問です。SQLインジェクションの対策についてエスケープ処理を追加しましたが、phpMyAdminでの実行結果は変わりませんでした。他に対策方法はありますか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
mysql_real_escape_string関数を使うのはよいと思います。 >どちらのSQL文も同じ結果が取得できてしまいます。 とありますが、完全に同じ(user_idが10001のものが取得される)なのでしょうか。 気になる点として、テスト用に実行されているSQL文の条件部分が「and」で繋がっています。 こちらを「or」で記述するのが一般的な攻撃手法かと思います。 「and」では結局正常なレコードしか取得できないと思います。 select user_id from table where user_id='10001' and 'a'='a' ⇒user_idが10001の物のみを取得 select user_id from table where user_id='10001' or 'a'='a' ⇒tableに登録されているレコードを全て取得
その他の回答 (5)
- dalianse
- ベストアンサー率35% (7/20)
お礼
dalianseさん、ご回答ありがとうございます。 今回は、mysql_real_escape_string()関数で行いたいと思います。 ご提示いただいたものもとても参考になりますので機会があれば使ってみたいと思います。 ありがとうございました。
- yuu_x
- ベストアンサー率52% (106/202)
- yuu_x
- ベストアンサー率52% (106/202)
http://dev.mysql.com/doc/refman/5.1/ja/type-conversion.html 外部変数を受け取った直後にバリデート、他の処理系に渡す直前にサニタイズ
お礼
yuu_xさん、ご回答ありがとうございます。 今回は、mysql_real_escape_string()関数で行いたいと思います。 ご提示いただいたものは、次の機会に使ってみたいと思います。 ありがとうございました。
- bm_hiro
- ベストアンサー率51% (200/388)
とりあえず、俺もやってみて 結果から判断しただけの、アバウトな回答と言う事だけご了承ください。 んで、#2さん ご指摘の通り、SQLインジェクションの 定石は「' or 1=1--」です。 and 使ったら a=a の意味は 全くありません。 俺も 自分のDB使って そちらがやったようなのを phpMyAdmin で試したら、確かにエラーも出さずに返ってきますね。 んで、次のようなものも 試してみました。 >> select user_id from table where user_id='10001\' ho132ge \'a\'=\'a' phpMyAdmin は 何事もなかったように 普通に 抽出結果を返してくれました。 >> select user_id from table where user_id='10001\更にマルチバイトを入れてみた' phpMyAdmin は こんなのもOKでした。 >> select user_id from table where user_id='10001更にエスケープ文字まで削ったよ' もはや、なんでもありです。 実は phpMyAdmin だけでなく、PHPスクリプトに入れても 普通に 通りました。 多分、user_id は int型か何かだとは思うのですが、MySQLは もしかしたら、最初の数字部分しか見てないのかもしれません。 あとは もっと詳しい人にお願いします。
お礼
bm_hiroさん、ご回答ありがとうございます。 仰る通りです。 記述方法を間違えていました。 select UserID from table where user_id='10001' or 'a'='a' ↑を変更して↓にしたところ1レコードのみ取得できたことが 確認できました。 select UserID from table where user_id='10001\' or \'a\'=\'a' 他にもエラーチェックをかけるなどして対策を行います。 ありがとうございます。
- SAYKA
- ベストアンサー率34% (944/2776)
user IDを単体で関数に掛けているのならそれを調査する関数を作れば良いんじゃないのかな。 正規表現辺りで抜き取れるような簡単な代物だと思うけど・・・(IDだけだし)
補足
SAYKAさん、ご回答ありがとうございます。 実際はいろいろなデータに使っているので user_idだけではないです。 説明不足で申し訳ございません。 汎用系のある関数などご存知でしたら ご教示よろしくお願いいたします。
お礼
smileeeenさん、ご回答ありがとうございます。 仰る通りです。 間違えておりました。 今回は、mysql_real_escape_string()を使ってSQL文を組み立てていこうと思います。 ありがとうございました。