「動けばいい」で作っていた時期のコードを見直して、いくつか青ざめました。
機能開発を優先していて、セキュリティは「後でちゃんとやる」と思っていました。後でやった結果、直すコストが高くついた箇所をまとめます。
SQL インジェクション
// やってしまっていたこと
const query = `SELECT * FROM users WHERE name = '${name}'`;
// 正しい書き方
const query = `SELECT * FROM users WHERE name = ?`;
db.query(query, [name]);
文字列を直接 SQL に埋め込んでいました。プレースホルダを使うだけで防げます。ORM を使えばほぼ自動で対処されますが、生 SQL を書くときは意識が必要です。
環境変数とシークレット
API キーをコードに直書きして、そのままリポジトリにコミットしたことがあります。GitHub の自動スキャンに引っかかって気づきました。シークレットは必ず環境変数で管理し、.gitignore に .env を入れます。
認証の甘さ
パスワードを平文で保存していたことがありました(初期の個人プロジェクトです)。bcrypt や argon2 でハッシュ化するのは今では必須の認識ですが、最初はそこまで考えていませんでした。
セキュリティの問題は「動いている間は気づかない」のが怖いところです。OWASP Top 10 を一度通しで読んでおくと、チェックリストとして使えます。