バックエンド開発 / 約25分
他人のコードのセキュリティを読む
なぜこれを学ぶか
実務では、他人(またはAI)が書いたコードのセキュリティを評価する場面が頻繁にあります。典型的な脆弱性パターンを「見つける目」を養いましょう。
コードレビューでまず見るべき箇所: SQLの組み立て(文字列連結があれば即NG)、認可チェックの有無、機密情報のハードコード、ユーザー入力の信頼。
SQLインジェクションは今も上位の脆弱性です。"SELECT * FROM users WHERE id = " + userId というコードを見たら、即座にストップをかけましょう。プレースホルダ(? や $1)を使います。
パスワードの平文保存、APIキーのコード直書きも典型的な事故です。秘密情報は環境変数・シークレット管理サービスへ。
レビュー指摘の際は「このコードはダメ」ではなく「どう攻撃されるか」を説明すると、相手に伝わり、チームの学びにもなります。
重要ポイント
- SQLの文字列連結を見たら即指摘
- 秘密情報のハードコードは絶対NG
- 指摘は「攻撃シナリオ」で説明する
コードレビュー演習
チームの既存コードを読んでいます。ログイン機能の一部です。
app.post('/login', async (c) => {
const { email, password } = await c.req.json()
const user = await db.query(
"SELECT * FROM users WHERE email = '" + email + "'"
)
if (user && user.password === password) {
const token = createToken(user.id)
return c.json({ token })
}
return c.json({ error: 'invalid' }, 401)
})このコードに含まれる脆弱性の組み合わせとして正しいものは?
ヒントを見る
2箇所に注目してください: ①SQL文を「文字列連結」で組み立てている部分(emailに攻撃用文字列が入ったら?)②パスワードを「そのまま === で比較」している部分(DBに平文で保存されているという意味です)。
コーディング演習実際に書く
SQLインジェクションの「兆候」を検出する関数を書いてください。ユーザー入力の文字列を受け取り、シングルクォート(')、ダブルハイフン(--)、セミコロン(;) のいずれかを含む場合は true(危険)、含まない場合は false を返します。
function detectSqlInjection(input)
スキルセルフチェック
このレッスンの内容をどの程度理解できましたか?