あゆの塩焼きブログ

「除外」より「許可」セキュアで読みやすいコードにしよう

Agenda目次
  • ・🔍ブラックリスト or ホワイトリスト?
  • ・🧩「不要なものを除外」すると実は複雑になりがちな理由
  • ・💡発想転換!「許可リスト方式」でコードをシンプルに
  • ・🛡️「許可リスト方式」の意外なメリット──バグやセキュリティ問題を防止
  • ・✅ まとめ──迷ったら「許可リスト方式」を使おう!

🔍ブラックリスト or ホワイトリスト?

プログラミングをしていると、「何かを制限する」「不要なものを除外する」といった実装をする機会がありますよね。

私も最近、ある機能を開発中に「不要なものを除外する」という考え方で実装しました。しかし、その結果としてコードが複雑になり、予期せぬ影響を心配して考慮事項が増えてしまいました。

そこで思い切って発想を逆転させて「必要なものだけを許可する」という考え方に切り替えて実装してみました。すると驚くほどコードがシンプルになり、将来のメンテナンス性も劇的に向上しました。

今回は、この実体験をもとに、「許可リスト方式」のメリットと実践法について具体的に解説します。

🧩「不要なものを除外」すると実は複雑になりがちな理由

例えば、あるユーザー入力フォームで特定の文字やデータを禁止する場合、こんな実装になりがちです。

if input.match?(/[!"#$%&'()=~|`{}+*<>?_]/)
  raise "禁止文字が含まれています"
end

しかし、この方法では禁止対象が増えるたびにコードの更新が必要になり、考慮事項が次々と増えてしまいます。

その結果、コードは複雑化し、メンテナンス性が落ちてしまうのです。

💡発想転換!「許可リスト方式」でコードをシンプルに

逆に、許可したい文字やデータを明示的に指定する方法ならどうでしょうか。

unless input.match?(/\A[a-zA-Z0-9]+\z/)
  raise "許可されていない文字が含まれています"
end

この方法なら、許可範囲を決めるだけで済み、追加や変更時の負担が劇的に減ります

実装もシンプルになり、誰が見てもわかりやすいコードになります。

🛡️「許可リスト方式」の意外なメリット──バグやセキュリティ問題を防止

「許可リスト方式」には、意図しないデータを許可しないため、予期せぬバグやセキュリティ問題を防ぐというメリットもあります。

実際、私自身が最近勉強しているセキュアプログラミングの分野でも、「禁止リスト方式」よりも安全性が高い「許可リスト方式」の採用が推奨されています。

IPA(情報処理推進機構)の資料でも、「許可リスト方式(ホワイトリスト方式)を推奨」と明確に書かれています。

参考:IPA セキュア・プログラミング講座

✅ まとめ──迷ったら「許可リスト方式」を使おう!

  • 「除外する」方法は複雑で変更に弱い
  • 「許可する」方法はシンプルで安全
  • セキュリティ上も推奨される

この考え方を取り入れることで、あなたのコードは一気に洗練され、安全性も向上します。

ぜひあなたのプロジェクトでも試してみてくださいね!

Loading...