cat posts/%e3%82%bb%e3%82%ad%e3%83%a5%e3%83%aa%e3%83%86%e3%82%a3%e3%82%92%e5%be%8c%e5%9b%9e%e3%81%97%e3%81%ab%e3%81%97%e3%81%a6%e3%81%84%e3%81%9f%e8%87%aa%e5%88%86%e3%81%b8%e3%81%ae%e5%8f%8d%e7%9c%81%e6%96%87.md

セキュリティを後回しにしていた自分への反省文

「動けばいい」で作っていた時期のコードを見直して、いくつか青ざめました。

機能開発を優先していて、セキュリティは「後でちゃんとやる」と思っていました。後でやった結果、直すコストが高くついた箇所をまとめます。

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 を一度通しで読んでおくと、チェックリストとして使えます。