• ベストアンサー

SQLインジェクションについて

デリケートな質問なのですが、お願いします。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1778333 上記のような項目も見たのですが、イマイチ理解出来ません。 現在3年目のPGです。 業務で必要なので調べている所なのですが、実例が無く (当然かもしれませんが・・・) イマイチしっくり来ません。 ○○.comで起こったと聞いています。 例えばログイン画面で ID:[abcd] PW:[1234] と仮定して。 きっとサーバ側で select * from USER_TABLE where ID=引数.ID and PW=引数.PW みたいな形で必要な物を取り出しているのかな? と思っています。 この引数にOR文が入るようにしたりして本来取り出せないはずの、 項目を取り出したりしているのでしょうか? どこまでが質問出来て、回答を貰えるのかが微妙ですが、 ご存知の方いらっしゃいましたらお願いします。 間違いもありましたら指摘して頂けると幸いです。

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

  • ベストアンサー
  • galluda
  • ベストアンサー率35% (440/1242)
回答No.3

がると申します。 ものすごく簡単に状況を整理して見ます。 例えば、おっしゃっている ID:[abcd] PW:[1234] の場合(上述はいずれもFORMからの入力データ)。 SQLは select * from USER_TABLE where ID='abcd' and PW='1234' となるかと思います(上述のSQLが好ましいかどうかはまた別問題として)。 で、悪意ある攻撃者は、例えばこのように入力をします。 ID:[' or 1=1;'\0'] PW:[1234] ('\0'は、いわゆるナル文字) SQLを組み立ててみます。 select * from USER_TABLE where ID='' or 1=1;'\0' and PW='1234' 分かりやすいところで改行すると select * from USER_TABLE where ID='' or 1=1; '\0' and PW='1234' となります。で、実際にはIDのところに「ログインしたい任意のID」を併記すれば、そのIDのパスワードを知らなくても簡単にログインができます。 と、これは「ログインを横取りしている」ケースで。無論十二分に困るのですが。 これが、INSERT、UPDATEで似たようなことをされると、より一層の問題が発生します。 (まぁ「不正に閲覧される」と「改竄される」のどちらがより深刻なのかは難しいところですが) こんな感じで説明になりますでしょうか?

BakuSunshin
質問者

お礼

お礼が遅くなってしまい申し訳ありません。 ご回答ありがとうございます。 >実際にはIDのところに「ログインしたい任意のID」を併記すれば、そのIDのパスワードを知らなくても簡単にログインができます。 なるほど!理解できます。 そういう事も含めて、期待しない値が入ってきた際にはハネるようにしなくてはいけないわけですね。 >こんな感じで説明になりますでしょうか? 解りやすい回答ありがとうございました。

その他の回答 (2)

noname#24096
noname#24096
回答No.2
BakuSunshin
質問者

お礼

お礼が遅くなってしまい申し訳ありません。 ご回答ありがとうございます。 1番目のサイトが解りやすかったです。 ご回答ありがとうございました。

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.1

ページ数は多いですが、↓に詳しくわかりやすく説明されています。 お気に入りに入れておいて損はありません。 必要な所だけ拾い読みして下さい。 私は全部(数100ページ)印刷して読みました。 何しろ情報セキュリティの総元締めのIPAが出しているだけのことはあります。

参考URL:
http://www.ipa.go.jp/security/awareness/vendor/programming/
BakuSunshin
質問者

お礼

お礼が遅くなってしまい申し訳ありません。 ご回答ありがとうございます。 これはかなり役に立ちますね、 実装レベルで記述されているのが助かります。 ありがとうございました。

関連するQ&A

  • SQLインジェクションの対策

    SQLインジェクションの対策 いつもお世話になっております。 SQLインジェクションの対策についてお伺いいたします。 もともと↓のようなSQL文だったものを "select user_id from table where user_id='{$user_id}'" 以下のように変更しました。 "select user_id from table where user_id='" . mysql_real_escape_string($user_id) . "'" 以下のように実行されていたSQL文は select user_idfrom table where user_id='10001' and 'a'='a' ↓のようにエスケープ処理して実行されるようになりました。(入力値は「10001' and 'a'='a」) select user_id from table where user_id='10001\' and \'a\'=\'a' ですが、phpMyAdminで実行してみるとどちらのSQL文も同じ結果が取得できてしまいます。 これでは対策になっていないと思ったので、質問させていただきました。 (magic_quotes_gpcはoffに設定しています。) なにか他の方法がいいのでしょうか。 ご教示よろしくお願いいたします。 <環境> PHP 5.1.6 MySQL 5.0.45

    • ベストアンサー
    • PHP
  • SQLインジェクション

    教えてください。 よろしくお願いいたします。 SELECT * FROM table WHERE user='$uid' AND password='$pass' のエスケープ処理をしていない場合に、 ID=aaa パスワード='or'a'='a と入力されると、 SELECT * FROM table WHERE user='aaa' AND password="or 'a'='a' が実行されてしまいますが、 「password=」と「or」の間のダブルクォーティションは、 どのような意味を持つのでしょうか。

  • このSQL文の意味を教えてください。

    SQL勉強中の者です。このSQL文の意味を教えてください。 SELECT A.* FROM table AS A, table AS B WHERE A.id *= B.id AND A.flag = 1 tableにAとBという別名をつけて、Aの全ての項目を抽出しているというところまでは分かりました。 分からないのは「WHERE A.id *= B.id」の部分です。ただの「=」なら分かりますが「*=」って何ですか? あと、AとBのテーブルが同じなのですが、同じテーブルを2つ並べている意味がよく分かりません。 よろしくお願いします。

  • select されたレコードの操作

    以下のようなuser_idとuser_pwのtableがあります。 |id(ai)|user_id|user_pw|flg| |1|AAA|111|0| |2|BBB|222|0| select id from table where user_id = AAA をされると 1 を返し、 update table set flg = 1 where id = 1 かまたは update table set flg = 1 where user_id = AAA を発行したいと思っています。 ただ、sql 発行元から2個のsqlを出せない事情があり、DB側で対応しなければなりません。 トリガはselectでは使えませんよね?  最悪、query_logを監視しながらselectが来たら自分でupdateを発行するスクリプト しかないのかと考えています。 アドバイスお願いします。

  • 秀丸でSQLを書く際に SQLの予約語だけ大文字

    秀丸でSQLを書く際に SQLの予約語だけを、大文字に変換するよい方法は? たとえば select * from table_1 where id=1 order by id desc; と書いて、マクロを起動すると SELECT * FROM talbe_1 WHERE id=1 ORDER BY id DESC; となるようにするよい方法はありませんか? また、予約語が「強調」されると尚良いです。

  • SQLについて

    こんにちは、honiyonです。  良い質問タイトルが思いつきませんでした...(^^;  2つのテーブルがあります。(仮定です)   ・オーナーの情報テーブル(owner)   ・オーナーの車の情報テーブル(car)  この2つのテーブルを利用して「男性の人で、黒い車に乗ってる人の車種名」を検索しようとしました。  これを1つのSQLで   SELECT car.name FROM owner,car WHERE (owner.no=car.ownerno) and (car.color='black') and (owner.sex='MAN');  とか、   SELECT car.name FROM (SELECT * FROM owner WHERE (owner.sex='MAN')) AS O2, (SELECT * FROM car WHERE (car.color='black')) AS C2 WHERE (owner.no=car.ownerno);  とかやってみましたが、涙が出るほど遅いです。  しかし   SELECT * INTO TABLE owner_tmp FROM (SELECT * FROM owner WHERE owner.sex='MAN'); SELECT * INTO TABLE car_tmp FROM (SELECT * FROM car WHERE car.color='black'); SELECT car_tmp.name FROM (owner_tmp.no=car_tmp.ownerno);  とすると超高速です。  なんとかテンポラリを作らず、出来れば1つのSQL文で高速に冒頭の処理を行いたいのですが、良い方法はないでしょうか。 是非お知恵を貸してください。  宜しくお願いします(.. #データベースはPostgreSQL 7.2.3です。

  • 一定以上の行があれば最大値を持つ行を削除するSQL

    MySQL5にて、あるテーブルの特定フィールドの数(つまりcount値)が一定値以上であれば、間引きのため別のフィールドの値で最大値をもつ行を削除するSQLを考案中です。 イメージとしては以下の通りですが、SQLとしては誤っており、また、冗長です。 DELETE FROM table WHERE id={$id} AND (SELECT COUNT(*) FROM table WHERE id={$id}) > 5 AND begin = (SELECT MAX(begin) FROM table WHERE id={$id}); よい知恵をお授けください。

    • ベストアンサー
    • MySQL
  • SQL シーケンスについて

    Orcle8iを使用しています。 INSERT INTO SELECT で別のテーブルのデータを追加したいのですが、そのうち1つフィールドには、シーケンスオブジェクトで取得した値を入れたいと思っていますが、INSERT文が作れません・・・。 例えば ----------------------------- INSERT INTO TABLE1(FIELD1,FIELD2,FIELD3)   SELECT --SELECT SEQ.NEXTVAL FROM DUAL??--     FIELD1_2,     FIELD1_3 FROM TABLE2 WHERE FILED1_2='X'; ----------------------------- という場合、TABLE1のFIELD1に連番を入れたいのですが 書き方が分かりません。 http://www.okweb.ne.jp/kotaeru.php3?q=347146 上記URLの質問に、シーケンスのSELECT文を副問い合わせにして・・・という回答があったのですが、それもよく理解できませんでした・・・(T_T) シーケンスのSELECT文をどう埋め込めば良いのでしょうか? どなかた教えていただけませんか? よろしくお願いします。

  • PL/SQLのDELETE文について

    PL/SQLでDELETE文を書こうとしているのですが、 文法がわかりません。。。 分かる方がおられましたら、教えてくださいm(_ _)m 今、TABLE1を削除したいのですが、条件がいろいろあって、 以下のように書いてみたのですがダメでした。 こういう書き方は、できないんでしょうか・・・。 削除条件は、TABLE2に存在し、かつ、TABLE2のTENSUが0のもので、 TABLE3が存在しないものです。 DELETE TABLE1 FROM TABLE1 ,TABLE2 ,TABLE3 WHERE TABLE1.ID = TABLE2.ID AND TABLE2.TENSU = 0 AND Not Exists (SELECT TABLE3.ID FROM TABLE3 WHERE TABLE3.ID = TABLE2.ID) 説明が下手なので、うまく、伝わっているか、心配なのですが・・・、 よろしくお願いします。

  • INで抽出した順番に並び替え(SQL)

    MySQLでINで抽出した順番で並び替えて表示したいのですが、簡単に行う方法はありませんか? [例] SELECT ID,NAME FROM TABLE WHERE ID IN (5,7,3); このSELECT文の抽出結果を5,7,3の順番に並び替えたいのです。 もちろん力技で行うこと(1つずつSELECTで抽出して表示)は可能なのですが、あまりにもスマートではないので・・・。

    • ベストアンサー
    • MySQL