Help us understand the problem. What is going on with this article?

SQLアンチパターン:SQL インジェクション

More than 3 years have passed since last update.

SQLアンチパターンを読み始めたので、1つ1つ書いてのメモです

目的

  • 動的SQLを記述する
    • SQLクエリの文字列を作成し、実行する
    • アプリケーション内で文字列を作成、実行

アンチパターン

  • 未検証の入力をコードとして実行する
SELECT * FROM Bugs WHERE bug_id = $bug_id
$bug_id = "1234; DELETE FROM Bugs"
SELECT * FROM Bugs WHERE bug_id = 1234; DELETE FROM Bugs
  • SQL インジェクション は、SQL ステートメントが解析される前に構文を改変する

  • 'プリペアドステートメント' を用いて防ぐことが多い

    • プレスホルダーを使いSQLを実行する
    • 最も強力な防御手段。だが万能ではない
      • 値のリストを扱えない(IN句)
      • テーブル識別子、列名、SQL予約語、もパラメータとして扱えない

用いてもいいパターン

  • ない

解決策

  • 誰も信用しない
    • 入力のフィルタリング
    • プリペアドステートメント
    • ユーザの入力をコードから隔離する
    • コードレビューしてもらう

まとめ

ユーザーには、値の入力は許可しても、コードの入力を許可してはいけません。

感想

用いてもいいパターンの説明がはっきり書いてあります。
最大限注意するしかない

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away