状況
ログイン画面から受け取ったメールアドレスで利用者を探すコードを AI アシスタントに書かせた。email は利用者が入力した文字列そのもの。
最も優先して直すべき点は?
cur.execute(f"SELECT * FROM users WHERE email = '{email}'")正答
- SELECT * をやめ、使う列だけを並べたほうが速く読みやすい
- メールアドレスは大文字小文字が混ざるので、LOWER で比べるべき
- 入力を SQL の文字列に直接埋め込んでおり、SQL インジェクションになる
- f 文字列は古い Python で動かないので、format を使うべき
解説
email に ' OR '1'='1 のような文字列を入れられると、WHERE が常に真になって全利用者が返る。入力を f 文字列で SQL に埋め込むコードは AI がよく出す形で、動作確認では普通のメールアドレスしか入れないので気づきにくい。cur.execute("SELECT ... WHERE email = ?", (email,)) のようにプレースホルダで値を渡せば、入力は値として扱われる。SELECT * や大文字小文字の扱いは改善点だが、認証を回避される危険に比べれば優先度は低い。f 文字列は現在サポートされている Python ではすべて使える。
参考: cheatsheetseries.owasp.org
この問題を含む AI の出力チェック のテストを制限時間つきで解く
AI の出力チェッククイズへ