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予約語、もパラメータとして扱えない
用いてもいいパターン
- ない
解決策
- 誰も信用しない
- 入力のフィルタリング
- プリペアドステートメント
- ユーザの入力をコードから隔離する
- コードレビューしてもらう
まとめ
ユーザーには、値の入力は許可しても、コードの入力を許可してはいけません。
感想
用いてもいいパターンの説明がはっきり書いてあります。
最大限注意するしかない