AI の出力チェック4 択難易度 標準

状況

ログイン画面から受け取ったメールアドレスで利用者を探すコードを AI アシスタントに書かせた。email は利用者が入力した文字列そのもの。

最も優先して直すべき点は?

cur.execute(f"SELECT * FROM users WHERE email = '{email}'")

正答

  1. SELECT * をやめ、使う列だけを並べたほうが速く読みやすい
  2. メールアドレスは大文字小文字が混ざるので、LOWER で比べるべき
  3. 入力を SQL の文字列に直接埋め込んでおり、SQL インジェクションになる
  4. f 文字列は古い Python で動かないので、format を使うべき

解説

email に ' OR '1'='1 のような文字列を入れられると、WHERE が常に真になって全利用者が返る。入力を f 文字列で SQL に埋め込むコードは AI がよく出す形で、動作確認では普通のメールアドレスしか入れないので気づきにくい。cur.execute("SELECT ... WHERE email = ?", (email,)) のようにプレースホルダで値を渡せば、入力は値として扱われる。SELECT * や大文字小文字の扱いは改善点だが、認証を回避される危険に比べれば優先度は低い。f 文字列は現在サポートされている Python ではすべて使える。

参考: cheatsheetseries.owasp.org

pythonsql-injectionplaceholder

この問題を含む AI の出力チェック のテストを制限時間つきで解く

AI の出力チェッククイズへ