- ベストアンサー
SQL インジェクションについて
お世話になります。 早速ですみませんが質問をさせていただきます。 「SQL インジェクション」について教えて下さい。 小学5年生だと思って説明してもらえませんか? すみませんが宜しくお願いします。 では、失礼します。
- みんなの回答 (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)
- fine_save
- ベストアンサー率33% (1/3)
こんにちは。 SQLインジェクションの回避方法を質問されているようですが、「サニタイジング」で検索してみてください。 要はWebサイトに入力フォームがあった場合、データが格納されているDBに対して不正な操作(=データの全件表示や全件削除 etc)を行わせようとするため、入力フォームへ不正なSQL文が実行されるように文字列を入力する操作がSQLインジェクションです。 それに対して、入力フォームにSQL文やHTML文で意味のある単語(=コマンド)が入力された場合、実行前にそれらを強制的に別の文字列へ置き換えることがサニタイジングです。 (ちょっと乱暴な説明で申し訳ない)
- t4t
- ベストアンサー率55% (47/84)
実際にどんな攻撃なのかはすでに回答があるので、意味的な話を。 たとえばこのQ&Aや検索エンジンやショッピングサイトなど、「なにかを入力してボタンを押すと、入力内容によって結果が表示される」というようなサイトは、さまざまなデータを管理するために、データベースというものを使っている場合があります。 そういう構成のウェブサイトの場合、ブラウザでウェブサイトを見るとき、ブラウザからサーバに対して「この画面を表示したい」というリクエストが飛ぶと、 サーバはそのリクエストに従って、データベースからデータを検索したりデータを追加したり修正したりして、最終的にブラウザへの回答として画面を作ってブラウザへ返します。 ブラウザはその画面を受け取ってPCの画面に表示しています。 本題ですが、 SQLインジェクションというのは、ブラウザからサーバに対して飛ぶその「この画面を表示したい」というリクエストの中に、「このデータを直接いじりたい」というリクエストを混ぜるという攻撃手法です。 「このデータを直接いじりたい」というリクエストのことを専門用語でSQLといいます。 で、インジェクションは英語で「中に入れる」というようなニュアンスがあります。 ブラウザからのサーバへのリクエストの中にSQLを入れて送るので、SQLインジェクションといいます。
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
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インジェクションの仕方はそれだけじゃないんですが、 一番普及してる内容がそんなもんです。
補足
SQLインジェクションっていうのは、例えばログイン画面で「ユーザー名」と「パスワード」のテキストボックスがあったとして不正アクセスを起こす恐れがある文字を入力して攻撃するような事をいうんでしょうか?
補足
SQLインジェクションの攻撃を回避する方法で代表的な処理はあるのでしょうか?あったら教えていただけませんでしょうか?