• ベストアンサー

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

お世話になります。 早速ですみませんが質問をさせていただきます。 「SQL インジェクション」について教えて下さい。 小学5年生だと思って説明してもらえませんか? すみませんが宜しくお願いします。 では、失礼します。

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

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

> SQLインジェクションっていうのは、例えばログイン画面で「ユーザー名」と > 「パスワード」のテキストボックスがあったとして不正アクセスを起こす恐 > れがある文字を入力して攻撃するような事をいうんでしょうか? ログイン画面があるということは、ログインのユーザーを管理している何かがあるわけです。 その何かが『データベース』です。 データベースはイメージ的にいうと、Excelのように表形式に情報を蓄積できる入れ物のようなものです。 そして情報を必要とし、データベースから情報を抽出しようとするとき、SQL文というものを利用します。 それが先に述べたものになり、SQL文はただの文字列です。 さて、ではログイン画面では何が必要でしょうか? 真っ先に思いつくのは『入力されたユーザーID、パスワードが、その組 み合わせでデータベースに登録されているか』になります。 ブラウザからユーザーIDなどが入力され、ログインボタンなどが押された時、 サーバ側では、入力された値を受け取って、画面に見合った処理を行い、 結果をブラウザへ返します。 画面に見合った処理というのは先に述べた、『入力されたユーザーID、パス ワードが、その組み合わせでデータベースに登録されているか』で、 データベースから情報を取得する必要がありますから、サーバ側の処理として SQLを発行するように仕組みがされています。 しかし、ユーザーIDなどに、悪意のある値が入力されていた時、 意図しないSQLが発行されてしまい、システムが破壊される恐れがあります。 これがSQLインジェクションになります。(ここまでは既にお分かりかと思います) SQLインジェクションは、意図しないSQLが発行されてしまう事ですから、 外的要因によって発行前に作成されるSQL文が意図しないものへと壊れてしまう脆弱性のことになります。 外的要因とはブラウザ上から任意で入力されるテキストボックスなどが主にそれにあたります。 しかしながら <input type="hidden" name="abc_flg" value="1" /> こんなHTMLがあったとして、発行されるSQLとして SELECT * FROM TEST WHERE ABC_FLG = ? ?にabc_flgのvalueが利用されてSQLが作られるとしたら、 そのページを一度ファイル保存して、先のHTMLを <input type="hidden" name="abc_flg" value="ABC_FLG" /> と書き換えてしまって動作させるとSQLは SELECT * FROM TEST WHERE ABC_FLG = ABC_FLG となってしまいます。 この例だとABC_FLGがABC_FLGであることは当然ですから、 データベースに蓄積されている全ての情報が取得されてしまいます。 ですから、画面上には非表示だから問題ない、というわけではありません。 代表的な回避方法としては ・SQLに影響のある、ブラウザから受け取ったデータは、  JavaScriptなどでクライアント側でチェックしていたとしても  必ずサーバ側でもチェックを行う。  (ブラウザで入力時にはOKでも、サーバとの通信経路などで  入力値が改ざんされる恐れがある為) ・SQLの条件式をちゃんとシングルクォーテーションで囲む  ×SELECT * FROM TEST WHERE ABC_FLG = 1  ○SELECT * FROM TEST WHERE ABC_FLG = '1'  (「1」は外的要因によって変化) ・SQLの文法上利用している記号などは、SQLを生成する前にエスケープする  エスケープすると、文法上の記号でない事になる  ×SELECT * FROM TEST WHERE ABC = 'あ'いうえお'  ○SELECT * FROM TEST WHERE ABC = 'あ''いうえお'  (「あ'いうえお」は外的要因によって変化。「''」で  文法上の記号でない、抽出条件としての「'」を表している) ・Shift_JISの文字コードを利用しない。  詳しくはこちら↓  http://www.atmarkit.co.jp/fsecurity/column/ueno/42.html

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.3

こんにちは。 SQLインジェクションの回避方法を質問されているようですが、「サニタイジング」で検索してみてください。 要はWebサイトに入力フォームがあった場合、データが格納されているDBに対して不正な操作(=データの全件表示や全件削除 etc)を行わせようとするため、入力フォームへ不正なSQL文が実行されるように文字列を入力する操作がSQLインジェクションです。 それに対して、入力フォームにSQL文やHTML文で意味のある単語(=コマンド)が入力された場合、実行前にそれらを強制的に別の文字列へ置き換えることがサニタイジングです。 (ちょっと乱暴な説明で申し訳ない)

参考URL:
http://www.atmarkit.co.jp/fsecurity/rensai/webhole02/webhole01.html
全文を見る
すると、全ての回答が全文表示されます。
  • t4t
  • ベストアンサー率55% (47/84)
回答No.2

実際にどんな攻撃なのかはすでに回答があるので、意味的な話を。 たとえばこのQ&Aや検索エンジンやショッピングサイトなど、「なにかを入力してボタンを押すと、入力内容によって結果が表示される」というようなサイトは、さまざまなデータを管理するために、データベースというものを使っている場合があります。 そういう構成のウェブサイトの場合、ブラウザでウェブサイトを見るとき、ブラウザからサーバに対して「この画面を表示したい」というリクエストが飛ぶと、 サーバはそのリクエストに従って、データベースからデータを検索したりデータを追加したり修正したりして、最終的にブラウザへの回答として画面を作ってブラウザへ返します。 ブラウザはその画面を受け取ってPCの画面に表示しています。 本題ですが、 SQLインジェクションというのは、ブラウザからサーバに対して飛ぶその「この画面を表示したい」というリクエストの中に、「このデータを直接いじりたい」というリクエストを混ぜるという攻撃手法です。 「このデータを直接いじりたい」というリクエストのことを専門用語でSQLといいます。 で、インジェクションは英語で「中に入れる」というようなニュアンスがあります。 ブラウザからのサーバへのリクエストの中にSQLを入れて送るので、SQLインジェクションといいます。

Rx78-2_G
質問者

補足

SQLインジェクションの攻撃を回避する方法で代表的な処理はあるのでしょうか?あったら教えていただけませんでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

PG id = getParameter("id"); pass = getParameter("pass"); var = "select * from test where id = '" + id & "' and pass = '" + pass + "'"; abcというユーザーがいたとする。 ユーザーがidの入力欄に abc' -- とかされたら実際に処理されるSQLは? select * from test where id = 'abc' --' and pass = '' --以降はコメントとして扱われ、idだけでログインできちゃう。 使ってるDBによってはidの入力欄に abc'; delete from test; -- select * from test where id = 'abc'; delete from test; --' and pass = '' ってことで2つのSQLを発行させちゃったり。 とかです。SQLインジェクションの仕方はそれだけじゃないんですが、 一番普及してる内容がそんなもんです。

Rx78-2_G
質問者

補足

SQLインジェクションっていうのは、例えばログイン画面で「ユーザー名」と「パスワード」のテキストボックスがあったとして不正アクセスを起こす恐れがある文字を入力して攻撃するような事をいうんでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

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

    SQLインジェクション対策についてご質問があります。 SQLを入力してそのまま実行するプログラムを作ろうとしています。 ユーザーが入力したSQLをプログラム側でSQLインジェクションを含むかどうかの判定が できるようにしたいのですが、可能なのでしょうか? よろしくお願い致します。

  • XSS、CSRF、SQLインジェクションについて

    XSS、CSRF、SQLインジェクションをそれぞれ簡単に説明すると、 XSS・・・動的なWebサイトにおける入力フォームの脆弱性 CSRF・・・ユーザーになりすましてWebサーバーにリクエストすること SQLインジェクション・・・アプリケーションが実行するSQL文に変なものを注入して、意図しない 動作をさせる攻撃のこと で正しいですか?

  • SQLインジェクションが発生する理由

    初めての質問です。よろしくお願いします。 今現在、SQLインジェクションというものが問題になっていますよね いろいろなサイトを回って調べて見たのですが、具体的な対策として、「'(シングルクォーテーション)」などの特殊文字を確実にエスケープすること、くらいしか対策が書かれておりません。 特殊文字のエスケープさえしっかりしておけばSQLインジェクションは発生しない、という印象を受けたのですが、SQLインジェクションがおきてしまったサイトではエスケープ処理をしていなかったということなのでしょうか? それとも、エスケープ処理をしていても何らかの方法で不正なSQLの命令を実行されてしまうのでしょうか? どうにもわからなくて困っているので、どうかよろしくお願いいたします。

  • MySQLとPostgreSQLについてのSQLインジェクション

    はじめて質問させていただきます。 よろしくお願いします。 現在、私は大学の研究テーマでデータベース(MySQL、PostgreSQL)を使っているCGIを自作し、それぞれのデータベースについてSQLインジェクションの脆弱性について調べる、という研究を行っています。 ブラインドSQLインジェクションについて調べているのですが、 PostgreSQLの場合、pg_tablesというテーブルにデータベースのテーブル一覧表がのっていて、それを参照することでテーブル名が取得でき、いろいろ悪いことができてしまいますが、MySQLの場合、ブラインドSQLインジェクションを起こそうと思った場合どのようなコマンドを使えばよいのでしょうか? SHOW TABLESで使用中のデータベースのテーブル一覧は取得できますが、それをクエリの一部として使うことはできるのでしょうか・・・? また、全く関係ない質問なのですが、このCGIはRubyで記述して作りました。Rubyにはプリペアドステートメントという機能があるのですが、これをデータベースにアクセスするすべての箇所で用いればSQLインジェクションは100%起きないといえるのでしょうか?(現在考え得る範囲でよいのでお願いします) 卒論で困っているので知っている方がおられましたらどうかよろしくお願いいたします。

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

    Webアプリにて入力フォームからのSQLインジェクション対策を行いたいと思っているのですが その1つとしてpreparedstatement SQLを使用することを考えています。 これを使用すればシングルクォーテーションを使った 悪意のあるSQL文を挿入されることが防げると思うのですが他に何か考慮することって あるのでしょうか。

    • ベストアンサー
    • Java
  • SQLインジェクションについて質問です

    よくSQLインジェクションの攻撃で、改竄されたWEBページからウイルスを仕込まれた。 等という話を耳にしますが、この攻撃でどうやって改竄するのですか? 私が知ってる範囲だと、この攻撃では入力フォームに必ず条件マッチするようなSQLを入れて 情報を取り出したり、DBの情報を書き換えたり、情報を消したりくらいしか出来ない気がするのですが・・ あと、SQLインジェクションの紹介でよく見る、ログイン画面で「' 1=1;--」みたいな入力は誰でも思いつくと思うのですが、DBの情報を書き換えたり消したりするのって そのDBのカラム名とかが分からないとできないですよね。 攻撃者はこれらを推測して行っているのですか。 それともカラム名とかを知り得る攻撃手法があるのでしょうか。 また、SQLインジェクションとは関係ないのですがXSSという攻撃手法もありますよね。 こっちはクッキー情報を盗まれるのが一番大きな被害とありますが クッキー情報を盗まれると具体的に何がまずいのでしょうか。 サーバー側でクッキーに個人の名前とかメアドとかを入れてる場合があるという事ですか?

  • prepareでSQLインジェクション対策?

    PHPでMySQLを操作しています。 PDOのprepare()を使えば(プレースホルダを使えば?)、SQLインジェクションは必ず発生しないと言えますか? もし、そうだとすれば、SQLインジェクション対策はかなり簡単ですよね?でも、セキュリティの話でよく取り上げられるということは、実際は他の問題が発生したりするんですかね?

    • ベストアンサー
    • PHP
  • 複文によるSQLインジェクションを防ぐには

    複文によるSQLインジェクションを防ぐには、ユーザー入力値から「;(コロン)」を除去すればOKでしょうか? ご存知の方がいらっしゃいましたら教えてください。 よろしくお願いいたします。

  • 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 インジェクションは PQexecParams で防げますか?

    お世話になっております。商用のサーバーを運営しているものです。 最近私が運営しているサーバーでチャットをやることになっているのですが、できればワイセツなどの禁止用語以外は自由にしたいのですが、そうするとSQLインジェクションの心配があります。それで、ユーザーが入力した文字列を扱う部分を PQexecParams を使ってデータベースに入れようと思っているのですが、これだけで問題は解決できますか? これでも危険な攻撃を受けるケースがあるならばお教えください。

このQ&Aのポイント
  • 水銀式体温計をフリフリする意味とは、世代を示す方法の一つです。
  • フリフリとは、体温計を振ることで水銀柱を下げる動作のことで、これによって水銀柱の初期位置を確認することができます。
  • 水銀柱の初期位置が低い場合は新しい体温計、高い場合は古い体温計であることを示唆しています。
回答を見る