SQLインジェクションってなに?
詳しい説明は、後述の参照先をご確認ください。
ざっくり言うと・・・
- サイトを攻撃するための手法の1つ
プログラム内でSQLを組み上げる際の間隙を狙ったニッチ産業- プログラム内でSQLを組み上げる際の間隙をついて、攻撃する方法
- 攻撃者が、データベースを破壊できたり、データを取得、改ざんできたりする
説明より、攻撃例(↓)を見たほうがわかりやすいかもです。。
悪い人になって、SQLインジェクション攻撃をしてみる
ここに、こんなサイトがありました
よくある、サイト内を検索するフォームですね。
試しに、「’」を入力して、検索してみます
攻撃する気はないんです。単なる興味ですよ。「’」を探したいだけなんです。
あらら、エラーページが出てきました。
1 | エラーが発生しました。やり直してください。 |
おかしいなぁ。少し調べてあげよう。悪気はないんですよ。むしろ善意です。
とりあえず、抽出対象テーブルのデータをすべて引き出してみる
「’ or 1=1 or ”=’」を入力して、検索してみます。
やっぱり出てきた( *´艸`) ほうほう。なるほどなるほど。誰かに攻撃される前に、忙しいサイト管理者に代わって、いろいろバックアップしてあげよう。俺って優しいなぁ。
ん~、セキュリティが甘いなぁ。サイト管理者に報告してあげよう。
・・・ということで、攻撃者の目論見通り、データがすべて抽出されます。(OutOfMemoryErrorとかは、さておき・・)
この段階では、テーブル名、項目名はわからないにせよ、攻撃者は、以下のようなSQLを推測しています。
プログラムが発行しているであろうSQL
1 | select 抽出項目・・・ from テーブル名 where 項目 = '" + 入力された値 + "'" |
攻撃により実行されるであろうSQL
1 | select 抽出項目・・・ from テーブル名 where 項目 = '' or 1=1 or ''='' |
SQLインジェクションの対策
- SQLを発行する際は、Statementではなく、PreparedStatementを使う。
- プレースホルダを使って、SQLに埋め込んだ「?」に、あとから値をセットする。
が・・・、すでに作ってあるアプリケーションを修正するには、心が折れます(*_*;
アプリケーションを作るときは、必ずポリシーを持って、作り始めましょう。
PreparedStatementでアクセスするには?
PreparedStatementでSELECTを発行する方法は、こちらを見てください。
SQLインジェクションに関わる参考資料
いくつか、SQLインジェクションに関わる説明をされているサイトがありますので、こちらもご確認ください。
参照:SQLインジェクション対策について 情報処理推進機構(IPA)
参照:SQLインジェクション対策の極意はSQL文を組み立てないことにあり CodeZine
参照:今夜分かるSQLインジェクション対策 @IT
参照:SQL インジェクション攻撃とその対策 Microsoft