状況
社内向け管理画面の検索機能の PR をレビューしている。PR の説明には「社内からしか使わないので、入力チェックは不要と判断しました」とある。
レビュアーとして適切な対応は?
const sql = "SELECT * FROM users WHERE name = '" + req.query.name + "'";const rows = await db.query(sql);正答
- 社内向けの画面なので、指摘せずに Approve する
- SQL インジェクションの危険を書き、プレースホルダ化を必須で求める
- SELECT * ではなく必要な列だけを取得するよう、必須で求める
- 作成者の判断を尊重し、セキュリティ担当に後で見てもらう
解説
入力値をそのまま連結して SQL を組み立てると、' OR '1'='1 のような入力で全件取得や改ざんが可能になる(SQL インジェクション)。社内向けでも、権限のない社員の操作や乗っ取られた端末からの攻撃は起こりうる。危険の内容と、プレースホルダ(パラメータ化クエリ)を使う直し方を添えて修正必須で指摘する。SELECT * の指摘は改善の範囲で、この脆弱性を直さない。後回しにすると問題を残したまま通る。
参考: cheatsheetseries.owasp.org
この問題を含む 実務シチュエーション のテストを制限時間つきで解く
実務シチュエーションクイズへ