ウェブサイトでのセキュリティは、非常に重要な問題です。
情報漏洩や不正アクセスなどのセキュリティ事故は、企業の信頼を損ない、大きな問題に発展する可能性があります。
IPA(情報処理推進機構)が提供する「安全なウェブサイトの作り方」では、各種脆弱性を防ぐための具体的な対策を示しています。
簡単ではありますが、その内容をご紹介します。
| 概要 | 対策 | |
|---|---|---|
| 1. SQLインジェクション | データベースに対する不正なSQLクエリを実行させる攻撃。攻撃者は、入力フォームやURLパラメータを通じて悪意のあるSQLコードを挿入し、データベースの情報を盗み出したり、改ざんしたりする。 | プリペアドステートメントの使用や入力値のエスケープが推奨。これにより、SQLクエリの構造を保護し、不正なコードの実行を防止。 |
| 2. OSコマンド・インジェクション | サーバー上で不正なOSコマンドを実行させる攻撃。攻撃者は、ウェブアプリケーションの脆弱性を利用して、システムコマンドを実行し、サーバーの制御を行う。 | 外部コマンドの呼び出しを避けることや、入力値の検証が重要。特に、ユーザーからの入力を直接コマンドに渡さないようにすることが必要。 |
| 3. パス名パラメータの未チェック / ディレクトリ・トラバーサル | サーバー上の任意のファイルにアクセスする攻撃。攻撃者は、相対パスを利用して、ウェブサーバーのルートディレクトリ外のファイルにアクセスする。 | 入力値の検証やファイルパスの固定が重要。ユーザーが指定するファイルパスを厳密に制限し、許可されたディレクトリ内のファイルのみをアクセス可能にする。 |
| 4. セッション管理の不備 | セッションIDの盗難や不正利用。攻撃者は、セッションIDを盗み取ることで、正当なユーザーになりすまし、機密情報にアクセスする。 | セッションIDの適切な管理とセキュアな通信(HTTPS)の使用を推奨。セッションIDは、予測不可能な値にし、セッションの有効期限を設定することが重要。 |
| 5. クロスサイト・スクリプティング(XSS) | ウェブページに埋め込む攻撃。攻撃者は、ブラウザでスクリプトを実行させ、クッキー情報の盗難やフィッシング詐欺を行う。 | 出力時のエスケープやコンテンツセキュリティポリシー(CSP)の設定が有効。特に、ユーザーからの入力をそのまま表示する際には、HTMLエスケープを行うことが必要。 |
| 6. CSRF(クロスサイト・リクエスト・フォージェリ) | ユーザーが意図しないリクエストを送信させる攻撃。攻撃者は、ユーザーが認証済みのセッションを利用して、不正な操作を行う。 | CSRFトークンの使用やRefererヘッダのチェックが推奨。CSRFトークンは、フォーム送信時に一意のトークンを付与し、サーバー側で検証する。 |
| 7. HTTPヘッダ・インジェクション | 不正なHTTPヘッダを挿入する攻撃。攻撃者は、レスポンスヘッダを改ざんし、リダイレクトやキャッシュポイズニングを行う。 | 入力値の検証とエスケープが重要。特に、ユーザーからの入力をHTTPヘッダに含める際には、改行文字や特殊文字をエスケープすることが必要。 |
| 8. メールヘッダ・インジェクション | 不正なメールヘッダを挿入する攻撃。攻撃者は、メール送信機能を悪用して、スパムメールやフィッシングメールを送信する。 | 入力値の検証とエスケープが重要。特に、メールアドレスや件名などの入力値をヘッダに含める際には、改行文字や特殊文字をエスケープすることが必要。 |
| 9. クリックジャッキング | ユーザーが意図しない操作を行わせる攻撃。攻撃者は、透明なフレームを重ねることで、ユーザーに誤ったクリックを誘導する。 | X-Frame-Optionsヘッダの設定やContent Security Policy(CSP)の使用が有効。これにより、外部サイトからのフレーム埋め込みを防ぐ。 |
| 10. バッファオーバーフロー | メモリ領域を超えるデータを書き込む攻撃。攻撃者は、プログラムのバッファサイズを超える入力を行い、メモリを上書きする。 | 入力値の長さをチェックし、バッファサイズを超えないようにすることが重要。特に、固定長のバッファを使用する際には、入力値の検証を徹底。 |
| 11. アクセス制御や認可制御の欠落 | 不正なアクセスや操作を許す脆弱性。攻撃者は、適切な認可が行われていないリソースにアクセスし、機密情報を搾取。 | 適切なアクセス制御と認可制御の実装が重要。特に、ユーザーの権限に応じたアクセス制御を行い、認可チェックを徹底する。 |
これらの対策によりセキュリティを高め、安全を確保することができます。
ぱっと読んだだけではわかりにくい部分もあるかと思いますので、詳しい内容はIPAのサイトを確認いただくのがよいと思います。
また、ウェブサイトの作り方はシステムで様々だと思いますので、参考になるかわかりませんが、一例として
- フロントエンド:React/Typescript
- バックエンド:C#
とした場合での対策例についてもご紹介します。
| 脆弱性 | React側主な対策例 | C#側主な対策例 | 重要な実装ポイント |
|---|---|---|---|
| SQLインジェクション | 入力バリデーション | パラメータ化、ORM(Entity Frameworkなど)、DB権限管理 | サーバ側主導が必須 |
| ディレクトリ・トラバーサル | ID方式採用、形式制限 | パス正規化・許可リスト | 必ずサーバで検証 |
| セッション管理 | Secure/HttpOnly/SameSite cookie | セッションID再発行、Cookie属性設定、HTTPS | Cookie属性制御&HTTPS |
| XSS | JSX出力自動エスケープ、DOMPurifyでサニタイズ | Razor自動エスケープ、CSPヘッダ | 出力時の自動orライブラリ対応 |
| CSRF | トークン取得&ヘッダ送信 | トークン生成・検証 | POST/PUT/DELETEメソッド限定 |
| ヘッダ注入 | ヘッダ生成は不可 | ユーザー入力ヘッダ利用禁止、制御文字排除 | サーバでのみ生成 |
| メールヘッダ注入 | 入力改行・特殊文字排除 | MailMessage利用、改行文字排除 | 生メール生成時は厳格検証 |
| クリックジャッキング | iframe検出・制御 | X-Frame-Optionsヘッダ、CSP frame-ancestors | 必ずバックエンドで設定 |
| バッファオーバーフロー | 安全(原則不要) | unsafe時のみバッファ検証、コンパイラ保護 | サーバ側安全性 |
| アクセス制御 | 画面ルーティング・表示制御(補助のみ) | ロール/リソース単位認可、秘密情報環境変数管理 | 必ずAPI/サーバで認可 |
これらを参考にセキュアなウェブサイトを作るキッカケになればと思います。

