はじめに
今回はおもむろにWebセキュリティの解説をしたいと思います。
Webセキュリティといっても様々なので、今回はそのうちの1つである
「SQLインジェクション」について説明します。
SQLインジェクションとは?
そもそもSQLとは何ぞや?ですが
SQL(Structured Query Language)という
データベースを操作するための言語をとなります。
SQLインジェクションはSQLを用いた攻撃で、
こちらを利用されると顧客の情報を流出させられたり、
システムに壊滅的なダメージを与えることができます。
いったいどんなことされちゃうのか?
例えばこちらのようなSQLでユーザー情報を取得しているプログラムがあったとします
SELECT * FROM users WHERE id = '(入力A)' AND password ='(入力B)';
こちらのSQLの意味は
[users]テーブルから
[id]が(入力A)且つ[password]が(入力B)のデータを取得する
(入力A)にはフォームからのユーザーID,
(入力B)にはフォームからのパスワードが入るシンプルなSQLです
(入力A)は何も入力せずに、
(入力B)に以下のような情報が入力された場合どうなるでしょうか?
(入力B) =(' or 'A' = 'A)
生成されるSQLはこちらになります。
SELECT * FROM users WHERE id = '' AND password ='' OR 'A' = 'A';
こちらのSQLの意味は
[users]テーブルから
[id]が空文字且つ[password]が空文字
または、'A' = 'A'が成立するユーザー
のデータを取得する
当たり前ですが'A'は常に'A'ですよね?
つまり、こちらのSQLは必ず成立し、実行されると必ずログインが成功します。
では以下のような情報が入力されたらどうなるでしょうか?
(入力B) =('; DROP TABLE users where 'A' = 'A)
生成されるSQLはこちらです
SELECT * FROM users WHERE id = '' AND password =''; DROP TABLE users WHERE 'A' = 'A';
;はSQLの命令を区切るもので、
そのあとに自由なSQLをつなげることができます。
DROP TABLE users where 'A' = 'A';
こちらのSQLの意味は
[users]テーブルの情報を全て削除するという意味になります。
('A' = 'A'は常に成立するのでしたね)
攻撃者がusersテーブルの名前を知っておく必要がありますが
SQLインジェクションを駆使すればそちらを調べることも不可能ではありません。
SQLインジェクションを防ぐには
こちらの問題点は、特殊な意味を持つ'(シングルクォーテーション)などを
プログラムが特別な意味のまま解釈していることが問題でした。
こういった特別な意味を持つ文字が入力された時
その意味意味を取り除いて、単なる文字列として解釈させることで防ぐことが可能となります
これをエスケープ処理といいます
とはいっても、昨今のモダンなWebフレームワークを利用している場合は
付属のORMを使うことでエスケープ処理を自動でしてくれているのているのでほとんどの場合
意識せずとも対策されているかと思います。
ですが、生のSQLを発行する際、これらの意識が抜けていると重大なセキュリティホールとなりますので
知識としては知っておく必要があります。
ご相談はこちらから
企画や要件が固まっていないご相談でも
お気軽にお問い合わせください。
-
01
相談する
-
02
要件ヒアリング
-
03
専門企業のご紹介
-
04
企業との
ご面談&見積取得 -
05
企業選定〜契約締結
サポート -
06
専門企業と直接
プロジェクト進行
※ステップ5以降はご希望に応じて
サポートいたします。
本サイトは、reCAPTCHAとGoogleにより保護されています。(プライバシーポリシー・利用規約)
EDITOR PROFILE
TUKURU株式会社
程原雄作
TUKURU株式会社
エンジニア
エンジニア
TUKURU株式会社
東京都
●オンライン中
WEBサービス開発
スマホアプリ開発
ソフトウェア・業務システム開発
他
TUKURU株式会社でできること
-
WEBサービス開発
Webプリ開発など
-
スマホアプリ開発
iOSアプリ、Androidアプリ開発など
-
ソフトウェア・業務システム開発
システム開発など