• ベストアンサー
  • すぐに回答を!

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」の間のダブルクォーティションは、 どのような意味を持つのでしょうか。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数265
  • ありがとう数3

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

  • ベストアンサー
  • 回答No.2
  • shimix
  • ベストアンサー率54% (865/1590)

>そうすると「''or 'a'='a'」は、どのシングルとどのシングルが対になっているのでしょうか? passwordは最初の2つのクォーテーションで終わりです。つまりpasswordは空ですね。で、そのあとに「 or 'a'='a'」という「常に真」となる式が論理和で付いているので、passwordの内容とは無関係に「常に真」になります(これがSQLインジェクションになるわけです)。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

password='null' なのですね。 ありがとうございました。

関連する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
  • エスケープに関しまして

     $uid   :  ueno  $pwd  :  ' OR 'A'='A  これを入力するとSQLは以下のようになる。 SELECT * FROM user WHERE uid='ueno' AND pwd='' OR 'A'='A これをエスケープで対策するとしたら具体的にはどう記述したらいいでしょうか??

    • ベストアンサー
    • PHP
  • PASSWORD関数

    INSERT INTO user_table(id,pass) VALUES ('abc',PASSWORD('123'); で入力したデータを以下のSELECT文で抽出しようとした処、クエリー発行は成功するものの、結果行数(mysql_num_rows)が0となります。 SELECT * FROM user_table WHERE pass=PASSWORD('123'); どうぞご教授ください。

    • ベストアンサー
    • MySQL

その他の回答 (1)

  • 回答No.1
  • shimix
  • ベストアンサー率54% (865/1590)

>「password=」と「or」の間のダブルクォーティションは、 元の記事(?)がわからないので推測ですが、ダブルクォーテ-ションじゃなくてクォーテ-ション×2ではないですか? password='$pass' で$passが 'or'a'='a だと password=''or'a'='a' ですよね?

共感・感謝の気持ちを伝えよう!

質問者からの補足

さっそくご返事をいただきまして、ありがとうございました。 仰るとおりシングルクォーテンション×2でした。 いままでダブルだと思っていました。 そうすると「''or 'a'='a'」は、どのシングルとどのシングルが対になっているのでしょうか?

関連するQ&A

  • 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文が入るようにしたりして本来取り出せないはずの、 項目を取り出したりしているのでしょうか? どこまでが質問出来て、回答を貰えるのかが微妙ですが、 ご存知の方いらっしゃいましたらお願いします。 間違いもありましたら指摘して頂けると幸いです。

  • 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インジェクションの危険性について[MYSQL]

    下記のコードはPHPプログラマ一年生の自分から見ても、 POST入力値をチェックしていない危険なコード(一部を抜粋)だと 思うのですが先輩は問題ないと言い、修正する気がありません。 そこで、SQLインジェクションのようなSQL文を送信された場合に ユーザー名とパスワードが表示されれば納得すると思い いろいろテストしてみたのですが、うまく表示されません。 実はSQLインジェクションなどの問題ないソースなのでしょうか? ご教授、よろしくお願いいたします。 ■テーブル構成(ユーザ・パスワード管理テーブル) CREATE TABLE `sample`.`test` ( `user_id` INT NOT NULL , `passwd` VARCHAR( 32 ) NOT NULL ) ■問題の処理分 <?php $user_val = "" ; $pass_val = "" ; if (isset($_POST["user_id"]) == TRUE) {   $mysql_c = mysql_pconnect('******' , "******" , "******");   mysql_select_db("******" , $mysql_c);   $sql = 'select * from test where user_id = ' . $_POST["user_id"] ;   $result = mysql_query($sql , $mysql_c);   if ( $result != false)   {     if(($row = mysql_fetch_object($result)) != false )     {       // パスワードチェック       if ( $row->passwd != $_POST["pass"] )       {         echo "check NG" ;       }       else       {         $user_val = $row->user_id ;         $pass_val = $row->passwd ;       }     }   } } ?> <FORM action="index.php" method="post" > <input type="text" name="user_id" value="<?php echo $user_val ?>" > <input type="text" name="pass" value="<?php echo $pass_val ?>" > <input type="submit"> </FORM>

    • ベストアンサー
    • MySQL
  • 異なるスキーマからデータを抽出するには?oracl、PL/SQL

    Oracle初心者です。検索してもなかなかhitしないので、質問させていただきます。 aaaとbbbというスキーマがあると仮定します。 aaaにはパスワードテーブル bbbにはユーザテーブルがあるとします。 ユーザテーブル、パスワードテーブルにはそれぞれuser_idカラムがあり、そのuser_idをキーにして、aaaのpasswordカラムのデータを取得したいと思っています。 sql*plusでbbbに接続して、作業をしています。 言語はPL/SQLを使用しています。 単純に SELECT a.password FROM aaa.パスワードテーブル a, bbb.ユーザテーブル b WHERE a.user_id = b.user_id とすれば良いのかと思っていたら、違うようで、オブジェクトが存在しないと言うエラーになりコンパイルが通りません。 このよう違うスキーマのテーブルを参照する場合、どのようにすれば良いのでしょうか?

  • MySQL SELECT結果をSET

    質問は二つあります。 (1)二つのコードをひとつにしたいのですが、どうもうまくいきません SELECT id, (price * 10) FROM table WHERE id = 1; SET @sum = @sum + (SELECT ( SELECT id, (price * 10) FROM table WHERE id = 1); (2)コードの簡略化 SELECT id, (price * 10) FROM table WHERE id = 1 OR id = 3 OR id = 8; の、WHERE id = 1 OR id = 3 OR id = 8; の部分です。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQLで他のテーブルに無いIDの抽出

    MySQLを使っています。 下記は、 1.テーブルaaaには、存在するidのものが、 2.テーブルbbbには、存在しない、 3.テーブルaaaのレコードを抽出したいものです。 "SELECT DISTINCT aaa.*" + " FROM aaa" + " WHERE (aaa.flag = false)" + " AND NOT EXISTS (SELECT * FROM bbb" + " WHERE (aaa.id = bbb.id) AND (bbb.flag = false))" ですが、実行すると、下記エラーがでます。 SQLException:Base table or view not found, message from server: \"Unknown table 'bbb' in where clause" どうすればよいのでしょうか?

    • ベストアンサー
    • MySQL
  • RLIKE vs LIKE

    ■1 SELECT `id` FROM `user` WHERE `stat` RLIKE ',1,' ■2 SELECT `id` FROM `user` WHERE `stat` LIKE '%,1,%' 1と2では、どちらが速いのでしょうか? また、 ■3 SELECT `id` FROM `user` WHERE `text` RLIKE ',(1|6|3),' ■4 SELECT `id` FROM `user` WHERE `stat` LIKE '%,1,%' OR `stat` LIKE '%,6,%' OR `stat` LIKE '%,3,%' 3と4の様に検索する値が増えて行った場合では、どちらが速いのでしょうか? ベンチとれと言われればそれまでですが、お時間頂ければ、ご教授の程 、宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • SQLインジェクション対策(クオーテーション関連

    PHP Version 5.4.7の環境にて。 SQLite3::escapeStringを使って、 SQLインジェクション対策をしようと考えています。 HTMLの<form>からPOSTで値を受け取り、 その値をSQL文に入れ込み、 そのクエリ(※ちなみに、INSERTのみです。)をSQLite3のDBに対して行う、 なんてことをする際の、 SQLインジェクション対策として、お考え下さい。 POSTで受け取る値に入っていたら危険なものとして、 「シングルクオーテーション」が、まず、挙げられるかと思います。 「'」 ←これです。 さて、「"」 ←こちらはダブルクオーテーションですが、 こちらのダブルの方はエスケープする必要は無いのでしょうか? (例)※wikipediaより SELECT * FROM users WHERE name = '(入力値)'; SELECT * FROM users WHERE name = 't' OR 't' = 't'; → このSQL文では条件が常に真となるため、 nameカラムの値にかかわらず、全レコードが選択される。 → ということで、入力値に、 エスケープされていない「シングルクオーテーション」をそのまま使うのはNG。 ここまではOKです。 では、次に、ダブルクオーテーション版で、 SELECT * FROM users WHERE name = "(入力値)"; SELECT * FROM users WHERE name = "t" OR "t" = "t"; こちらはどうなのでしょうか? (シングルをダブルに変えただけですが。) ---------- ちなみに、 SQLite3::escapeString にて、 (1) $var = "Let's"; //←シングルクオーテーション $db = new SQLite3(':memory:'); $escaped_var = $db->escapeString($var); echo $escaped_var; //Let''s と表示される (「 ' 」が1つ追加される。) (2) $var = 'Let"s'; //←ダブルクオーテーション $db = new SQLite3(':memory:'); $escaped_var = $db->escapeString($var); echo $escaped_var; //Let"s と表示される (何も追加されず。) というように、 シングルクオーテーションはエスケープされるが、 ダブルクオーテーションの方ではエスケープされませんでした。 これは、つまり、 ダブルクオーテーションの方は危険視されていない、 ということだと思いますが、 でも、本当にダブルクオーテーションをエスケープせずに、 そのまま、SQL文につっこんでも大丈夫なのでしょうか?

    • ベストアンサー
    • PHP
  • プリペアードステートメントの最終的なSQL文の確認

    プリペアードステートメントでSQLを実行しております。 プリペアードステートメントで最終的に実行されたSQL文を確認する方法はないでしょうか。 <実行SQL> $sql = "SELECT * FROM member where user = :username and password = :password and delflag ='0'"; $stmt = $this->db->prepare($sql); $flag = $stmt->execute(array(':username' => $user,':password' => $pass)); $passには、ユーザーから入力されたパスワード情報 $userには、ユーザーから入力されたユーザー名が入っております。 executeで実行された、$userの内容と$passwordの内容が埋め込まれ実行された 最終的な$SQL文を確認したいと思っています。 どのようにすれば確認できるものなのでしょうか。 ご教授よろしくお願いします。

    • ベストアンサー
    • PHP
  • パスワードの暗号化

    php+mysqlでシンプルな会員登録を作りたいのですがパスワードは暗号化したほうがいいですか? パスワードを簡単に暗号化できる方法はありますか? postされたpassと暗号化されたpassのチェック方法がわかりません ログイン if ($_POST['id'] !='' && $_POST['pass'] !='') { $sql = sprintf('SELECT * FROM hoge WHERE id="%s" AND pass="%s"', mysql_real_escape_string($_POST['id']), mysql_real_escape_string($_POST['pass']) ); $record = mysql_query($sql) or die(mysql_error()); if ($table = mysql_fetch_assoc($record)) { $_SESSION['id'] = $table['id']; $_SESSION['name'] = $table['name']; } else { //エラー }

    • ベストアンサー
    • MySQL