一人前エンジニア道場

バックエンド開発 / 約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)

スキルセルフチェック

このレッスンの内容をどの程度理解できましたか?