{"title":"クリックジャッキング対策","version":"5.0","locale":"ja","docname":"ref/clickjacking","url":"/ja/5.0/ref/clickjacking/","canonical":"https://djangodocs.dev/ja/5.0/ref/clickjacking/","summary":"クリックジャッキングミドルウェアとデコレータは、 clickjacking 攻撃に対する防御を簡単に使える形で提供します。このタイプの攻撃は、悪意のあるサイトがユーザをだまし、隠された frame や iframe にロードした別サイトの要素をクリックさせることで起こります。 クリックジャッキングの例 Link to this…","html":"<span id=\"clickjacking-protection\"></span><h1>クリックジャッキング対策<a class=\"heading-anchor\" href=\"#module-django.middleware.clickjacking\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>クリックジャッキングミドルウェアとデコレータは、 <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/Clickjacking\">clickjacking</a> 攻撃に対する防御を簡単に使える形で提供します。このタイプの攻撃は、悪意のあるサイトがユーザをだまし、隠された frame や iframe にロードした別サイトの要素をクリックさせることで起こります。</p>\n<section id=\"an-example-of-clickjacking\">\n<h2>クリックジャッキングの例<a class=\"heading-anchor\" href=\"#an-example-of-clickjacking\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>あるオンラインストアのサイトに、ログインユーザが「今すぐ購入」ボタンを押すことで商品を買えるようなページがあるとしましょう。あるユーザが利便性のためログインし続けることを選択していたとします。そして攻撃者が彼ら自身のサイトのページに 「私はポニーが好きです」ボタンを作り、さらに透明な iframe に先ほどのストアのページをロードして『「今すぐ購入」ボタンが彼らの「私はポニーが好きです」ボタンを真上に来るように』重ねたとします。もしそのユーザが攻撃者のサイトを訪ねて「私はポニーが好きです」ボタンをクリックしてしまうと、無意識に「今すぐ購入」 ボタンをクリックすることとなり、身に覚えの無い品物を購入することになってしまいます。</p>\n</section>\n<section id=\"preventing-clickjacking\">\n<span id=\"clickjacking-prevention\"></span><h2>クリックジャッキングを防止する<a class=\"heading-anchor\" href=\"#preventing-clickjacking\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>モダンブラウザでは、frame や iframe の中にあるリソースをロードして良いかどうかを示す <a class=\"reference external\" href=\"https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options\">X-Frame-Options</a> HTTP ヘッダの指定を尊重します。もしサーバからのレスポンスに <code class=\"docutils literal notranslate\"><span class=\"pre\">SAMEORIGIN</span></code> という値を指定した X-Frame-Options ヘッダが含まれていた場合、ブラウザは frame 中のリソースが同一サイトに由来する場合に限り、そのリソースをロードします。もしヘッダが <code class=\"docutils literal notranslate\"><span class=\"pre\">DENY</span></code> に設定されていた場合、どのサイトがリクエスト元であろうとブラウザは frame 中のリソースのロードを問答無用でブロックします。</p>\n<p>Django はこのヘッダをレスポンスに含めるための方法をいくつか提供します:</p>\n<ol class=\"arabic simple\">\n<li><p>すべてのレスポンスにこのヘッダを設定するミドルウェア</p></li>\n<li><p>そのミドルウェアの動作をオーバーライドする、または単純に特定のビューにだけこのヘッダを設定するデコレータのセット</p></li>\n</ol>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">X-Frame-Options</span></code> HTTP ヘッダは、まだそれがレスポンス中に存在しない場合に、ミドルウェアまたはビューのデコレータでのみ設定されます。</p>\n</section>\n<section id=\"how-to-use-it\">\n<h2>使用方法<a class=\"heading-anchor\" href=\"#how-to-use-it\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"setting-x-frame-options-for-all-responses\">\n<h3>X-Frame-Options をすべてのレスポンスに設定する<a class=\"heading-anchor\" href=\"#setting-x-frame-options-for-all-responses\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>サイト内のすべてのレスポンスに対して同じ <code class=\"docutils literal notranslate\"><span class=\"pre\">X-Frame-Options</span></code> 値を設定するには、<code class=\"docutils literal notranslate\"><span class=\"pre\">'django.middleware.clickjacking.XFrameOptionsMiddleware'</span></code> を <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> に追加します:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">MIDDLEWARE</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"o\">...</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.middleware.clickjacking.XFrameOptionsMiddleware&quot;</span><span class=\"p\">,</span>\n    <span class=\"o\">...</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>このミドルウェアは、<a class=\"reference internal\" href=\"/ja/5.0/ref/django-admin/#django-admin-startproject\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">startproject</span></code></a> が生成する設定ファイルでは最初から有効化されています。</p>\n<p>デフォルトでは、このミドルウェアはすべての <code class=\"docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code> の <code class=\"docutils literal notranslate\"><span class=\"pre\">X-Frame-Options</span></code> ヘッダを <code class=\"docutils literal notranslate\"><span class=\"pre\">DENY</span></code> に設定します。もし他の値にしたい場合は <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-X_FRAME_OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">X_FRAME_OPTIONS</span></code></a> を次のように設定します:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">X_FRAME_OPTIONS</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;SAMEORIGIN&quot;</span>\n</code></pre></div>\n<p>このミドルウェアを使うにあたって、いくつかのビューでは <code class=\"docutils literal notranslate\"><span class=\"pre\">X-Frame-Options</span></code> ヘッダを <strong>設定したくない</strong> かもしれません。そのような場合にはヘッダを設定しないよう、ビューデコレータでミドルウェアに指示できます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.decorators.clickjacking</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">xframe_options_exempt</span>\n\n\n<span class=\"nd\">@xframe_options_exempt</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">ok_to_load_in_a_frame</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"s2\">&quot;This page is safe to load in a frame on any site.&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>フレームやiframe内でフォームを送信したり、セッションクッキーにアクセスしたい場合は、 <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CSRF_COOKIE_SAMESITE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CSRF_COOKIE_SAMESITE</span></code></a> や <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-SESSION_COOKIE_SAMESITE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SESSION_COOKIE_SAMESITE</span></code></a> の設定を変更する必要があるかもしれません。</p>\n</aside>\n<aside class=\"version-note version-changed\" data-version=\"5.0\">\n<p class=\"version-note-title\">Changed in Django 5.0</p><p><code class=\"docutils literal notranslate\"><span class=\"pre\">&#64;xframe_options_exempt</span></code> デコレーターに、非同期ビュー関数をラップする機能が追加されました。</p>\n</aside>\n</section>\n<section id=\"setting-x-frame-options-per-view\">\n<h3>Setting <code class=\"docutils literal notranslate\"><span class=\"pre\">X-Frame-Options</span></code> をビューごとに設定する<a class=\"heading-anchor\" href=\"#setting-x-frame-options-per-view\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">X-Frame-Options</span></code> ヘッダをビューごとに設定するために、Django は次のようなデコレータを提供しています:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.decorators.clickjacking</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">xframe_options_deny</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.decorators.clickjacking</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">xframe_options_sameorigin</span>\n\n\n<span class=\"nd\">@xframe_options_deny</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">view_one</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"s2\">&quot;I won&#39;t display in any frame!&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"nd\">@xframe_options_sameorigin</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">view_two</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"s2\">&quot;Display in a frame if it&#39;s from the same origin as me.&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>なお、これらのデコレータはミドルウェアとともに使うことができます。 デコレータの指定は、ミドルウェアの指定よりも優先されます。</p>\n<aside class=\"version-note version-changed\" data-version=\"5.0\">\n<p class=\"version-note-title\">Changed in Django 5.0</p><p><code class=\"docutils literal notranslate\"><span class=\"pre\">&#64;xframe_options_deny</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">&#64;xframe_options_sameorigin</span></code> デコレーターに、非同期ビュー関数をラップする機能が追加されました。</p>\n</aside>\n</section>\n</section>\n<section id=\"limitations\">\n<h2>制限事項<a class=\"heading-anchor\" href=\"#limitations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">X-Frame-Options</span></code> header will only protect against clickjacking in\n<a class=\"reference external\" href=\"https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options#browser_compatibility\">modern browsers</a>.</p>\n</section>","rootId":"module-django.middleware.clickjacking","toc":[{"title":"クリックジャッキングの例","anchor":"an-example-of-clickjacking","children":[]},{"title":"クリックジャッキングを防止する","anchor":"preventing-clickjacking","children":[]},{"title":"使用方法","anchor":"how-to-use-it","children":[{"title":"X-Frame-Options をすべてのレスポンスに設定する","anchor":"setting-x-frame-options-for-all-responses","children":[]},{"title":"Setting X-Frame-Options をビューごとに設定する","anchor":"setting-x-frame-options-per-view","children":[]}]},{"title":"制限事項","anchor":"limitations","children":[]}],"breadcrumbs":[{"docname":"ref/index","title":"API リファレンス","url":"/ja/5.0/ref/"}],"prev":{"docname":"ref/class-based-views/flattened-index","title":"クラスベースのジェネリックビュー: フラットインデックス","url":"/ja/5.0/ref/class-based-views/flattened-index/"},"next":{"docname":"ref/contrib/index","title":"contrib パッケージ","url":"/ja/5.0/ref/contrib/"},"formats":{"html":"/ja/5.0/ref/clickjacking/","markdown":"/ja/5.0/ref/clickjacking.md","json":"/ja/5.0/ref/clickjacking.json"},"source":"https://github.com/django/django/blob/stable/5.0.x/docs/ref/clickjacking.txt","official":"https://docs.djangoproject.com/ja/5.0/ref/clickjacking/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}