SQLインジェクション

SQLインジェクション

SQLインジェクションは、ユーザの入力データを使用してSQL文を生成するWebアプリケーションの脆弱性を利用し、本来意図されたものとは異なるSQLを実行させ、権限のないデータの取得やデータ破壊などの不正なDB操作を行うセキュリティ攻撃です。
 ログイン フォームに入力されたユーザ名とパスワードでユーザを認証するアプリケーションがあるとします。

string queryString = "SELECT * FROM users WHERE " + "user_name = '" + userName.Text + "' AND password = '" + password.Text + "'"; 

ここで攻撃者がユーザ名とパスワードとして「' OR ''='」を入力すると、結果として次のクエリーが発行されます。

SELECT * FROM users WHERE user_name = '' OR ''='' AND password = '' OR ''='' 

ORから後が常に真であるため、すべてのレコードがWHERE句の条件に該当するようになり、不正なパスワードでも認証されてしまいます。
そのほかに、DELETE文によるデータの削除、テーブル名やカラム名といったスキーマ情報の取得などの不正操作が行われるケースもあります。

対策

SQLインジェクションに対する防御策としては、入力値を検証してSQL中で意味を持つメタ文字を適切にエスケープすることや、SQLパラメーターの使用が有効です。
上の例でSQLパラメーターを使用するよう変更すると、次のようになります。

string queryString = "SELECT * FROM users WHERE " + "user_name = @username AND password = @password";

SqlCommand command = new SqlCommand(queryString, connection);
command.Parameters.Add("@username", SqlDbType.VarChar, 15).Value = userName.Text;
command.Parameters.Add("@password", SqlDbType.VarChar, 15).Value = password.Text;

SqlDataReader reader = command.ExecuteReader();

SQLパラメーターを使用すると入力データはリテラルとして解釈されるため、入力データがSQL文の一部として扱われることはありません。
そのほかに、攻撃者に手がかりを与えないよう、データベースからの詳細なエラーメッセージをユーザに表示しない、また必要最小限の権限でデータベース操作を行うといった対策も挙げられます。

dotTESTのルール

○ SQL クエリー インジェクションから防御する
このルールは、不正な文字を含んでいる可能性のある入力データが、検証メソッドによるチェックを受けないまま出力SQLメソッドに渡されている場合に違反をレポートします。このルールはフロー解析ルールなので、入力データの取得と出力が別のメソッドに分かれていたり、複数の実行パスが存在する場合でも、実行パスを辿って違反を検出することができます。

dotTESTが検出する脆弱性(抜粋)一覧

※ セキュリティルール及びセキュリティコンプライアンス規約セットによる静的解析には「セキュリティコンプライアンスパック」のライセンス(有償)が必要です。

C# VB.NET対応 静的解析・単体テストツール dotTESTに
関するお問い合わせ

  • テクマトリックス株式会社
    東京本社

    ソフトウェアエンジニアリング事業部

    03-4405-7853

メールでのお問い合わせ
parasoft-info@techmatrix.co.jp

お問い合わせ

製品についてやテクマトリックスについてなど、
こちらよりお気軽にお問い合わせいただけます。