🔑

Webアプリ開発時にセキュリティ面で気をつけることメモ

2022/05/02に公開

体系的に学ぶ 安全な Web アプリケーションの作り方 第 2 版(通称:徳丸本)を読んで、Web アプリを開発するときに気をつけておきたいことをリスト形式でまとめておきたいと感じ、記事にしました!

実際にはもっと細かく丁寧に多くのことが書いてありますが、チェックリストっぽく利用するにあたって適度なボリュームにしたいと考え、個人の裁量で記載しなかった項目もあります。逆に勝手に追加した部分もあります。(これは記載しとくべき、のようなご意見お待ちしてます...!)

非常に勉強になる書籍だったので、Web アプリの開発者・プロダクトマネージャー等問わず読むことをおすすめします!

  • HTTP ヘッダー
    • IE の Content-Type 自動認識を利用した XSS 防止 -> X-Content-Type-Options: nosniff
    • クリックジャッキング防止 -> X-Frame-Options: DENY または SAMEORIGIN
    • XSSProtection 設定の強制 -> X-XSS-Protection: 1; mode=block
    • HTTPS 強制(HSTS) -> Strict-Transport-Security: max-age=31536000; includeSubDomains
    • 読み込みソースの制限 -> Content-Security-Policy
    • Access-Control 系の CORS ヘッダーを適切に指定している
    • Content-Type で MIME タイプと文字エンコーディングを適切に指定している
    • MIME タイプによるバリデーションをおこなっている
    • サーバーのバージョン情報が露出していない
  • インジェクション攻撃対策
    • HTML や入力文字列に対して適切なエスケープが行われている
    • 文字集合に Unicode(推奨)、文字エンコーディングに utf-8(推奨)が統一して使用されている(尾骶骨テスト、つちよしテスト)
    • マルチバイト対応の関数を使用し、文字エンコーディングの指定は明示的に行っている
    • SQL 文はプレースホルダで組み立てている
    • HTTP ヘッダー、メールヘッダー、リダイレクト先の URL、eval・setTimeout 関数やファイルインクルード、システムコマンド呼び出し関数に渡す文字列に利用者が設定できる値を使用していない
    • innerHTML 等を使用した DOM 操作は適切なエスケープの上行われている
  • Cookie,Session
    • Cookie を使用している場合、Secure 属性と HttpOnly 属性が指定されている
    • セッション ID や権限周りの情報、機密情報を URL で受け渡ししていない
    • セッション ID には推測不可能な値を使用し、認証されたときに更新し、Cookie に保管している
  • 認証・認可
    • ユーザー関連、料金関連などの重要なイベントでは成功・失敗も含めてログが出力され、本人にメールが送信されるようになっている
    • 重要なイベント前に再度パスワードを要求する
    • 重要なイベントでの過剰なエラーに対して、アカウントロックなどの処置が行われている
    • 認可制御が URL やブラウザ JS だけではなく、サーバー側で行われている
    • パスワードを自前で保管する場合はハッシュ化、ソルト付け、ストレッチングされて格納されている
  • その他アプリケーションの実装に関する部分
    • JSONP を使用していない
    • iframe 内で postMessage を使用している場合、送信先と送信元のオリジンチェックを行っている
    • web ストレージに、利用者に見られて困るような機密情報を格納していない
    • 安全なデシリアライズ関数を使用している
    • ファイルアップロードのできる部分に関しては、容量制限、ウィルスチェック(推奨)、権限制御が行われている
    • ファイルダウンロードはサーバー上ではなく、ブラウザで行わせている
    • XML を読み込む場合、外部実体参照を制限している
    • CSRF 対策として、CORS 制御、ヘッダーによる認証、CSRF トークンの使用が行われている
    • 排他制御、コード内の共有資源の利用が正しく行われている
    • エラーログ・アクセスログ・デバッグログが必要十分に出力されている(パスワードやカード情報などを出力しない)
  • その他インフラに関する部分
    • HTTPS を使用している(オレオレ証明書は使わない)
    • 必要最低限のサービス、ポートのみオープンしている
    • ユーザーごとに表示が異なるページのキャッシュが正しく設定されている
    • 依存しているサービス、言語などがサポート期間内である
    • SSH サーバーではパスワード認証は使用せず、公開鍵認証のみ使用する
    • AWS のようなクラウドサービスでは 2 段階認証を設定している
    • DNSSEC を導入している
  • その他、ウェブ健康診断仕様を満たしている
GitHubで編集を提案

Discussion