バリデートされていない3つのフォームがあるとします。
(フォーム1の内容はSELECT文のSQLを発行するPGが組まれています。)
(フォーム2の内容はINSERT文のSQLを発行するPGが組まれています。)
(フォーム3の内容はDELETE文のSQLを発行するPGが組まれています。)
この3つのフォームに' OR 'A'='Aと入力すると、
フォーム1の場合、全件内容が表示される。
フォーム2はINSERTなどでOR 'A'='Aが登録されるだけ、
フォーム3の場合、全件内容が消去される。
知っている人がみたら、自分は結構理解できていないんだなと思います。
OR 'A' = Aって全件を示す文なのでしょうか?
参考サイトが難しくてとっつきづらいです。
どこか分かりやすいサイトがあったら教えてほしいのですがよろしいでしょうか。
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テーブルに含まれる全てが検索されてきます。
No.3
- 回答日時:
>インジェクションする人もある程度予想立てて(SQL文とか入力する値は変数のどの値になるのか)行わないと成功しないということでしょうか?
予測もだけどあれしてこれしてって順を追って攻撃してくるのでしょう。
手っ取り早くPOST/GET(セキュリティー的にこの場合はGETはあまり使わないでしょうけど)で渡す値に「' OR 'A'='A」を入れた置けば
$_GET('パスワード')の値が「' OR 'A'='A」だして
それをエスケープ処理もしないでSQL文を構築すれば後は想像できると思います。
No.1
- 回答日時:
たぶん質問者は
http://www.atmarkit.co.jp/fsecurity/column/ueno/ …
を見ての質問でしょうけど
OR 'A'='A'の意味は理解できるのか?
ORと'A'='A'のそれぞれの意味は理解できるのか?
これはSQL以前にPHPのifの条件と同じです。(ただしphpの場合の=の使い方が違いますが)
この回答への補足
ありがとうございます。
>これはSQL以前にPHPのifの条件と同じです。
冷静に考えれば条件でパスワードが一致するか、もしくは、Aの値がAという意味でOR 'A'='A'にしてたわけですね。。。別に OR 'B'='B'でもいいわけですよね。
参考にしてたサイトは確かに、
http://www.atmarkit.co.jp/fsecurity/column/ueno/ …
ですが、
この場合って、uidにuenoが入っている条件でかつSQL文も変数はなんでもいいんですが、
SELECT * FROM user WHERE uid='$uid' AND pwd='$pwd'
というSQL文じゃないと通用しないと思いますが、どうでしょうか。
インジェクションする人もある程度予想立てて(SQL文とか入力する値は変数のどの値になるのか)行わないと成功しないということでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript ラジオボタンによるフォームの開閉を行いたい 3 2022/03/31 21:30
- Visual Basic(VBA) Excel VBA 同じ名前のフォルダがあれば作成したブックを格納するマクロをつくりたい 2 2023/01/16 16:19
- その他(プログラミング・Web制作) google formsで回答者をスプレッドシートに記載する方法 1 2023/06/23 11:22
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- JavaScript 読み込んだQRコードをフォームに受け渡したい 1 2023/05/18 11:18
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- JavaScript テーブルの中のセレクトボックスの値が0のとき、非表示にしたい 3 2022/05/29 10:13
- Access(アクセス) Access 登録ボタンからサブフォームの更新 1 2022/07/22 10:23
- その他(プログラミング・Web制作) 入力フォームへ、データを自動的に入力するプログラム。どうやって作る? 4 2023/01/16 10:24
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ブラウザバックしてもチェック...
-
HTMLエスケープ処理とデーター...
-
PHPの認証方法
-
PHPで値を保持する方法
-
HTMLエスケープすべき場所につ...
-
asp.netでのセッションを使用し...
-
飛び先のランダムURLの取得方法...
-
IFRAME内PHPのセッション変数取...
-
動的にhtmlテーブルを表示
-
DTOとEntityの差は何ですか。
-
Dosブロンプトでtabを出力したい
-
Yahoo! JAPAN IDを新規取得でき...
-
「取得先」という表現について
-
小数点以下0の非表示
-
オブジェクトの中身の判定(PHP)
-
excel access連携 このテーブル...
-
switch()文で値の大小比較
-
【C#】DataGridViewの最大列数...
-
バッチファイルでpingの結果を...
-
wordの差し込み印刷で文字...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
POSTで受け渡したものを保存し...
-
php 入力画面から確認表示画面...
-
フォームを使わずにPOST送信す...
-
ログイン画面から入って、「戻...
-
VBAで重複チェックの仕方を教え...
-
動的にhtmlテーブルを表示
-
ブラウザバックしてもチェック...
-
HTMLエスケープ処理とデーター...
-
php history.back()の戻るボタ...
-
asp.netでのセッションを使用し...
-
閉じるボタン「×」を制御したい
-
セッション使用時のフォームの...
-
IFRAME内PHPのセッション変数取...
-
PHPで返信メールにチェックボッ...
-
HTMLエスケープすべき場所につ...
-
PHPで値を保持する方法
-
PHPの認証方法
-
php/MySQLによるログイン認証に...
-
登録確認メールのリンクURLにメ...
-
PHP/Mysqlで会員システムを構築
おすすめ情報