SQLインジェクションは、Webサイトの検索欄やログイン欄などの入力値をそのままデータベースへの命令(SQL)に組み込んでいる作りの弱点を突き、データベースの中身を盗み出したり、書き換えたり、消したりする攻撃です。会員情報やカード情報の大量漏洩の原因になってきました。根本対策は、入力値を命令の一部として扱わない作り(プレースホルダ)にすることです。
なぜ起きるのか
プログラムが、利用者の入力を文字列としてつなぎ合わせてデータベースへの命令を作っていると、入力の中に命令の一部となる記号を混ぜられたとき、開発者が意図しない命令が実行されてしまいます。
開発者が取るべき対策
| 対策 | 位置づけ |
|---|---|
| プレースホルダ(パラメータ化クエリ)でSQLを組み立てる | 根本的な解決 |
| エラーメッセージにデータベースの詳細を表示しない | 情報を与えない |
| データベースのアカウントの権限を必要最小限にする | 被害を小さくする |
| WAFで攻撃的な通信を止める | 保険的な対策(解説) |
| リリース前と定期的な脆弱性診断 | 見落としを見つける(解説) |
発注者が確認すること:Webサイトの制作を外部に頼む場合は、IPAの「安全なウェブサイトの作り方」に沿った対策をしているか、診断を受けたかを確認しましょう(セキュアな開発)。