【お知らせ】この度、当社の「善良なスクワッティング戦略(フィッシングテイクオーバー)」が、NIKKEI COMPASS、CNET Japan、ZDNET JAPAN、 産経新聞、東洋経済オンライン、NewsPicksを始めとする、24のメディア様にて掲載いただきました。 詳細を確認

ウェブサイト脆弱性:X-Frame-Optionsヘッダーが設定されていない

ウェブサイト脆弱性:X-Frame-Optionsヘッダーが設定されていない

2023年7月26日

X-Frame-Optionsヘッダーが設定されていない場合、ウェブサイトはフレーム内で読み込むことが可能となり、"clickjacking"(クリックジャッキング)という攻撃のリスクが高まります。クリックジャッキングは、攻撃者が透明なフレームを使用してユーザーに見えない形で別のページを重ねる技術で、ユーザーが意図しないクリックや入力を行わせることが可能です。例えば、ユーザーがクリックしたつもりのボタンが実は攻撃者が設定した別のリンクやボタンである可能性があります。

日本の上場企業3715社の公式サイトのX-frame options header対応率 出典: 日本の上場企業3715社の公式サイトのSSL/TLSセキュリティ脆弱性ダッシュボード

X-Frame-Optionsヘッダーとは

X-Frame-Optionsはウェブブラウザに対してページがフレーム内でどのように表示されるべきかを指示するHTTPレスポンスヘッダーです。フレームとは一つのウェブページ内に別のページを埋め込むことができるHTML要素のことを指します。

X-Frame-Optionsヘッダーが設定されていない場合、ウェブサイトはフレーム内で読み込むことが可能となり、"clickjacking"(クリックジャッキング)という攻撃のリスクが高まります。クリックジャッキングは、攻撃者が透明なフレームを使用してユーザーに見えない形で別のページを重ねる技術で、ユーザーが意図しないクリックや入力を行わせることが可能です。例えば、ユーザーがクリックしたつもりのボタンが実は攻撃者が設定した別のリンクやボタンである可能性があります。

X-Frame-Optionsヘッダーは次のように設定することが可能です:

  1. "DENY": フレーム内での表示を全面的に禁止します。
  2. "SAMEORIGIN": 同一オリジンのページ(つまり、同じドメイン、プロトコル、ポートのページ)からのみフレーム内表示を許可します。
  3. "ALLOW-FROM uri": 指定したuriからのフレーム内表示を許可します。

したがって、ウェブサイトのセキュリティを強化するためには、適切にX-Frame-Optionsヘッダーを設定することが重要です。

NginxでX-Frame-Optionsヘッダーを設定する方法

Nginxでは、HTTPレスポンスヘッダーの**X-Frame-Optionsを設定するためには、サーバーブロック(server { })もしくはロケーションブロック(location { })内でadd_header**ディレクティブを使用します。

以下に具体的な設定方法の例を示します。この例では、同一オリジンからのフレーム内表示のみを許可する設定(SAMEORIGIN)を行っています:

server {
    listen 80;
    server_name your-domain.com;

    location / {
        add_header X-Frame-Options "SAMEORIGIN";
    }
}

この設定を適用した後には、Nginxの再起動またはリロードが必要です。これにより、ウェブブラウザはこのウェブサイトをフレーム内で表示する際に、同一オリジンからの表示のみを許可するようになります。

なお、特定のURIからのフレーム内表示のみを許可したい場合(ALLOW-FROM uri)は、以下のように設定します:

server {
    listen 80;
    server_name your-domain.com;

    location / {
        add_header X-Frame-Options "ALLOW-FROM https://example.com/";
    }
}

ただし、ALLOW-FROMは一部のブラウザでは非対応のため、ブラウザの対応状況を確認するか、Content Security Policy(CSP)のframe-ancestorsディレクティブを使用することを検討してみてください。

X-Frame-Optionsヘッダーが設定されていないと何が問題なのか

X-Frame-Optionsヘッダーが設定されていない場合、以下のような問題が発生する可能性があります。

  1. クリックジャッキング(Clickjacking)攻撃: クリックジャッキングは、攻撃者が被害者をだまして、意図しない操作を実行させる攻撃手法です。攻撃者は透明なフレーム(iframe)を使用し、被害者が意図しないクリックやボタンの操作を実行させます。X-Frame-Optionsヘッダーを適切に設定することで、他のドメインからのフレーム内での表示を制限し、クリックジャッキング攻撃を防止できます。
  2. クロスサイトスクリプティング(XSS)攻撃: クロスサイトスクリプティングは、攻撃者がウェブサイト上でスクリプトを注入し、被害者のブラウザ上で実行させる攻撃手法です。X-Frame-Optionsヘッダーを適切に設定することで、他のドメインからのフレーム内での表示を制限し、XSS攻撃を防止できます。
  3. クロスオリジンリソース共有(CORS)問題: クロスオリジンリソース共有は、異なるオリジン(ドメイン)間でリソースの共有を制御するメカニズムです。X-Frame-Optionsヘッダーを適切に設定することで、他のドメインからのフレーム内での表示を制限し、CORS問題を回避できます。

これらの問題は、ウェブアプリケーションのセキュリティに対する重要な脆弱性です。X-Frame-Optionsヘッダーを適切に設定することで、これらの攻撃を防止し、ユーザーのデータやセッションの安全性を確保することができます。

NginxでX-Frame-Optionsヘッダーを設定する方法

NginxでX-Frame-Optionsヘッダーを設定するには、以下の手順に従ってください:

  1. Nginxの設定ファイル(通常は**nginx.confsites-available**ディレクトリ内の個別の設定ファイル)を開きます。
  2. **serverディレクティブ内に、以下のようなadd_header**ディレクティブを追加します:
server {
    # 他の設定...

    add_header X-Frame-Options "SAMEORIGIN";

    # 他の設定...
}

上記の例では、**X-Frame-Optionsヘッダーの値をSAMEORIGIN**に設定しています。これにより、同じオリジンからのみフレーム内での表示が許可されます。

別のオプションとしては、**DENY**を使用することもできます。これにより、すべての外部ドメインからのフレーム内での表示が禁止されます。

add_header X-Frame-Options "DENY";

変更を保存し、Nginxを再起動します。

sudo service nginx restart

これで、NginxはX-Frame-Optionsヘッダーを適切に設定し、フレーム内での表示を制限するようになります。