初めに
SQLインジェクションに関して気になったので調べてみました
SQLインジェクションとは
SQLインジェクションとは、
外部から渡された入力値をそのままSQL文に組み込んでしまった結果、
不正なSQLが実行されてしまう攻撃手法です。
攻撃者はフォーム入力欄やクエリパラメータにSQL文を混ぜ込み、
「本来実行されるはずではない検索・更新・削除処理」を行わせます。
典型例
C#
string userId = Request.QueryString["user_id"];
string sql = "SELECT * FROM Users WHERE user_id = '" + userId + "'";
SqlCommand cmd = new SqlCommand(sql, conn);
var reader = cmd.ExecuteReader();
何も対策をしていない場合下記のようなものを入力できます。
' OR '1'='1
これが入力された場合
1=1 は常に真のため、
全ユーザー情報が取得されることになります。
攻撃例
管理画面への不正ログイン
ログイン処理
SELECT * FROM admins
WHERE username = 'admin'
AND password = '入力値'
パスワード欄に下記を入力
' OR ''=''
結果、ログインが成功する
データ削除
下記を入力
a'; DROP TABLE Users; --
ユーザー情報が全消去される危険性もあります。
コード上での対策
・パラメータ化クエリを使う
┗データ型が曖昧になるため注意
・文字列連結は行わない
Webアプリ側で行うべき対策
・入力値のバリデーション
・DBユーザーへの最低限権限の付与
・例外メッセージを画面に出さないようにする
最後に
開発者がこれらについて気を付けていけば
SQLインジェクションは防げるものだと思います。
自身もこれらについてより学んでいこうと思います。