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

SQLインジェクションとは?ハッカーのテクニックを理解しよう

このQ&Aのポイント
  • SQLインジェクションとは、バリデートされていないフォームに悪意のあるSQLコードを挿入する攻撃手法です。
  • この攻撃を利用すると、不正なデータベースクエリが実行される可能性があります。
  • SQLインジェクションの対策方法や事例、予防策をまとめた分かりやすいサイトを紹介します。

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

  • ベストアンサー
回答No.2

通常、ログイン画面だと、IDとパスワードを入力してログインボタンを押すようなものを作成すると思います。 そして、DBにIDとパスワードの情報が入っていた場合、 単純に、 「select * from users where id='xxxx' AND pass='xxxx'」 を検索して、データが存在していたらログインさせる、という処理になります。 その際に、inputタグの中のID項目に「hogehoge」、パスワードの項目に「' OR 'A'='A」 と入力すると、 「select * from users where id='hogehoge' AND pass='' OR 'A'='A'」 となります。コレを検索すると usersテーブルのidが「hogehoge」でかつ、passが「(空)」か、又は、「A」という文字列が「A」であった場合の全てを検索する、となります。 そうすると、どんなIDでどんなパスワードでもログイン出来てしまいます。 >インジェクションする人もある程度予想立てて これについてはまったくその通りですが、一般的に、ユーザが入力を行ってSQL文でその入力したものを検出するときは、たいていwhere句の中の値になりますので、簡単に予測はつくのではないかと思います。 商品検索ページの場合でも、 INPUTタグの入力項目に検索した値「ほげ」を入力した場合でも 「select * from items where name like '%ほげ%'」 とかとなると思いますが、これも検索値を「a' OR 'B' = 'B' OR 'A' = ' 」 とでもすれば 「select * from items where name like '%a' OR 'B' = 'B' OR 'A' = '%'」 となるので、 itemsテーブルの中のnameに「a」が含まれているか、または「B」が「B」であるか、又は「A」が「%」である項目全てを検出 となるので、itemsテーブルに含まれる全てが検索されてきます。

apache2009
質問者

お礼

ありがとうございます!! とてもよく分かりました!!

その他の回答 (2)

  • tom233
  • ベストアンサー率17% (61/352)
回答No.3

>インジェクションする人もある程度予想立てて(SQL文とか入力する値は変数のどの値になるのか)行わないと成功しないということでしょうか? 予測もだけどあれしてこれしてって順を追って攻撃してくるのでしょう。 手っ取り早くPOST/GET(セキュリティー的にこの場合はGETはあまり使わないでしょうけど)で渡す値に「' OR 'A'='A」を入れた置けば $_GET('パスワード')の値が「' OR 'A'='A」だして それをエスケープ処理もしないでSQL文を構築すれば後は想像できると思います。

  • tom233
  • ベストアンサー率17% (61/352)
回答No.1

たぶん質問者は http://www.atmarkit.co.jp/fsecurity/column/ueno/42.html を見ての質問でしょうけど OR 'A'='A'の意味は理解できるのか? ORと'A'='A'のそれぞれの意味は理解できるのか? これはSQL以前にPHPのifの条件と同じです。(ただしphpの場合の=の使い方が違いますが)

apache2009
質問者

補足

ありがとうございます。 >これはSQL以前にPHPのifの条件と同じです。 冷静に考えれば条件でパスワードが一致するか、もしくは、Aの値がAという意味でOR 'A'='A'にしてたわけですね。。。別に OR 'B'='B'でもいいわけですよね。 参考にしてたサイトは確かに、 http://www.atmarkit.co.jp/fsecurity/column/ueno/42.html ですが、 この場合って、uidにuenoが入っている条件でかつSQL文も変数はなんでもいいんですが、 SELECT * FROM user WHERE uid='$uid' AND pwd='$pwd' というSQL文じゃないと通用しないと思いますが、どうでしょうか。 インジェクションする人もある程度予想立てて(SQL文とか入力する値は変数のどの値になるのか)行わないと成功しないということでしょうか?

関連するQ&A