• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQLインジェクションの対策)

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

このQ&Aのポイント
  • SQLインジェクションの対策について質問があります。もともとのSQL文からエスケープ処理を追加しましたが、phpMyAdminで実行しても同じ結果が取得できてしまいます。他に有効な対策方法はありますか?
  • SQLインジェクションの対策について質問があります。エスケープ処理を追加してもphpMyAdminで同じ結果が取得できます。もっと効果的な対策方法はありますか?
  • 質問です。SQLインジェクションの対策についてエスケープ処理を追加しましたが、phpMyAdminでの実行結果は変わりませんでした。他に対策方法はありますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • smileeeen
  • ベストアンサー率70% (21/30)
回答No.2

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に登録されているレコードを全て取得

wonder_dct
質問者

お礼

smileeeenさん、ご回答ありがとうございます。 仰る通りです。 間違えておりました。 今回は、mysql_real_escape_string()を使ってSQL文を組み立てていこうと思います。 ありがとうございました。

その他の回答 (5)

  • dalianse
  • ベストアンサー率35% (7/20)
回答No.6
wonder_dct
質問者

お礼

dalianseさん、ご回答ありがとうございます。 今回は、mysql_real_escape_string()関数で行いたいと思います。 ご提示いただいたものもとても参考になりますので機会があれば使ってみたいと思います。 ありがとうございました。

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.5
  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.4

http://dev.mysql.com/doc/refman/5.1/ja/type-conversion.html 外部変数を受け取った直後にバリデート、他の処理系に渡す直前にサニタイズ

wonder_dct
質問者

お礼

yuu_xさん、ご回答ありがとうございます。 今回は、mysql_real_escape_string()関数で行いたいと思います。 ご提示いただいたものは、次の機会に使ってみたいと思います。 ありがとうございました。

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.3

とりあえず、俺もやってみて 結果から判断しただけの、アバウトな回答と言う事だけご了承ください。 んで、#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は もしかしたら、最初の数字部分しか見てないのかもしれません。 あとは もっと詳しい人にお願いします。

wonder_dct
質問者

お礼

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)
回答No.1

user IDを単体で関数に掛けているのならそれを調査する関数を作れば良いんじゃないのかな。 正規表現辺りで抜き取れるような簡単な代物だと思うけど・・・(IDだけだし)

wonder_dct
質問者

補足

SAYKAさん、ご回答ありがとうございます。 実際はいろいろなデータに使っているので user_idだけではないです。 説明不足で申し訳ございません。 汎用系のある関数などご存知でしたら ご教示よろしくお願いいたします。

関連するQ&A