0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SQLインジェクションの実例と安全なコーディング方法

Posted at

初めに

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インジェクションは防げるものだと思います。
自身もこれらについてより学んでいこうと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?