<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>WordPress - 総合デジタルマーケティング企業 エスライン・テクノロジーズ</title>
	<atom:link href="https://slt-inc.jp/tag/wordpress/feed/" rel="self" type="application/rss+xml" />
	<link>https://slt-inc.jp</link>
	<description>Go Beyond with SLT - インターネット集客で事業者と顧客を繋ぐ</description>
	<lastBuildDate>Mon, 12 Oct 2026 08:05:04 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://slt-inc.jp/wp-content/uploads/2025/03/cropped-エスライン_テクノロジーズ_-_新ロゴ2025-removebg-32x32.png</url>
	<title>WordPress - 総合デジタルマーケティング企業 エスライン・テクノロジーズ</title>
	<link>https://slt-inc.jp</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>WordPressの脆弱性を確認する方法&#124;本体・プラグインの更新と対処の手順</title>
		<link>https://slt-inc.jp/article/wordpress-vulnerability-check/</link>
		
		<dc:creator><![CDATA[slt]]></dc:creator>
		<pubDate>Tue, 06 Oct 2026 02:18:00 +0000</pubDate>
				<category><![CDATA[セキュリティ]]></category>
		<category><![CDATA[記事]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[セキュリティチェック]]></category>
		<category><![CDATA[セキュリティ対策]]></category>
		<category><![CDATA[無料ツール]]></category>
		<category><![CDATA[脆弱性]]></category>
		<guid isPermaLink="false">https://slt-inc.jp/security/wordpress-vulnerability-check/</guid>

					<description><![CDATA[<p>WordPress&#x306E;&#x672C;&#x4F53;&#x3001;&#x30D7;&#x30E9;&#x30B0;&#x30A4;&#x30F3;&#x3001;&#x30C6;&#x30FC;&#x30DE;&#x306E;&#x8106;&#x5F31;&#x6027;&#x3092;&#x78BA;&#x8A8D;&#x3059;&#x308B;&#x624B;&#x9806;&#x3002;&#x7BA1;&#x7406;&#x753B;&#x9762;&#x3068;WP-CLI&#x3067;&#x7248;&#x3092;&#x6D17;&#x3044;&#x51FA;&#x3057;&#x3001;WordPress&#x516C;&#x5F0F;&#x306E;&#x767A;&#x8868;&#x3001;JVN iPedia&#x3001;NVD&#x3067;&#x5F71;&#x97FF;&#x3092;&#x53D7;&#x3051;&#x308B;&#x7248;&#x3068;&#x7167;&#x5408;&#x3057;&#x3066;&#x3001;&#x66F4;&#x65B0;&#x3001;&#x7F6E;&#x304D;&#x63DB;&#x3048;&#x3001;&#x524A;&#x9664;&#x3092;&#x5224;&#x65AD;&#x3057;&#x307E;&#x3059;&#x3002;</p>
<p>The post <a href="https://slt-inc.jp/article/wordpress-vulnerability-check/">WordPressの脆弱性を確認する方法|本体・プラグインの更新と対処の手順</a> first appeared on <a href="https://slt-inc.jp">総合デジタルマーケティング企業 エスライン・テクノロジーズ</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="slt-art">
<div class="slt-meta">最終確認日: 2026年10月12日 / 編集: エスライン・テクノロジーズ株式会社 Webサイトセキュリティ編集チーム</div>
<div class="slt-lead"><p class="slt-lead-label">この記事の結論</p><p>WordPressの脆弱性は、本体、プラグイン、テーマの版を一覧にし、公開の脆弱性情報に載る『影響を受ける版』と照らし合わせて確認します。該当したらバックアップを取ってから修正版へ更新し、修正版が無いものは停止して置き換えます。2026年は本体でも重大な修正が続き、公表から数日で悪用が確認された例もあるため、点検の頻度と担当を先に決めておくことが欠かせません。</p></div>

<h2>WordPressの脆弱性は、版の把握と公開情報との照合で確認する</h2>
<p>脆弱性の確認は、自分のサイトで動いている版を正確に知る作業と、その版が公開の脆弱性情報で『影響を受ける版』に入るかを照らす作業の2段階です。版が分からなければ照合できず、照合しなければ更新の優先順位も決められません。</p>
<p>版の把握には管理画面とWP-CLIを、照合にはWordPress公式の発表、JVN iPedia、NVDを使います。外からの確認は、攻撃者と同じ立場で、自分のサイトから何が見えているかを点検する作業です。4つの方法は、分かることと分からないことがそれぞれ違います。</p>
<div class="slt-table-wrap"><table class="slt-table"><thead><tr><th>確認の方法</th><th>分かること</th><th>分からないこと</th><th>必要なもの</th></tr></thead><tbody>
<tr><td>管理画面(サイトヘルス、更新画面)</td><td>更新待ちの有無、停止中のプラグイン、自動更新の不調</td><td>脆弱性の中身、更新通知が出ないプラグインの状態</td><td>管理者アカウント</td></tr>
<tr><td>WP-CLI</td><td>全プラグインの版、公式ディレクトリでの閉鎖、最終更新日</td><td>公式ディレクトリに無いプラグインの開発状況</td><td>SSHの接続とWP-CLI</td></tr>
<tr><td>公開の脆弱性情報</td><td>影響を受ける版、修正版、深刻度、悪用の有無</td><td>自分のサイトが該当するか(版との照合が要る)</td><td>版の一覧</td></tr>
<tr><td>外からの確認</td><td>外に出ている版の情報、公開されているファイル</td><td>管理画面の内側、ログイン後の機能</td><td>curl、または無料ツール</td></tr>
</tbody></table></div>
<div class="slt-callout is-point"><p class="slt-callout-title">ポイント</p><p>初回は全件を棚卸しし、2回目からは前回の記録との差分を見ます。差分で見ると、新しく入ったプラグインや、更新が止まったものにすぐ気づけます。</p></div>

<h2>脆弱性とは何か: 本体、テーマ、プラグインで起きる場所の違い</h2>
<p>脆弱性は、ソフトウェアやWebサイトの機能や性能を損なう、セキュリティ上の問題箇所です。IPAのセミナー資料『ウェブサイトの安全な運用について』は、放置するとサイトの乗っ取りや情報漏えいなどにつながるおそれがあると説明しています。Webサーバーの設定の不備も、脆弱性とみなされます。</p>
<p>WordPressでは、本体、テーマ、プラグインのどこでも脆弱性は見つかります。本体はWordPressのセキュリティチームが修正版を出し、多くは自動更新で届く仕組みです。プラグインとテーマは開発者ごとに対応が分かれ、管理者が更新しない限り古い版が残ります。</p>
<h3>本体: 2026年も重大な修正が続いている</h3>
<p>本体でも、深刻な脆弱性は見つかります。2026年7月17日のWordPress 7.0.2は、深刻度『critical』と『high』の2件を修正しました。影響を受ける版のサイトには、自動更新の仕組みで強制的に更新が配信されています。</p>
<p>2件の<a href="https://slt-inc.jp/glossary/cve/">CVE</a>番号は、CVE-2026-60137とCVE-2026-63030です。IPAは、組み合わせると遠隔でのコード実行が生じる可能性があるとして、7月22日に<a href="https://www.ipa.go.jp/security/security-alert/2026/alert20260722.html">WordPressの脆弱性対策についての注意喚起</a>を出しました。</p>
<p>9月以降も、17日の7.1.1で11件、22日の7.1.2で深刻度『critical』の1件、10月6日の7.1.3で7件のセキュリティ修正が出ています。7.1.3の7件には、<a href="https://slt-inc.jp/glossary/xss/">XSS(クロスサイトスクリプティング)</a>2件やSQLインジェクションの修正が含まれます。</p>
<p>2026年10月12日時点の最新版は7.1.3です。公式の<a href="https://wordpress.org/download/releases/">リリース一覧</a>は『7.1系の最新版だけが安全に使え、積極的に保守されている』と明記しています。古い系統にも修正が移植されることはありますが、公式はこれを厚意(courtesy)と位置づけ、2025年7月には4.1から4.6へのセキュリティ更新を終えました。</p>
<h3>プラグインとテーマ: 提供元ごとに対応が分かれる</h3>
<p>プラグインとテーマの修正版を出すのは、それぞれの開発者です。自動更新は既定で無効で、WordPress.orgのセキュリティチームが重大な脆弱性への対応として判断した特別な場合にだけ、自動で配信されます。開発が止まったものは修正版が出ないまま残り、セキュリティ上の問題などで公式ディレクトリから閉鎖されることもあります。</p>
<p>サーバーのPHPも、確認の対象です。WordPress公式の動作環境のページはPHP 8.3以上を推奨し、サポートが終わった古い版はサイトを脆弱性にさらすおそれがあると注意しています。</p>
<div class="slt-table-wrap"><table class="slt-table"><thead><tr><th>対象</th><th>修正版を出す人</th><th>既定の自動更新</th><th>主な確認先</th></tr></thead><tbody>
<tr><td>本体</td><td>WordPressのセキュリティチーム</td><td>マイナー版は自動。5.6以降の新規インストールは大型更新も自動</td><td>公式のセキュリティ発表、リリース一覧</td></tr>
<tr><td>プラグイン</td><td>各開発者</td><td>手動(重大な脆弱性で公式が判断した場合を除く)</td><td>公式ディレクトリのページ、提供元のサイト</td></tr>
<tr><td>テーマ</td><td>各開発者</td><td>手動(同上)</td><td>公式ディレクトリのページ、提供元のサイト</td></tr>
<tr><td>PHP</td><td>PHPの開発元(適用はサーバー会社)</td><td>サーバー会社の運用による</td><td>サーバーの管理画面、契約内容</td></tr>
</tbody></table></div>

<h2>管理画面で確認する: サイトヘルス、更新画面、プラグインの詳細</h2>
<p>管理画面では、『ツール』→『サイトヘルス』で自動更新の不調と更新待ちを、『ダッシュボード』→『更新』で更新の有無と互換性を確かめます。プラグインごとの最終更新日と対応する版を見る場所は、公式ディレクトリのページか、プラグイン一覧の『詳細を表示』です。</p>
<h3>サイトヘルスで『致命的な問題』を確認する</h3>
<p>サイトヘルスの『ステータス』タブは、結果を『致命的な問題』『おすすめの改善』『テスト通過』に分けて表示します。脆弱性の点検で見るのは、『バックグラウンド更新が想定通りに動作していません』『更新可能なプラグインがあります』『停止中のプラグインを削除してください』の3つです。1つ目が出ていれば、セキュリティ修正の自動更新が届いていない可能性があります。</p>
<p>『情報』タブには、本体の版のほか、有効と停止中それぞれのプラグインとテーマの版、自動更新の設定が並びます。『サイト情報をクリップボードにコピー』で全項目を文字で取り出せるので、点検記録に貼っておくと次回の比較に便利です。</p>
<h3>更新画面で、更新の有無と互換性を確認する</h3>
<p>『ダッシュボード』→『更新』には、本体、プラグイン、テーマ、翻訳の更新がまとめて表示されます。更新が出ているプラグインの行に出るのは、『WordPress 7.1.3 との互換性: はい (作成者による評価)』か『未確認』の表示です。この評価は作成者の自己申告で、動作の保証ではありません。</p>
<p>『この更新は現在使用中の PHP のバージョンでは動作しません』と出た更新は、PHPを上げるまで適用できません。修正版が出ていても入らないため、PHPの更新を先に計画します。</p>
<h3>プラグインの最終更新日と、対応する最新バージョンを見る</h3>
<p>公式ディレクトリのプラグインページには、『最終更新日』『有効インストール数』『WordPress バージョン』『検証済み最新バージョン』が並びます。管理画面の『詳細を表示』でも、同じ情報が『最終更新:』『対応する最新バージョン:』として出ます。検証済みの版が現在の本体(7.1.3)から大きく遅れているものは、保守が続いているかを確かめる対象です。</p>
<p>公式ディレクトリは、最新3回のメジャーリリースで検証されていないプラグインに黄色の警告を、閉鎖されたプラグインに赤色の警告を表示します。赤色の警告は『このプラグインは(日付)にクローズし、もうダウンロードできません』という形です。閉鎖から60日後には、セキュリティ上の問題(Security Issue)などの理由も示されます。</p>
<h3>使っていないプラグインとテーマを洗い出す</h3>
<p>『プラグイン』→『インストール済みプラグイン』の『停止中』で、使っていないプラグインを絞り込みます。サイトヘルスは『停止中のプラグインは攻撃者の標的になります』と表示し、使う予定が無ければ削除を勧めています。停止はプラグインを動かさないだけで、ファイルはサーバーに残るからです。</p>
<p>テーマも、停止中のものを削除します。ただしサイトヘルスは、有効なテーマ、その親テーマ、デフォルトテーマ1つは残すよう案内しています。使っているテーマに問題が起きたとき、WordPressが代わりに使うのがデフォルトテーマです。</p>
<ul class="slt-check">
<li>サイトヘルスに『バックグラウンド更新が想定通りに動作していません』が出ていない</li>
<li>『ダッシュボード』→『更新』に、適用していない更新が残っていない</li>
<li>停止中のプラグインが無く、停止中のテーマは親テーマとデフォルトテーマだけ</li>
<li>最新3回のメジャーリリースで検証されていないプラグインが無い</li>
<li>公式ディレクトリで閉鎖されたプラグインが無い</li>
<li>管理者権限のユーザーが、現在の担当者だけになっている</li>
</ul>
<div class="slt-callout is-warn"><p class="slt-callout-title">注意</p><p>プラグインを削除すると、作りによっては設定や専用のデータベースのテーブルも一緒に消えます。WordPressの開発者向け文書が、削除時に設定やテーブルを片付ける処理を推奨しているためです。フォームの送信履歴など残したいデータは、削除の前に書き出します。</p></div>

<h2>WP-CLIで、版と配布状況を一覧にする</h2>
<p>サーバーにSSHで入れるなら、WP-CLIで本体、プラグイン、テーマの版と更新の有無に加え、公式ディレクトリでの閉鎖と最終更新日まで一覧にできます。出力をそのまま点検記録に残せるのも利点です。</p>
<pre class="slt-code"><code># 本体の版と、本体の更新の有無
wp core version
wp core check-update

# 更新が出ているプラグインとテーマ
wp plugin list --update=available
wp theme list --update=available

# 停止中のプラグインとテーマ(削除の候補)
wp plugin list --status=inactive
wp theme list --status=inactive</code></pre>
<p>『wp core check-update』は、本体が最新なら『Success: WordPress is at the latest version.』と表示します。更新があれば、版と種類(major、minor)を表で返します。次のコマンドは、公式ディレクトリでの状態と最終更新日をプラグインごとに並べるものです。</p>
<pre class="slt-code"><code>wp plugin list --fields=name,status,version,update,wporg_status,wporg_last_updated

# 例(表示を簡略化。名前と日付は説明用)
| name         | status   | version | update    | wporg_status | wporg_last_updated |
| example-form | active   | 3.2.1   | available | active       | 2026-09-30         |
| old-slider   | inactive | 1.4.0   | none      | closed       | 2023-05-11         |
| custom-tool  | active   | 2.0.5   | none      |              |                    |</code></pre>
<div class="slt-table-wrap"><table class="slt-table"><thead><tr><th>表示</th><th>意味</th><th>次の行動</th></tr></thead><tbody>
<tr><td>update が available</td><td>新しい版が出ている</td><td>変更履歴を読み、検証環境で試してから更新</td></tr>
<tr><td>update が unavailable</td><td>新しい版がサーバーのPHPで動かない</td><td>PHPの更新を先に計画する</td></tr>
<tr><td>wporg_status が closed</td><td>公式ディレクトリで閉鎖されている</td><td>代わりを探して置き換え、削除する</td></tr>
<tr><td>wporg_status が空欄</td><td>公式ディレクトリに無い(有料、自作など)</td><td>提供元で最新版と修正履歴を確かめる</td></tr>
<tr><td>wporg_last_updated が古い</td><td>長く更新されていない</td><td>開発とサポートが続いているかを確かめる</td></tr>
</tbody></table></div>

<h2>公開の脆弱性情報と照合する: JVN iPedia、NVD、CVE、公式発表</h2>
<p>版の一覧ができたら、本体はWordPress公式のセキュリティ発表で、プラグインとテーマはJVN iPediaやNVDで製品名を検索して照合します。読むべき項目は、影響を受ける版の範囲、修正版の番号、悪用が確認されているかの3つです。</p>
<h3>情報源の使い分け</h3>
<div class="slt-table-wrap"><table class="slt-table"><thead><tr><th>情報源</th><th>載っている情報</th><th>向いている使い方</th><th>注意点</th></tr></thead><tbody>
<tr><td><a href="https://wordpress.org/news/category/security/">WordPress公式のセキュリティ発表</a></td><td>本体のセキュリティリリースと修正の概要</td><td>本体の修正版を早く知る</td><td>プラグインとテーマは対象外</td></tr>
<tr><td>JVN iPedia(jvndb.jvn.jp)</td><td>影響を受ける版、深刻度、対策(日本語)</td><td>プラグイン名やテーマ名で日本語の情報を探す</td><td>公表から登録まで日数がかかることがある</td></tr>
<tr><td><a href="https://nvd.nist.gov/vuln/search">NVD</a>(米国NIST)</td><td>CVEごとの深刻度、影響を受ける製品と版の範囲</td><td>版の範囲を細かく確かめる</td><td>英語のみ</td></tr>
<tr><td><a href="https://www.cve.org/">CVE.org</a></td><td>CVE番号ごとの記録</td><td>番号から元の記録を引く</td><td>影響範囲の書き方は記録ごとに違う</td></tr>
<tr><td>公式ディレクトリのプラグインページ</td><td>変更履歴、閉鎖の警告</td><td>修正版の有無と開発の継続を確かめる</td><td>有料版は提供元で確かめる</td></tr>
</tbody></table></div>
<p>JVN iPediaは、国内の開発者が公開した情報、JVNで公表した情報、米国NISTのNVDの情報を集約し、日本語に翻訳したデータベースです。<a href="https://www.ipa.go.jp/security/reports/vuln/jvn/ipedia2026q1.html">IPAの登録状況の報告</a>によると、2007年4月25日に公開が始まり、2026年第1四半期までの登録は累計277,036件にのぼります。NVDは米国政府の脆弱性管理データのリポジトリで、CVEは、公開された脆弱性を特定、定義して目録にまとめるCVEプログラムの識別番号です。</p>
<h3>影響を受ける版と修正版を照らし合わせる</h3>
<p>照合の要は、自分の版が影響を受ける版の範囲に入るかどうかです。範囲は『以上』と『未満』で書かれることが多く、『未満』の側に書かれた版が修正版にあたります。</p>
<p>たとえばIPAの注意喚起は、CVE-2026-63030の影響を受ける版を6.9.0から6.9.4と7.0.0から7.0.1とし、修正版を6.9.5と7.0.2としています。NVDのデータでも、6.9以上6.9.5未満と、7.0以上7.0.2未満が影響範囲です。6.9.4のサイトは該当し、6.9.5に上げれば該当しなくなります。</p>
<ol class="slt-steps">
<li><strong>版を書き出す</strong>本体、プラグイン、テーマの名前と版を一覧にします。前の節のWP-CLIの出力をそのまま使えます。</li>
<li><strong>製品名で検索する</strong>JVN iPediaとNVDでプラグイン名やテーマ名を検索し、本体はWordPress公式のセキュリティ発表を読みます。</li>
<li><strong>範囲と照らす</strong>影響を受ける版の範囲に自分の版が入るかを確かめ、入っていれば修正版の番号を控えます。</li>
<li><strong>優先順位を決める</strong>ログインせずに狙えるものと、悪用が確認されているものから先に、更新の予定を入れます。</li>
</ol>
<h3>深刻度は点数だけでなく、攻撃の条件で読む</h3>
<p>深刻度の表記は、評価する側によって変わります。9月22日の7.1.2で直った脆弱性(CVE-2026-87902)は、WordPress公式の発表では『critical』です。一方、CVSS v3の基本値は8.1で、JVN iPediaの表示は『重要』でした。</p>
<p>点数より先に読むのは、攻撃の条件です。JVN iPediaの『攻撃に必要な特権レベル: 不要』は、ログインせずに狙えることを示します。『参考情報』に米国CISAの『Known Exploited Vulnerabilities Catalog』が載っていれば、実際の悪用が確認された脆弱性です。</p>
<p>CVE-2026-87902は公表から3日後の9月25日に、CVE-2026-63030は公表から4日後の7月21日に、このカタログへ追加されました。2件とも、公表から悪用の確認まで数日しかありませんでした。</p>
<div class="slt-callout is-note"><p class="slt-callout-title">補足</p><p>日本語のデータベースは、公表から登録まで日数がかかることがあります。CVE-2026-87902は9月22日に公表され、JVN iPediaへの登録は9月29日でした。急ぐ場面では、WordPress公式の発表とNVDを先に見ます。</p></div>

<h2>外から見える情報を確認する: 版の露出と公開ファイル</h2>
<p>外からの確認では、自分のサイトに対して、第三者が取得できる版の情報と公開ファイルを調べます。版を隠しても脆弱性は直りませんが、何が見えているかを知ると、点検の漏れに気づけます。</p>
<p>標準の設定で版が出る主な場所は、ページの&lt;head&gt;、フィード、CSSやJavaScriptのURLです。&lt;head&gt;には『<code>&lt;meta name="generator" content="WordPress 7.1.3"&gt;</code>』が出て、フィードのgeneratorにも同じ版が入ります。版の指定が無いCSSやJavaScriptのURLに付く『?ver=』も、本体の版と同じ値です。</p>
<p>ルートにあるreadme.htmlは、現在の版では版番号そのものを載せていません。ただし、WordPressで作られたサイトであることと動作要件が分かるため、公開しておく理由はありません。プラグインのCSSやJavaScriptに付く番号や同梱の説明ファイルからも、プラグインの版が推定されることがあります。</p>
<pre class="slt-code"><code># 自分が管理するサイトにだけ実行します
# トップページとフィードに、版が出ていないか
curl -s https://example.com/ | grep -io '&lt;meta name="generator"[^&gt;]*&gt;'
curl -s https://example.com/feed/ | grep -io '&lt;generator&gt;[^&lt;]*&lt;/generator&gt;'

# readme.html が公開されているか(200なら公開、404なら非公開)
curl -s -o /dev/null -w '%{http_code}\n' https://example.com/readme.html

# 例(出力)
&lt;meta name="generator" content="WordPress 7.1.3"&gt;
&lt;generator&gt;https://wordpress.org/?v=7.1.3&lt;/generator&gt;
200</code></pre>
<div class="slt-callout is-warn"><p class="slt-callout-title">注意</p><p>版の表示を消すことは、更新の代わりになりません。公式の『Hardening WordPress』も、見えにくくして守る方法(security through obscurity)は主たる対策として不適切だとしています。攻撃は版を確かめずに試されることもあるため、該当する脆弱性が残っていれば狙われます。</p></div>
<p>当社の無料の<a href="https://slt-inc.jp/service/security-checker/">Webサイトのセキュリティチェック</a>は、URLを入れるだけで、本体、プラグイン、テーマの版と既知の脆弱性、配布終了の有無を確かめます。readme.htmlやxmlrpc.phpの公開、REST APIでユーザー名の一覧が取れるかも、調べる対象です。診断は公開ページの取得やDNSの照会に限られ、攻撃の通信は送らないため、ログイン後の画面や管理画面の内側は対象外です。</p>
<p>wp-config.phpのバックアップや.git、.envなど、公開してはいけないファイルの確認方法は<a href="https://slt-inc.jp/article/git-env-file-exposure/">.gitや.envが公開されていないか確認する方法</a>で扱っています。フォルダの中身が一覧で見える<a href="https://slt-inc.jp/glossary/directory-listing/">ディレクトリリスティング</a>も、アップロード用のフォルダ(wp-content/uploads)で、サーバーの設定によって起きることがあります。</p>

<h2>更新の前の準備と、更新の順序</h2>
<p>更新の基本は、バックアップを取って戻せることを確かめ、検証環境で試してから、本番で1つずつ行うことです。公式の<a href="https://developer.wordpress.org/advanced-administration/upgrade/upgrading/">Upgrading WordPress</a>も、手動更新の最初の3段階を、データベースのバックアップ、全ファイルのバックアップ、バックアップの検証としています。</p>
<h3>バックアップは戻せることまで確かめる</h3>
<p>バックアップに要るのは、データベースとファイル(少なくともwp-contentとwp-config.php)の両方です。取っただけで終えず、検証環境へ実際に戻し、ページが表示されるかまで確かめます。サーバー会社のバックアップを使う場合は、保存期間と戻し方を事前に確認しておきます。</p>
<pre class="slt-code"><code># 例: WordPressの設置フォルダで実行し、公開フォルダの外(~/backups)へ書き出す
mkdir -p ~/backups
wp db export ~/backups/db-20261012.sql
tar -czf ~/backups/files-20261012.tar.gz wp-content wp-config.php</code></pre>
<p>バックアップのファイルを公開フォルダの中に置くのは危険です。外から取得されるおそれがあり、データベースには会員情報や問い合わせの内容も含まれます。保存先と消す時期まで決めておきます。</p>
<h3>検証環境で先に試す</h3>
<p>検証環境(ステージング)は、本番と同じ版の本体、プラグイン、テーマ、PHPを揃えた複製です。ここで更新し、表示、問い合わせフォーム、会員機能、決済を操作してから本番に移ります。検証環境にはベーシック認証などをかけ、検索結果に載らないようにします。</p>
<p>使い終えた検証環境や旧サイトも、点検の対象です。IPAは、不要になったページを残すと管理が及ばず、脆弱性が見つかったときに影響を受けるおそれがあるとして、不要になった時点で非公開にするよう勧めています。</p>
<h3>本体、プラグイン、テーマの順に1つずつ更新する</h3>
<p>公式の手動更新の手順は、本体のファイルを入れ替えたあとに、更新されたプラグインとテーマを入れる流れです。本体の大型更新の前には、更新画面の互換性の表示で、各プラグインが新しい版に対応しているかを確かめます。脆弱性が公表されているものがあれば、その更新が最優先です。</p>
<p>まとめて更新すると、不具合が出たときに原因を特定できません。1つ更新するごとに表示を確かめれば、原因をその場で切り分けられます。</p>
<figure class="slt-figure"><svg role="img" viewBox="0 0 800 330"><title>図1 確認から更新までの流れ</title><desc>版を一覧にし、公開情報と照合し、バックアップを取り、検証環境で試してから、本番を1つずつ更新し、表示と機能を確かめ、記録を残して次回の点検につなげる流れ。表示と機能の確認で不具合が出たら、バックアップへ戻す分岐がある。</desc><defs><marker id="f1a" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="12" markerHeight="12" markerUnits="userSpaceOnUse" orient="auto"><path d="M0,0 L10,5 L0,10 z" fill="#10265A"/></marker><marker id="f1r" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="12" markerHeight="12" markerUnits="userSpaceOnUse" orient="auto"><path d="M0,0 L10,5 L0,10 z" fill="#D00A0A"/></marker></defs><rect x="10" y="30" width="172" height="84" rx="10" fill="#EEF2F9" stroke="#10265A" stroke-width="3"/><text x="96" y="64" font-size="24" fill="#10265A" text-anchor="middle">版を</text><text x="96" y="94" font-size="24" fill="#10265A" text-anchor="middle">一覧にする</text><rect x="212" y="30" width="172" height="84" rx="10" fill="#EEF2F9" stroke="#10265A" stroke-width="3"/><text x="298" y="64" font-size="24" fill="#10265A" text-anchor="middle">公開情報と</text><text x="298" y="94" font-size="24" fill="#10265A" text-anchor="middle">照合する</text><rect x="414" y="30" width="172" height="84" rx="10" fill="#EEF2F9" stroke="#10265A" stroke-width="3"/><text x="500" y="64" font-size="24" fill="#10265A" text-anchor="middle">バックアップ</text><text x="500" y="94" font-size="24" fill="#10265A" text-anchor="middle">を取る</text><rect x="616" y="30" width="172" height="84" rx="10" fill="#EEF2F9" stroke="#10265A" stroke-width="3"/><text x="702" y="64" font-size="24" fill="#10265A" text-anchor="middle">検証環境で</text><text x="702" y="94" font-size="24" fill="#10265A" text-anchor="middle">試す</text><rect x="10" y="226" width="172" height="84" rx="10" fill="#EEF2F9" stroke="#4A5C82" stroke-width="3"/><text x="96" y="260" font-size="24" fill="#10265A" text-anchor="middle">次回の</text><text x="96" y="290" font-size="24" fill="#10265A" text-anchor="middle">点検へ</text><rect x="212" y="226" width="172" height="84" rx="10" fill="#FFFFFF" stroke="#10265A" stroke-width="3"/><text x="298" y="260" font-size="24" fill="#10265A" text-anchor="middle">記録を</text><text x="298" y="290" font-size="24" fill="#10265A" text-anchor="middle">残す</text><rect x="414" y="226" width="172" height="84" rx="10" fill="#FFFFFF" stroke="#10265A" stroke-width="3"/><text x="500" y="260" font-size="24" fill="#10265A" text-anchor="middle">表示と機能を</text><text x="500" y="290" font-size="24" fill="#10265A" text-anchor="middle">確かめる</text><rect x="616" y="226" width="172" height="84" rx="10" fill="#FFFFFF" stroke="#10265A" stroke-width="3"/><text x="702" y="260" font-size="24" fill="#10265A" text-anchor="middle">本番を</text><text x="702" y="290" font-size="24" fill="#10265A" text-anchor="middle">1つずつ更新</text><line x1="182" y1="72" x2="208" y2="72" stroke="#10265A" stroke-width="3" marker-end="url(#f1a)"/><line x1="384" y1="72" x2="410" y2="72" stroke="#10265A" stroke-width="3" marker-end="url(#f1a)"/><line x1="586" y1="72" x2="612" y2="72" stroke="#10265A" stroke-width="3" marker-end="url(#f1a)"/><line x1="702" y1="114" x2="702" y2="222" stroke="#10265A" stroke-width="3" marker-end="url(#f1a)"/><line x1="616" y1="268" x2="590" y2="268" stroke="#10265A" stroke-width="3" marker-end="url(#f1a)"/><line x1="414" y1="268" x2="388" y2="268" stroke="#10265A" stroke-width="3" marker-end="url(#f1a)"/><line x1="212" y1="268" x2="186" y2="268" stroke="#10265A" stroke-width="3" marker-end="url(#f1a)"/><line x1="96" y1="226" x2="96" y2="118" stroke="#4A5C82" stroke-width="3" marker-end="url(#f1a)"/><line x1="500" y1="226" x2="500" y2="118" stroke="#D00A0A" stroke-width="3" stroke-dasharray="8 6" marker-end="url(#f1r)"/><text x="514" y="180" font-size="24" fill="#10265A">不具合なら戻す</text></svg><figcaption>図1 確認から更新までの流れ。版の一覧と公開情報の照合で該当を見つけ、バックアップと検証環境での確認を経て、本番を1つずつ更新します。表示と機能の確認で不具合が出たらバックアップから戻し、問題が無ければ記録を残して次回の点検につなげます。</figcaption></figure>
<ol class="slt-steps">
<li><strong>更新の内容を読む</strong>変更履歴とセキュリティ発表で、修正の内容と対象の版を確かめます。</li>
<li><strong>バックアップを取る</strong>データベースとファイルを公開フォルダの外へ保存し、戻せることを確かめます。</li>
<li><strong>検証環境で試す</strong>同じ更新を検証環境で行い、主要な画面と機能を操作します。</li>
<li><strong>本番を1つずつ更新する</strong>アクセスの少ない時間に、本体、プラグイン、テーマの順で進めます。</li>
<li><strong>表示と機能を確かめる</strong>トップページ、問い合わせフォーム、会員機能、決済を実際に操作します。</li>
<li><strong>記録を残す</strong>日時、対象、更新前後の版、理由(CVE番号など)、確認の結果を書き残します。</li>
</ol>

<h2>修正版が無い、更新できないときの判断</h2>
<p>修正版が無いときは、そのプラグインを使い続ける必要があるかと、開発が続いているかの2点で判断します。使わないものは削除し、使うものは『待つ』か『置き換える』かを選びます。</p>
<figure class="slt-figure"><svg role="img" viewBox="0 0 800 420"><title>図2 修正版が無いときの判断の分岐</title><desc>使っているかを問い、使っていなければ削除する。使っていれば修正版の有無を問い、あればバックアップして更新する。無ければ開発が続いているかを問い、続いていれば機能を止めて修正を待ち、止まっていれば代わりに置き換えて削除する。</desc><defs><marker id="f2a" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="12" markerHeight="12" markerUnits="userSpaceOnUse" orient="auto"><path d="M0,0 L10,5 L0,10 z" fill="#10265A"/></marker></defs><rect x="20" y="20" width="300" height="64" rx="12" fill="#EEF2F9" stroke="#10265A" stroke-width="3"/><text x="170" y="60" font-size="24" fill="#10265A" text-anchor="middle">使っているか？</text><rect x="480" y="20" width="300" height="64" rx="12" fill="#FFFFFF" stroke="#D00A0A" stroke-width="3"/><text x="630" y="60" font-size="24" fill="#10265A" text-anchor="middle">削除する</text><line x1="320" y1="52" x2="476" y2="52" stroke="#10265A" stroke-width="3" marker-end="url(#f2a)"/><text x="398" y="40" font-size="24" fill="#10265A" text-anchor="middle">いいえ</text><line x1="170" y1="84" x2="170" y2="126" stroke="#10265A" stroke-width="3" marker-end="url(#f2a)"/><text x="184" y="114" font-size="24" fill="#10265A">はい</text><rect x="20" y="130" width="300" height="64" rx="12" fill="#EEF2F9" stroke="#10265A" stroke-width="3"/><text x="170" y="170" font-size="24" fill="#10265A" text-anchor="middle">修正版はあるか？</text><rect x="480" y="130" width="300" height="64" rx="12" fill="#FFFFFF" stroke="#4A5C82" stroke-width="3"/><text x="630" y="170" font-size="24" fill="#10265A" text-anchor="middle">バックアップして更新</text><line x1="320" y1="162" x2="476" y2="162" stroke="#10265A" stroke-width="3" marker-end="url(#f2a)"/><text x="398" y="150" font-size="24" fill="#10265A" text-anchor="middle">ある</text><line x1="170" y1="194" x2="170" y2="236" stroke="#10265A" stroke-width="3" marker-end="url(#f2a)"/><text x="184" y="224" font-size="24" fill="#10265A">ない</text><rect x="20" y="240" width="300" height="64" rx="12" fill="#EEF2F9" stroke="#10265A" stroke-width="3"/><text x="170" y="280" font-size="24" fill="#10265A" text-anchor="middle">開発は続いているか？</text><rect x="480" y="240" width="300" height="64" rx="12" fill="#FFFFFF" stroke="#4A5C82" stroke-width="3"/><text x="630" y="280" font-size="24" fill="#10265A" text-anchor="middle">機能を止めて修正を待つ</text><line x1="320" y1="272" x2="476" y2="272" stroke="#10265A" stroke-width="3" marker-end="url(#f2a)"/><text x="398" y="260" font-size="24" fill="#10265A" text-anchor="middle">続いている</text><line x1="170" y1="304" x2="170" y2="336" stroke="#10265A" stroke-width="3" marker-end="url(#f2a)"/><text x="184" y="330" font-size="24" fill="#10265A">止まっている</text><rect x="20" y="340" width="300" height="64" rx="12" fill="#FFFFFF" stroke="#D00A0A" stroke-width="3"/><text x="170" y="380" font-size="24" fill="#10265A" text-anchor="middle">代わりに置き換えて削除</text></svg><figcaption>図2 修正版が無い、または更新できないときの判断の流れ。使っていなければ削除し、修正版があればバックアップのうえ更新します。修正版が無い場合は、開発が続いていれば機能を止めて待ち、止まっていれば代わりに置き換えて削除します。</figcaption></figure>
<div class="slt-table-wrap"><table class="slt-table"><thead><tr><th>状況</th><th>判断</th><th>当面の対処</th></tr></thead><tbody>
<tr><td>修正版が出ている</td><td>更新する</td><td>バックアップと検証環境での確認のうえで更新</td></tr>
<tr><td>修正版は未公開だが、開発は続いている</td><td>期限を決めて待つ</td><td>該当機能を止める、<a href="https://slt-inc.jp/glossary/waf/">WAF</a>で該当する通信を遮断する、管理画面への接続を<a href="https://slt-inc.jp/glossary/ip%e5%88%b6%e9%99%90/">IP制限</a>で絞る</td></tr>
<tr><td>公式ディレクトリで閉鎖、または長く更新が無い</td><td>置き換える</td><td>保守が続く別のプラグインへ移し、元のものを削除</td></tr>
<tr><td>更新すると表示や機能が崩れる</td><td>原因を直して更新する</td><td>検証環境で原因のプラグインやテーマを特定し、直す期限を決める</td></tr>
<tr><td>新しい版がサーバーのPHPで動かない</td><td>PHPを上げる</td><td>サーバー会社の手順でPHPを上げ、検証環境で動作を確かめる</td></tr>
</tbody></table></div>
<div class="slt-callout is-warn"><p class="slt-callout-title">注意</p><p>不具合を避けるために古い版へ戻すと、その後に直った脆弱性まで元に戻ります。WAFや機能の停止は、修正版が出るまでのつなぎです。更新か置き換えを終える期限を、担当者と決めておきます。</p></div>

<h2>攻撃の兆候を確認する: 不審な管理者、改ざん、見覚えのないファイル</h2>
<p>兆候は、ユーザー、ファイル、外からの見え方の3か所で確かめます。WordPress公式の<a href="https://wordpress.org/documentation/article/faq-my-site-was-hacked/">FAQ My site was hacked</a>は、侵害の明確な兆候を挙げています。検索エンジンの警告、サーバー会社によるサイトの停止、許可していないユーザーの作成、目に見える改ざんなどです。</p>
<ul class="slt-check">
<li>見覚えのない管理者アカウントが無い(登録日も見る)</li>
<li>本体のファイルが、公式の配布物と一致する</li>
<li>wp-adminやwp-includesに、本来無いファイルが無い</li>
<li>.htaccessと、テーマのindex.php、header.php、footer.php、functions.phpに覚えのない変更が無い</li>
<li>検索結果やブラウザに、危険なサイトの警告が出ていない</li>
<li>サーバー会社から、迷惑メールの送信やサイトの停止の連絡が来ていない</li>
</ul>
<pre class="slt-code"><code># 管理者権限のユーザーと登録日を一覧にする
wp user list --role=administrator --fields=ID,user_login,user_email,user_registered

# 本体のファイルを、公式のチェックサムと照合する
wp core verify-checksums

# 公式ディレクトリのプラグインを、配布物と照合する
wp plugin verify-checksums --all</code></pre>
<p>本体の照合で『<code>File doesn't verify against checksum</code>』と出たファイルは、公式の配布物から書き換えられています。『<code>File should not exist</code>』は、本来無いファイルがあるという意味です。wp-content(テーマ、プラグイン、アップロード)は本体の照合の対象外で、プラグインの照合も公式ディレクトリにあるものに限られます。</p>
<div class="slt-callout is-warn"><p class="slt-callout-title">注意</p><p>本来無いファイルの警告は、最後の行が『Success』でも表示されることがあります。成否の1行だけで判断せず、その上に並ぶ『Warning』の行をすべて読みます。</p></div>

<h2>侵害が疑われるときの初動</h2>
<p>侵害が疑われたら、状況を記録して現状の複製を取り、サーバー会社や保守会社に連絡してから、すべての入口のパスワードを変えます。削除や上書きを急ぐと原因の手がかりが消えるため、順番が大切です。</p>
<ol class="slt-steps">
<li><strong>状況を記録する</strong>侵害を疑った理由、気づいた日時とタイムゾーン、直近に入れたプラグインや変更を書き出します。</li>
<li><strong>現状の複製を取る</strong>感染していても、掃除の前に今の状態を丸ごと保存します。原因の調査と、作業に失敗したときの比較に使います。</li>
<li><strong>関係先に連絡する</strong>サーバー会社と保守会社に連絡します。共用サーバーでは、被害がほかのサイトに及んでいることもあります。</li>
<li><strong>入口をすべて閉じる</strong>全ユーザーのパスワードと、FTPやSFTP、サーバーの管理画面、データベースのパスワードを変えます。wp-config.phpの認証用ユニークキーを入れ替えると、ログイン中の全員が締め出されます。</li>
<li><strong>本体を同じ版で入れ直す</strong>wp-adminとwp-includesを、同じ版の公式の配布物で置き換えます。テーマとプラグインも、公式ディレクトリや提供元から取り直します。</li>
<li><strong>侵入口を塞ぐ</strong>原因と考えられるプラグインやテーマを更新するか、削除します。</li>
<li><strong>もう一度パスワードを変える</strong>きれいになったことを確かめてから、すべてのパスワードを再度変えます。</li>
<li><strong>影響を確かめて知らせる</strong>ログで被害の範囲を確かめ、利用者や取引先に影響があれば連絡します。</li>
</ol>
<div class="slt-callout is-warn"><p class="slt-callout-title">注意</p><p>管理画面の再インストール機能は、既存のファイルを上書きするだけです。攻撃で足されたファイルは残るため、公式のFAQは、FTPやSFTPでファイルを置き換えるよう勧めています。</p></div>
<p>復旧後は、wp-config.phpに『<code>define( 'DISALLOW_FILE_EDIT', true );</code>』を書きます。管理画面からテーマとプラグインのファイルを編集できなくなり、管理者アカウントを乗っ取られても、コードを書き換えられる被害を抑えられます。</p>
<p>自社で切り分けるのが難しい場合は、IPAの情報セキュリティ安心相談窓口や、JPCERT/CCのインシデント対応依頼が公的な相談先です。診断や復旧の進め方は、当社の<a href="https://slt-inc.jp/inquiry/">お問い合わせ窓口</a>でも相談を受け付けています。</p>

<h2>自動更新の使い分け</h2>
<p>本体のセキュリティ修正(マイナー版)の自動更新は止めずに使い、プラグインとテーマは影響の大きさで自動と手動を分けます。自動に任せた部分も、版が上がったかの点検は欠かせません。</p>
<p>WordPress 5.6以降の新規インストールでは、Gitなどで管理している場合を除き、本体はマイナー版と大型更新の両方が既定で自動です。5.6より前に入れたサイトは、設定を変えていなければマイナー版と翻訳だけが自動になっています。プラグインとテーマの自動更新は5.5で加わった機能で、一覧の『自動更新を有効化』から個別に切り替える形です。</p>
<div class="slt-table-wrap"><table class="slt-table"><thead><tr><th>対象</th><th>既定の動き</th><th>おすすめの使い方</th></tr></thead><tbody>
<tr><td>本体のマイナー版(セキュリティ修正)</td><td>自動</td><td>止めない</td></tr>
<tr><td>本体の大型更新</td><td>5.6以降の新規インストールは自動</td><td>検証環境があるなら手動にし、先に試す</td></tr>
<tr><td>プラグイン</td><td>手動(重大な場合を除く)</td><td>影響が小さく保守が続くものは自動。フォーム、会員、決済は検証してから手動で</td></tr>
<tr><td>テーマ</td><td>手動(重大な場合を除く)</td><td>直接編集したテーマは自動にしない(変更を子テーマへ移す)</td></tr>
<tr><td>翻訳</td><td>自動</td><td>そのまま</td></tr>
</tbody></table></div>
<pre class="slt-code"><code>// wp-config.php の例1: 本体の自動更新をマイナー版だけにする
define( 'WP_AUTO_UPDATE_CORE', 'minor' );

// 例2: 大型更新も含めて自動にする(例1とどちらか一方だけを書く)
// define( 'WP_AUTO_UPDATE_CORE', true );</code></pre>
<p>自動更新は既定で1日2回実行され、結果は管理者にメールで届きます。ただしIPAは、環境や設定によって自動更新が有効でなかったり、失敗したりする可能性を挙げ、管理画面で版が上がったかを確かめるよう求めています。</p>
<div class="slt-callout is-note"><p class="slt-callout-title">補足</p><p>『AUTOMATIC_UPDATER_DISABLED』をtrueにすると、本体のセキュリティ修正を含むすべての自動更新が止まります。サーバー会社や保守会社が更新を別の仕組みで管理している場合を除き、設定しません。</p></div>

<h2>点検の頻度、担当、更新の記録を決める</h2>
<p>点検を続けるこつは、頻度ごとに作業を分け、担当者を決めることです。IPAも、自組織で使うソフトウェアを把握し、脆弱性がある版でないかを定期的に確認するよう求めています。</p>
<div class="slt-table-wrap"><table class="slt-table"><thead><tr><th>頻度</th><th>作業</th><th>使うもの</th></tr></thead><tbody>
<tr><td>発表のたび</td><td>本体のセキュリティ発表と、使っているプラグインの注意喚起を読む</td><td>WordPress公式、IPA、JVN iPedia</td></tr>
<tr><td>週1回</td><td>更新の有無とサイトヘルスを確かめ、更新を適用する</td><td>管理画面</td></tr>
<tr><td>月1回</td><td>プラグインとテーマの棚卸し、管理者アカウントの見直し、外からの確認</td><td>WP-CLI、無料ツール</td></tr>
<tr><td>四半期に1回</td><td>バックアップからの復元テスト、検証環境と旧サイトの整理</td><td>検証環境</td></tr>
</tbody></table></div>
<p>担当は、主担当と代理の2人を決めます。サーバー会社や制作会社に保守を任せている場合は、IPAが勧めるとおり事業者の作業範囲を確かめ、足りない部分を自社で受け持ちます。たとえば本体の自動更新はサーバー会社、プラグインの更新は制作会社、点検記録の確認は自社、という分け方です。</p>
<p>更新の記録は、作業ごとに次の項目を残す形で十分です。記録があれば、不具合や侵害が起きたときに、いつ何を変えたかを後からたどれます。</p>
<ul class="slt-check">
<li>日時と作業者</li>
<li>対象(本体、プラグイン名、テーマ名)</li>
<li>更新前と更新後の版</li>
<li>更新の理由(CVE番号、注意喚起のURL)</li>
<li>確かめた画面と機能、その結果</li>
<li>問題が出たときの対応(戻した、保留した、など)</li>
</ul>
<p>月1回の外からの確認に使える道具の1つが、当社の<a href="https://slt-inc.jp/service/security-checker/">無料のセキュリティチェック</a>です。WordPress以外も含めたサイト全体の点検項目は、<a href="https://slt-inc.jp/article/website-security-check-items/">Webサイトのセキュリティチェック項目30選</a>にまとめています。</p>

<h2>WordPressの脆弱性確認でよくある質問</h2>
<div class="slt-faq"><h3>無料の診断ツールで問題が出なければ、安全と考えてよいですか？</h3><p>いいえ、公開されている情報から分かる範囲で、問題が見つからなかったという意味にとどまります。外からの簡易チェックで分かるのは版の情報、公開ファイル、<a href="https://slt-inc.jp/glossary/security-headers/">セキュリティヘッダー</a>などの設定で、ログイン後の機能やサイト独自の作りに潜む脆弱性は確かめられません。そこまで確かめるには<a href="https://slt-inc.jp/glossary/vulnerability-assessment/">脆弱性診断</a>や<a href="https://slt-inc.jp/glossary/penetration-test/">ペネトレーションテスト</a>が必要で、違いは<a href="https://slt-inc.jp/article/vulnerability-assessment-vs-simple-check/">簡易チェックと脆弱性診断の違い</a>で解説しています。</p></div>
<div class="slt-faq"><h3>有料テーマや、公式ディレクトリに無いプラグインはどう確認しますか？</h3><p>提供元のサイトで最新版と変更履歴を確かめ、JVN iPediaやNVDで製品名を検索します。公式ディレクトリに無いものは、提供元の仕組みによって管理画面に更新が出ないことがあり、WP-CLIの『wporg_status』も空欄になります。購入したときに、更新の受け取り方とサポートの期限を控えておくと、点検で迷いません。</p></div>
<div class="slt-faq"><h3>WordPressの更新は、どのくらいの頻度で出ますか？</h3><p>セキュリティ修正を含む更新は、決まった周期ではなく必要に応じて出ます。2026年は7月17日から10月6日までの約12週間に、公式のセキュリティ発表が6回出ました。週1回の確認を基本にし、発表が出たら臨時に確かめる運用が現実的です。</p></div>
<div class="slt-faq"><h3>7.0から7.1のような大型更新は、すぐに入れるべきですか？</h3><p>検証環境で主要な機能を確かめてから入れます。セキュリティ修正は7.1.2から7.1.3のような小さな更新でも配られますが、公式が積極的にサポートするのは最新版だけです。更新画面でプラグインの互換性の表示が揃ったら、古い系統に長く留まらずに移ります。</p></div>
<div class="slt-faq"><h3>更新したら画面が真っ白になりました。どうすればよいですか？</h3><p>管理者宛てのメールに届くリカバリーモードのリンクから管理画面に入り、原因のプラグインを止めるか、バックアップから戻します。WordPressは、プラグインやテーマが致命的なエラーを起こすと、『サイトで技術的な問題が発生しています』という件名のメールを送る仕組みです。リカバリーモードでは原因のプラグインが一時停止された状態で管理画面を開けるため、落ち着いて原因を確かめられます。</p></div>
<div class="slt-faq"><h3>管理画面のログインURLを変えれば、脆弱性対策になりますか？</h3><p>パスワードを狙うログインの試行は減らせますが、脆弱性は直りません。2026年9月に修正された本体の脆弱性(CVE-2026-87902)は、ログインしていない攻撃者が条件次第で狙えるものでした。ログインURLの変更は補助として扱い、更新を優先します。</p></div>
<div class="slt-faq"><h3>テーマを直接編集しています。更新すると変更は消えますか？</h3><p>消えます。テーマを更新するとファイルが新しい版で置き換わるため、直接書き加えた変更は残りません。公式の開発者向け文書も、親テーマを更新しても変更を失わない方法として子テーマを勧めており、変更を子テーマへ移してから更新します。</p></div>

<div class="slt-related">
<a class="slt-related-item" href="https://slt-inc.jp/article/website-security-check-items/"><span class="slt-related-thumb"><img src="https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24854-security-checklist-300x200.png" srcset="https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24854-security-checklist-300x200.png 300w, https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24854-security-checklist-768x512.png 768w" sizes="auto, (max-width: 560px) 78vw, 300px" width="300" height="200" alt="" loading="lazy" decoding="async"></span><span class="slt-related-kind">関連記事</span><span class="slt-related-title">Webサイトのセキュリティチェック項目30選｜確認方法つき一覧表</span></a>
<a class="slt-related-item" href="https://slt-inc.jp/article/vulnerability-assessment-vs-simple-check/"><span class="slt-related-thumb"><img src="https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24878-assessment-difference-300x200.png" srcset="https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24878-assessment-difference-300x200.png 300w, https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24878-assessment-difference-768x512.png 768w" sizes="auto, (max-width: 560px) 78vw, 300px" width="300" height="200" alt="" loading="lazy" decoding="async"></span><span class="slt-related-kind">関連記事</span><span class="slt-related-title">簡易チェックと脆弱性診断の違い｜無料ツールでできることと、専門業者が必要な場面</span></a>
<a class="slt-related-item" href="https://slt-inc.jp/article/git-env-file-exposure/"><span class="slt-related-thumb"><img src="https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24875-git-env-exposure-300x200.png" srcset="https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24875-git-env-exposure-300x200.png 300w, https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24875-git-env-exposure-768x512.png 768w" sizes="auto, (max-width: 560px) 78vw, 300px" width="300" height="200" alt="" loading="lazy" decoding="async"></span><span class="slt-related-kind">関連記事</span><span class="slt-related-title">.gitや.envが公開されていないか確認する方法と、見つかった時の対処</span></a>
<a class="slt-related-item" href="https://slt-inc.jp/article/security-headers-setup/"><span class="slt-related-thumb"><img src="https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24853-security-headers-300x200.png" srcset="https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24853-security-headers-300x200.png 300w, https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24853-security-headers-768x512.png 768w" sizes="auto, (max-width: 560px) 78vw, 300px" width="300" height="200" alt="" loading="lazy" decoding="async"></span><span class="slt-related-kind">関連記事</span><span class="slt-related-title">セキュリティヘッダーの設定方法｜HSTS、CSPの設定例つき</span></a>
</div>
<div class="slt-cta"><p class="slt-cta-title">外から見えている版と公開ファイルを、無料で確かめる</p><p>URLを入れるだけで、WordPress本体とプラグインの版、既知の脆弱性、配布終了、readme.htmlなどの公開状況を確認できます。登録は不要です。診断できるのは、自社または管理権限のあるサイトだけです。</p><a class="slt-cta-btn" href="https://slt-inc.jp/service/security-checker/">無料でWebサイトをチェックする</a></div>
</div>
<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "無料の診断ツールで問題が出なければ、安全と考えてよいですか？", "acceptedAnswer": {"@type": "Answer", "text": "いいえ、公開されている情報から分かる範囲で、問題が見つからなかったという意味にとどまります。外からの簡易チェックで分かるのは版の情報、公開ファイル、セキュリティヘッダーなどの設定で、ログイン後の機能やサイト独自の作りに潜む脆弱性は確かめられません。そこまで確かめるには脆弱性診断やペネトレーションテストが必要で、違いは簡易チェックと脆弱性診断の違いで解説しています。"}}, {"@type": "Question", "name": "有料テーマや、公式ディレクトリに無いプラグインはどう確認しますか？", "acceptedAnswer": {"@type": "Answer", "text": "提供元のサイトで最新版と変更履歴を確かめ、JVN iPediaやNVDで製品名を検索します。公式ディレクトリに無いものは、提供元の仕組みによって管理画面に更新が出ないことがあり、WP-CLIの『wporg_status』も空欄になります。購入したときに、更新の受け取り方とサポートの期限を控えておくと、点検で迷いません。"}}, {"@type": "Question", "name": "WordPressの更新は、どのくらいの頻度で出ますか？", "acceptedAnswer": {"@type": "Answer", "text": "セキュリティ修正を含む更新は、決まった周期ではなく必要に応じて出ます。2026年は7月17日から10月6日までの約12週間に、公式のセキュリティ発表が6回出ました。週1回の確認を基本にし、発表が出たら臨時に確かめる運用が現実的です。"}}, {"@type": "Question", "name": "7.0から7.1のような大型更新は、すぐに入れるべきですか？", "acceptedAnswer": {"@type": "Answer", "text": "検証環境で主要な機能を確かめてから入れます。セキュリティ修正は7.1.2から7.1.3のような小さな更新でも配られますが、公式が積極的にサポートするのは最新版だけです。更新画面でプラグインの互換性の表示が揃ったら、古い系統に長く留まらずに移ります。"}}, {"@type": "Question", "name": "更新したら画面が真っ白になりました。どうすればよいですか？", "acceptedAnswer": {"@type": "Answer", "text": "管理者宛てのメールに届くリカバリーモードのリンクから管理画面に入り、原因のプラグインを止めるか、バックアップから戻します。WordPressは、プラグインやテーマが致命的なエラーを起こすと、『サイトで技術的な問題が発生しています』という件名のメールを送る仕組みです。リカバリーモードでは原因のプラグインが一時停止された状態で管理画面を開けるため、落ち着いて原因を確かめられます。"}}, {"@type": "Question", "name": "管理画面のログインURLを変えれば、脆弱性対策になりますか？", "acceptedAnswer": {"@type": "Answer", "text": "パスワードを狙うログインの試行は減らせますが、脆弱性は直りません。2026年9月に修正された本体の脆弱性(CVE-2026-87902)は、ログインしていない攻撃者が条件次第で狙えるものでした。ログインURLの変更は補助として扱い、更新を優先します。"}}, {"@type": "Question", "name": "テーマを直接編集しています。更新すると変更は消えますか？", "acceptedAnswer": {"@type": "Answer", "text": "消えます。テーマを更新するとファイルが新しい版で置き換わるため、直接書き加えた変更は残りません。公式の開発者向け文書も、親テーマを更新しても変更を失わない方法として子テーマを勧めており、変更を子テーマへ移してから更新します。"}}]}</script><p>The post <a href="https://slt-inc.jp/article/wordpress-vulnerability-check/">WordPressの脆弱性を確認する方法|本体・プラグインの更新と対処の手順</a> first appeared on <a href="https://slt-inc.jp">総合デジタルマーケティング企業 エスライン・テクノロジーズ</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>.gitや.envが公開されていないか確認する方法と、見つかった時の対処</title>
		<link>https://slt-inc.jp/article/git-env-file-exposure/</link>
		
		<dc:creator><![CDATA[slt]]></dc:creator>
		<pubDate>Fri, 02 Oct 2026 07:35:00 +0000</pubDate>
				<category><![CDATA[セキュリティ]]></category>
		<category><![CDATA[記事]]></category>
		<category><![CDATA[Webサイトセキュリティ]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[セキュリティチェック]]></category>
		<category><![CDATA[セキュリティ対策]]></category>
		<category><![CDATA[公開ファイル]]></category>
		<guid isPermaLink="false">https://slt-inc.jp/security/git-env-file-exposure/</guid>

					<description><![CDATA[<p>&#x516C;&#x958B;&#x30C7;&#x30A3;&#x30EC;&#x30AF;&#x30C8;&#x30EA;&#x306B;&#x6B8B;&#x3063;&#x305F;.git&#x3084;.env&#x306F;&#x3001;URL&#x3092;&#x77E5;&#x308B;&#x8AB0;&#x3067;&#x3082;&#x8AAD;&#x3081;&#x307E;&#x3059;&#x3002;&#x81EA;&#x793E;&#x30B5;&#x30A4;&#x30C8;&#x3067;&#x306E;&#x78BA;&#x304B;&#x3081;&#x65B9;&#x3068;&#x5FDC;&#x7B54;&#x30B3;&#x30FC;&#x30C9;&#x306E;&#x8AAD;&#x307F;&#x65B9;&#x3001;&#x898B;&#x3064;&#x304B;&#x3063;&#x305F;&#x6642;&#x306E;&#x512A;&#x5148;&#x9806;&#x4F4D;&#x3064;&#x304D;&#x306E;&#x5BFE;&#x51E6;&#x3001;Apache&#x3001;Nginx&#x3001;WordPress&#x306E;&#x518D;&#x767A;&#x9632;&#x6B62;&#x306E;&#x8A2D;&#x5B9A;&#x3092;&#x307E;&#x3068;&#x3081;&#x305F;&#x8A18;&#x4E8B;&#x3067;&#x3059;&#x3002;</p>
<p>The post <a href="https://slt-inc.jp/article/git-env-file-exposure/">.gitや.envが公開されていないか確認する方法と、見つかった時の対処</a> first appeared on <a href="https://slt-inc.jp">総合デジタルマーケティング企業 エスライン・テクノロジーズ</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="slt-art">
<div class="slt-meta">最終確認日: 2026年10月12日 / 編集: エスライン・テクノロジーズ株式会社 Webサイトセキュリティ編集チーム</div>
<div class="slt-lead"><p class="slt-lead-label">この記事の結論</p><p>自社サイトの <code>/.git/HEAD</code> と <code>/.env</code> を <code>curl -I</code> で確かめ、404か403ならその場所からは読めず、200なら中身を見て公開の有無を判断します。公開が見つかったら、公開を止める、中の鍵とパスワードをすべて作り直す、ログで読まれたかを調べる、の順に進めます。遮断の設定やGit履歴の削除だけでは、すでに読まれた値は使えるまま残るからです。</p></div>

<h2>最初に確認する2つのURLと、合否の目安</h2>
<p>最初に確かめるのは、自社サイトの <code>/.git/HEAD</code> と <code>/.env</code> です。<code>.git/HEAD</code> はGitの管理フォルダに必ずある1行のファイルで、.gitフォルダが外から見えるかの目印になります。<code>example.com</code> を自社のドメインに置き換え、ターミナルで次のコマンドを実行します。</p>
<pre class="slt-code"><code>curl -I https://example.com/.git/HEAD
curl -I https://example.com/.env

# 出力の例(1行目の数字が応答コード)
HTTP/2 404
content-type: text/html</code></pre>
<p>結果は、1行目の数字で次のように読みます。</p>
<ul>
<li><strong>404か403</strong>: その場所からは読めません。別の場所と入口は、後の章で確かめます。</li>
<li><strong>200</strong>: ブラウザで同じURLを開いて中身を見ます。<code>ref: refs/heads/main</code> のような1行や、<code>APP_KEY=</code> などの行が並べば公開中です。</li>
<li><strong>301や302</strong>: 別のURLへの転送です。<code>curl -IL</code> で転送先までたどり、最後の数字で判断します。</li>
</ul>
<div class="slt-callout is-note"><p class="slt-callout-title">補足</p><p>Windows PowerShell 5.1では、<code>curl</code> が別のコマンド(Invoke-WebRequest)の別名です。<code>curl.exe -I https://example.com/.env</code> のように拡張子まで入力すると、curl本体が動きます。</p></div>
<div class="slt-callout is-warn"><p class="slt-callout-title">注意</p><p>確かめてよいのは、自社が管理するサイトだけです。他人のサイトで同じURLを試すことの問題は、「他人のサイトを調べてはいけない理由」の章で説明します。</p></div>

<h2>.gitと.envが公開される3つの経路</h2>
<p>.gitや.envがURLで読めるのは、Webサーバーが外に配る「公開ディレクトリ」(ドキュメントルート)の中に置かれているからです。公開ディレクトリの外にあるファイルには、URLでは届きません。中に入り込む経路は、主に次の3つです。</p>
<ol>
<li><strong>プロジェクトの直下を公開している</strong>: 本来は <code>public</code> などの下位フォルダだけを公開する構成で、プロジェクト全体を公開している状態です。Laravelの公式文書も、プロジェクトの直下から配信すると多くの機密設定ファイルが公開されると注意しています。</li>
<li><strong>公開ディレクトリでGitを使う</strong>: 公開ディレクトリの中で <code>git clone</code> や <code>git pull</code> を実行して運用すると、.gitフォルダがそのまま残ります。FTPでプロジェクトのフォルダごとアップロードした時や、WordPressのテーマを開発フォルダのまま置いた時も同じです。</li>
<li><strong>バックアップと作業ファイルを残す</strong>: 移行作業で作ったzipやデータベースのダンプ、サーバー上の編集で生まれた <code>wp-config.php.bak</code> などの控えが残るケースです。エディターが自動で作る、名前が <code>~</code> で終わるファイルや <code>.swp</code> も含みます。</li>
</ol>
<figure class="slt-figure"><svg role="img" viewBox="0 0 800 400"><title>公開ディレクトリに .git や .env が入り込む3つの経路</title><desc>左に3つの経路(プロジェクトの直下を公開、公開先でgit clone、バックアップを公開先に保存)、中央に公開ディレクトリ、右にブラウザ。公開ディレクトリの中の .git、.env、backup.zip には、ブラウザからURLで届く。</desc><defs><marker id="f1-a" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto"><path d="M0,0 L10,5 L0,10 z" fill="#10265A"/></marker><marker id="f1-r" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto"><path d="M0,0 L10,5 L0,10 z" fill="#D00A0A"/></marker></defs><rect x="0" y="0" width="800" height="400" fill="#FFFFFF"/><rect x="16" y="36" width="256" height="84" rx="10" fill="#EEF2F9" stroke="#10265A" stroke-width="3"/><text x="144" y="70" font-size="22" fill="#10265A" text-anchor="middle">①プロジェクトの</text><text x="144" y="100" font-size="22" fill="#10265A" text-anchor="middle">直下を公開</text><rect x="16" y="158" width="256" height="84" rx="10" fill="#EEF2F9" stroke="#10265A" stroke-width="3"/><text x="144" y="192" font-size="22" fill="#10265A" text-anchor="middle">②公開先で</text><text x="144" y="222" font-size="22" fill="#10265A" text-anchor="middle">git clone、pull</text><rect x="16" y="280" width="256" height="84" rx="10" fill="#EEF2F9" stroke="#10265A" stroke-width="3"/><text x="144" y="314" font-size="22" fill="#10265A" text-anchor="middle">③バックアップを</text><text x="144" y="344" font-size="22" fill="#10265A" text-anchor="middle">公開先に保存</text><line x1="274" y1="78" x2="322" y2="78" stroke="#10265A" stroke-width="3" marker-end="url(#f1-a)"/><line x1="274" y1="200" x2="322" y2="200" stroke="#10265A" stroke-width="3" marker-end="url(#f1-a)"/><line x1="274" y1="322" x2="322" y2="322" stroke="#10265A" stroke-width="3" marker-end="url(#f1-a)"/><rect x="332" y="20" width="256" height="360" rx="12" fill="#EEF2F9" stroke="#10265A" stroke-width="3"/><text x="460" y="56" font-size="22" fill="#10265A" text-anchor="middle" font-weight="bold">公開ディレクトリ</text><text x="360" y="100" font-size="22" fill="#10265A">index.php</text><text x="360" y="136" font-size="22" fill="#10265A">css/</text><rect x="352" y="160" width="216" height="52" rx="8" fill="#FFFFFF" stroke="#D00A0A" stroke-width="3"/><text x="372" y="194" font-size="22" fill="#10265A">.git/</text><rect x="352" y="228" width="216" height="52" rx="8" fill="#FFFFFF" stroke="#D00A0A" stroke-width="3"/><text x="372" y="262" font-size="22" fill="#10265A">.env</text><rect x="352" y="296" width="216" height="52" rx="8" fill="#FFFFFF" stroke="#D00A0A" stroke-width="3"/><text x="372" y="330" font-size="22" fill="#10265A">backup.zip</text><text x="704" y="196" font-size="22" fill="#10265A" text-anchor="middle">URLで読める</text><rect x="628" y="216" width="152" height="64" rx="10" fill="#FFFFFF" stroke="#10265A" stroke-width="3"/><text x="704" y="256" font-size="22" fill="#10265A" text-anchor="middle">ブラウザ</text><line x1="626" y1="236" x2="576" y2="192" stroke="#D00A0A" stroke-width="3" marker-end="url(#f1-r)"/><line x1="626" y1="248" x2="576" y2="254" stroke="#D00A0A" stroke-width="3" marker-end="url(#f1-r)"/><line x1="626" y1="260" x2="576" y2="318" stroke="#D00A0A" stroke-width="3" marker-end="url(#f1-r)"/></svg><figcaption>図1 公開ディレクトリに .git、.env、バックアップが入り込む3つの経路。中に入ったファイルは、index.php などのページと同じように、ブラウザからURLで読めます。</figcaption></figure>
<div class="slt-callout is-note"><p class="slt-callout-title">補足</p><p>フォルダの中身の一覧表示(<a href="https://slt-inc.jp/glossary/directory-listing/">ディレクトリリスティング</a>)を止めても、.gitフォルダは守れません。.gitの中のファイルは名前と場所がGitの仕組みで決まっているため、一覧が無くても、個々のURLを直接指定されると読まれます。</p></div>

<h2>公開されると何が読まれるか</h2>
<p>.gitフォルダが読めると、ソースコードと変更の履歴が外に出ます。.envが読めると、書かれた鍵とパスワードがそのまま外に出ます。どちらも、一度読まれた値は相手の手元に残り、後から取り消せません。</p>
<h3>.gitフォルダから読まれるもの</h3>
<ul>
<li>ソースコード一式と変更の履歴。今は消したファイルや、過去に一度コミットしたパスワードも履歴に残ります。</li>
<li><code>.git/config</code> に書かれた接続先のURL。Gitの公式文書のとおり、URLには <code>ユーザー名:パスワード@</code> の形で認証情報を書けます。トークン入りのURLで <code>clone</code> していると、その値も読まれます。</li>
<li>コミットした人の名前とメールアドレス、ブランチ名など、開発体制の手がかり。</li>
</ul>
<h3>.envから読まれるもの</h3>
<p>.envは、フレームワークやアプリが起動時に読み込む設定ファイルです。データベースの接続先とパスワード、決済、メール配信、クラウドのAPIキー、Laravelの <code>APP_KEY</code> のような暗号鍵が並ぶのが一般的です。.envが読まれた時点で、書かれていた値はすべて漏洩したものとして扱います。</p>
<p>.gitと.env以外にも、公開ディレクトリに残りやすいファイルがあります。主な例は次の表のとおりです。</p>
<div class="slt-table-wrap"><table class="slt-table"><thead><tr><th>種類</th><th>ファイル名の例</th><th>読まれうる情報</th><th>よくある原因</th></tr></thead><tbody>
<tr><td>バージョン管理</td><td>.git/、.svn/</td><td>ソースコード、変更の履歴、接続先のURL</td><td>公開ディレクトリでのclone、フォルダごとの配置</td></tr>
<tr><td>環境設定</td><td>.env、.env.production、.env.bak</td><td>DBのパスワード、APIキー、暗号鍵</td><td>プロジェクトの直下を公開</td></tr>
<tr><td>設定ファイルの控え</td><td>wp-config.php.bak、config.php.old、~ や .swp で終わるファイル</td><td>DBのパスワード(PHPとして実行されず、文字のまま返る)</td><td>サーバー上での直接編集、エディターの自動保存</td></tr>
<tr><td>ダンプと圧縮ファイル</td><td>dump.sql、backup.zip、site.tar.gz</td><td>会員情報を含むデータベース、サイト一式</td><td>移行作業の残り、バックアップの保存先</td></tr>
<tr><td>ログと確認用ページ</td><td>wp-content/debug.log、phpinfo.php</td><td>内部のパス、SQL文、環境変数</td><td>デバッグ設定や確認用ファイルの消し忘れ</td></tr>
</tbody></table></div>
<div class="slt-callout is-note"><p class="slt-callout-title">補足</p><p>.envの値は、ファイル以外の形でも外に出ます。Viteは <code>VITE_</code>、Next.jsは <code>NEXT_PUBLIC_</code> で始まる変数を、ビルド時にブラウザ向けのJavaScriptへ埋め込む仕組みです。秘密の値にこの接頭辞を付けると、.envを守っていても値はブラウザから読めます。</p></div>

<h2>自分のサイトで公開を確認する手順と、見落としやすい場所</h2>
<p>確認は、ブラウザで中身を見る方法と、curlで応答コードを並べる方法を組み合わせます。見落としやすいのは、下位フォルダ、別のホスト名、HTTPの側、CDNの裏のサーバーです。</p>
<h3>ブラウザで中身を見る</h3>
<p>アドレス欄に <code>https://example.com/.git/HEAD</code> を入れて開きます。<code>ref: refs/heads/main</code> のような1行が出れば、.gitフォルダは公開中です。<code>.env</code> で <code>KEY=値</code> の行が並んだ場合も同じで、表示された値は画面共有やスクリーンショットで広げないようにします。</p>
<h3>curlで応答コードとサイズを並べる</h3>
<p>候補をまとめて確かめるなら、応答コードと受け取ったバイト数を1行ずつ並べます。サイズがすべて同じなら、同じエラーページかトップページが返っている目安です。macOSやLinuxのターミナル、WindowsならGit BashかWSLで動きます。</p>
<pre class="slt-code"><code>for p in /.git/HEAD /.git/config /.env /.env.production /wp-config.php.bak; do
  printf '%-22s ' "$p"
  curl -s -o /dev/null -w '%{http_code} %{size_download}B' "https://example.com$p"
  echo
done

# 出力の例
/.git/HEAD             404 153B
/.env                  404 153B</code></pre>
<h3>見落としやすい場所と入口</h3>
<p>トップの <code>/.git/HEAD</code> が404でも、別の場所や入口から読めることがあります。次の4つも確かめます。</p>
<ul>
<li><strong>下位フォルダ</strong>: <code>/blog/.git/HEAD</code> や <code>/wp-content/themes/テーマ名/.git/HEAD</code> など、Gitで管理していたフォルダの直下。</li>
<li><strong>別のホスト名</strong>: <code>www</code> の有無、<code>stg.</code> や <code>dev.</code> などの検証環境、使わなくなった旧ドメイン。</li>
<li><strong>HTTPとHTTPS</strong>: サーバーの設定が別々で、片方だけに拒否の設定が入っていることがあります。</li>
<li><strong>CDNの裏のサーバー</strong>: CDNや<a href="https://slt-inc.jp/glossary/waf/">WAF</a>で止めていても、元のサーバー(オリジン)にIPアドレスで届くと、その遮断を通りません。</li>
</ul>
<pre class="slt-code"><code># ホスト名と、HTTP、HTTPSの組み合わせを確かめる
for s in http https; do
  for h in example.com www.example.com; do
    printf '%-5s %-18s ' "$s" "$h"
    curl -s -o /dev/null -w '%{http_code}' "$s://$h/.env"; echo
  done
done

# CDNを通さず、オリジン(例: 203.0.113.10)へ直接確かめる
curl -sI --resolve example.com:443:203.0.113.10 https://example.com/.env | head -n 1</code></pre>
<p>候補を1つずつ試す手間を省くなら、自社の無料ツール「<a href="https://slt-inc.jp/service/security-checker/">Webサイトのセキュリティチェック</a>」も使えます。対象は、.git、.svn、.env、wp-config.phpの控え、SQLダンプ、バックアップの圧縮ファイルです。ページの取得(GET、HEAD、OPTIONS)だけで確かめ、診断できるのは自社または管理権限のあるサイトに限られます。</p>

<h2>200、403、404の読み方と、404でも安全と言い切れない理由</h2>
<p>応答コードは「その場所から読めるか」を示すだけで、安全の証明ではありません。200は中身を見るまで判断できず、404は確かめた経路の結果でしかないからです。</p>
<div class="slt-table-wrap"><table class="slt-table"><thead><tr><th>応答</th><th>起きていること</th><th>読み方</th><th>次にやること</th></tr></thead><tbody>
<tr><td>200</td><td>ファイル、または別のページが返った</td><td>中身しだい。本物なら公開中</td><td>中身を見る。本物なら対処の手順へ</td></tr>
<tr><td>200(ソフト404)</td><td>存在しないURLにも、トップページなどを返す設定</td><td>ファイルは渡っていない</td><td>サイズと中身がトップページと同じか見る</td></tr>
<tr><td>301、302</td><td>別のURLへの転送</td><td>まだ判断できない</td><td><code>curl -IL</code> で最後の応答を見る</td></tr>
<tr><td>401</td><td>認証の内側にある</td><td>認証が外れると読める</td><td>公開ディレクトリの外へ移す</td></tr>
<tr><td>403</td><td>拒否された</td><td>読めないが、存在は推測されうる</td><td>拒否の範囲が十分か確かめる</td></tr>
<tr><td>404</td><td>その場所に無い、または隠している</td><td>この経路からは読めない</td><td>別の場所と入口も確かめる</td></tr>
</tbody></table></div>
<p>表の「ソフト404」はGoogleの用語で、存在しないページにも200を返す状態を指します。迷った時は、次の図の順にたどります。</p>
<figure class="slt-figure"><svg role="img" viewBox="0 0 800 400"><title>応答コードから公開の有無を読む流れ</title><desc>curl -I で応答コードを見る。200なら中身を見て、本物なら公開中。403なら読めないが、存在は分かりうる。404ならこの経路は読めないが、他の入口も確かめる。</desc><defs><marker id="f2-a" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto"><path d="M0,0 L10,5 L0,10 z" fill="#10265A"/></marker></defs><rect x="0" y="0" width="800" height="400" fill="#FFFFFF"/><rect x="190" y="16" width="420" height="64" rx="10" fill="#EEF2F9" stroke="#10265A" stroke-width="3"/><text x="400" y="56" font-size="22" fill="#10265A" text-anchor="middle">curl -I で応答コードを見る</text><line x1="320" y1="82" x2="150" y2="134" stroke="#10265A" stroke-width="3" marker-end="url(#f2-a)"/><line x1="400" y1="82" x2="400" y2="134" stroke="#10265A" stroke-width="3" marker-end="url(#f2-a)"/><line x1="480" y1="82" x2="650" y2="134" stroke="#10265A" stroke-width="3" marker-end="url(#f2-a)"/><rect x="40" y="142" width="200" height="56" rx="10" fill="#FFFFFF" stroke="#D00A0A" stroke-width="3"/><text x="140" y="180" font-size="26" fill="#10265A" text-anchor="middle" font-weight="bold">200</text><rect x="300" y="142" width="200" height="56" rx="10" fill="#FFFFFF" stroke="#10265A" stroke-width="3"/><text x="400" y="180" font-size="26" fill="#10265A" text-anchor="middle" font-weight="bold">403</text><rect x="560" y="142" width="200" height="56" rx="10" fill="#FFFFFF" stroke="#10265A" stroke-width="3"/><text x="660" y="180" font-size="26" fill="#10265A" text-anchor="middle" font-weight="bold">404</text><line x1="140" y1="200" x2="140" y2="244" stroke="#10265A" stroke-width="3" marker-end="url(#f2-a)"/><line x1="400" y1="200" x2="400" y2="244" stroke="#10265A" stroke-width="3" marker-end="url(#f2-a)"/><line x1="660" y1="200" x2="660" y2="244" stroke="#10265A" stroke-width="3" marker-end="url(#f2-a)"/><rect x="20" y="252" width="240" height="120" rx="10" fill="#EEF2F9" stroke="#D00A0A" stroke-width="3"/><text x="140" y="302" font-size="22" fill="#10265A" text-anchor="middle">中身を見る</text><text x="140" y="338" font-size="22" fill="#10265A" text-anchor="middle">本物なら公開中</text><rect x="280" y="252" width="240" height="120" rx="10" fill="#EEF2F9" stroke="#10265A" stroke-width="3"/><text x="400" y="302" font-size="22" fill="#10265A" text-anchor="middle">読めないが</text><text x="400" y="338" font-size="22" fill="#10265A" text-anchor="middle">存在は分かりうる</text><rect x="540" y="252" width="240" height="120" rx="10" fill="#EEF2F9" stroke="#10265A" stroke-width="3"/><text x="660" y="302" font-size="22" fill="#10265A" text-anchor="middle">この経路は読めない</text><text x="660" y="338" font-size="22" fill="#10265A" text-anchor="middle">他の入口も確かめる</text></svg><figcaption>図2 応答コードから公開の有無を読む流れ。200は中身を見て本物かを判断し、403は読めないものの存在は推測されうる状態、404は確かめた経路では読めない状態です。404でも、ほかの場所と入口を続けて確かめます。</figcaption></figure>
<h3>404でも安全と言い切れない4つの理由</h3>
<ol>
<li><strong>確かめた経路の結果でしかない</strong>: 前の章の下位フォルダ、別のホスト名、HTTP、オリジンは、それぞれ別に確かめる必要があります。</li>
<li><strong>過去の公開は分からない</strong>: 今日の404は、昨日まで読めなかった証明になりません。過去の公開は、アクセスログで確かめます。</li>
<li><strong>HEADとGETで応答が違う場合がある</strong>: HTTPの仕様(RFC 9110)は、HEADにGETと同じヘッダーを返すことを『SHOULD』(推奨)にとどめています。<code>curl -I</code> が404や405でも、<code>-I</code> を外したGETでも確かめます。</li>
<li><strong>拒否が一部のファイルにしか効いていない</strong>: 設定の書き方によっては、<code>/.env</code> は403でも <code>/.git/HEAD</code> は200のまま、という状態が起きます。実例は、後の章のApacheの表に載せています。</li>
</ol>
<div class="slt-callout is-warn"><p class="slt-callout-title">注意</p><p>robots.txtに <code>Disallow: /.git/</code> などを書いても、アクセスは防げません。robots.txtの標準(RFC 9309)は、この規則はアクセスを許可する仕組みではないと明記しています。書いたパスは、かえって公開されて見つけやすくなるとも書かれています。</p></div>

<h2>他人のサイトを調べてはいけない理由</h2>
<p>他人のサイトに .git や .env があるかを、管理者の許可なく確かめるのはやめてください。見つけた値を使えば法律に触れるおそれがあり、URLを試すこと自体も、相手のログには攻撃の下調べと同じ形で残ります。主な論点は次の3つです。</p>
<ul>
<li><strong>不正アクセス禁止法</strong>: <a href="https://www.npa.go.jp/bureau/cyber/pdf/1_kaisetsu.pdf">警察庁の解説</a>によると、「不正アクセス行為」には2つの類型があります。他人のIDやパスワードを無断で入力して利用制限を外す行為と、設定ミスなどの不備を突いて制限を免れる行為です。.envで見つけたパスワードでデータベースや管理画面に入れば、これに当たるおそれがあります。</li>
<li><strong>取得、保管、提供</strong>: 不正アクセスに使う目的で他人のIDやパスワードを取得、保管することや、正当な理由なく人に渡すことも禁じられています。同じ解説は、検索中にたまたま表示された場合は、取得の罪に当たらないとも説明しています。</li>
<li><strong>試し方と負荷</strong>: IPAなどが定める<a href="https://www.ipa.go.jp/security/guide/vuln/ug65p90000019by0-att/partnership_guideline.pdf">情報セキュリティ早期警戒パートナーシップガイドライン</a>は、URLの数字を積極的に多数変えて試す行為を例に挙げています。こうした行為は、制限を免れる目的とみなされる可能性があるという説明です。故意にサーバーの性能を落とす行為は、業務妨害罪に触れる可能性があるとも述べています。</li>
</ul>
<p>同ガイドラインは、IPAが届出を受け付けても、発見の方法についての法的な責任は免除されないと明記しています。善意の確認であっても、許可の無い調査は自分を守る根拠になりません。</p>
<div class="slt-callout is-note"><p class="slt-callout-title">補足</p><p>他社のサイトを調べてよいのは、管理者の許可を得て、範囲と期間を決めた<a href="https://slt-inc.jp/glossary/vulnerability-assessment/">脆弱性診断</a>や<a href="https://slt-inc.jp/glossary/penetration-test/">ペネトレーションテスト</a>として行う場合です。法的な評価は個別の事情で変わるため、迷う時は弁護士などの専門家に確かめてください。</p></div>

<h2>漏洩が見つかった時の対処: 優先順位つきの7手順</h2>
<p>公開を見つけたら、すでに読まれた前提で、公開の停止、鍵の作り直し、ログの調査の順に進めます。1と2を最優先で終え、調査と連絡はその後に回します。</p>
<ol class="slt-steps">
<li><strong>公開を止める</strong>ファイルやフォルダを公開ディレクトリの外へ移すか、後の章の拒否の設定を入れ、URLが404か403になったことを確かめます。消す前に、書かれていた値の一覧と、ファイルの更新日時を控えます。アクセスログは調査に使うので、消さずに残してください。</li>
<li><strong>鍵とパスワードを失効させ、作り直す</strong>書かれていた値は、使っていないものも含めてすべて対象です。.gitが公開されていた場合は、履歴の全期間に一度でもコミットされた値まで含めます。新しい値は、公開ディレクトリの外にある設定に入れてから切り替えます。</li>
<li><strong>アクセスログで読まれたかを調べる</strong>該当URLに、いつ、どのIPアドレスへ、何バイトを返したかを確かめます。コマンドの例は、この手順の下に載せています。</li>
<li><strong>不正利用の跡を調べる</strong>データベースへの見知らぬ接続や操作、管理画面の不明なアカウント、クラウドやAPIの請求額、メールの送信履歴を確かめます。</li>
<li><strong>Git履歴から取り除く</strong>リポジトリに秘密の値が入っていた場合は、履歴からも取り除きます。手順と注意点は次の章で説明します。</li>
<li><strong>関係者に連絡する</strong>社内の責任者、制作や保守の委託先、APIの提供元に、何が、いつから公開されていたかを伝えます。個人情報を扱うデータベースに入られたおそれがあれば、個人情報保護委員会への報告が必要かを確かめます。</li>
<li><strong>再発防止を入れ、もう一度確かめる</strong>後の章の配置と設定を入れたあと、最初の章のcurlで、すべての場所と入口が404か403になることを確かめます。</li>
</ol>
<div class="slt-callout is-point"><p class="slt-callout-title">ポイント</p><p>鍵の作り直しより先に公開を止めるのは、公開されたままのファイルに新しい値を書くと、新しい値も同じURLから読めてしまうからです。逆に、遮断だけで終えると、すでに読まれた古い値は使えるまま残ります。</p></div>
<p>手順2で作り直す主な値と、切り替える時の注意は次のとおりです。</p>
<div class="slt-table-wrap"><table class="slt-table"><thead><tr><th>漏洩した値</th><th>作り直す場所</th><th>切り替える時の注意</th></tr></thead><tbody>
<tr><td>データベースのパスワード</td><td>DBサーバー、レンタルサーバーの管理画面</td><td>新しい値をアプリに設定してから古い値を無効にし、接続元の制限も見直す</td></tr>
<tr><td>APIキー、トークン(決済、メール配信、クラウド)</td><td>各サービスの管理画面</td><td>新しいキーへ切り替えてから古いキーを削除し、利用履歴を確かめる</td></tr>
<tr><td>Laravelの APP_KEY</td><td><code>php artisan key:generate</code></td><td>変えるとログイン中の全員がログアウトし、古い鍵で暗号化したデータは復号できなくなる</td></tr>
<tr><td>WordPressの認証用キーとソルト</td><td>wp-config.php の AUTH_KEY など</td><td>変えると既存のCookieが無効になり、全員が再ログインになる</td></tr>
<tr><td>.git/config 内のトークン</td><td>Gitホスティングの設定画面</td><td>トークンを失効させ、接続はSSHの鍵か、認証情報の保管機能に替える</td></tr>
</tbody></table></div>
<p>Laravelは、旧鍵を <code>APP_PREVIOUS_KEYS</code> に並べると、旧鍵で暗号化した値も復号できる仕組みを持っています。漏洩した鍵をここに残すと、その鍵で作られた値も受け付け続けるため、保存データを新しい鍵で暗号化し直したら外します。</p>
<p>手順3のログ確認では、該当URLへの要求のうち、200で返したものを抜き出します。ログの場所は、Nginxなら <code>/var/log/nginx/</code>、Apacheなら <code>/var/log/apache2/</code> や <code>/var/log/httpd/</code> が一般的です。レンタルサーバーでは、管理画面から取り出したログに同じ検索をかけます。</p>
<pre class="slt-code"><code># 200で返した .git と .env への要求(日時、IPアドレス、URL、返したバイト数)
zgrep -hE '/[.](git|env)' /var/log/nginx/access.log* |
  awk '$9 == 200 {print $4, $1, $7, $10}'

# IPアドレスごとの件数
zgrep -hE '/[.](git|env)' /var/log/nginx/access.log* |
  awk '$9 == 200 {print $1}' | sort | uniq -c | sort -rn</code></pre>
<p>標準のログ形式(combined)では、9番目の欄が応答コード、10番目が返したバイト数です。バイト数がトップページやエラーページと同じなら、ファイルの中身は渡っていない可能性が高いと読めます。見知らぬIPアドレスの国や組織は、自社の無料ツール「<a href="https://slt-inc.jp/service/ip-location-checker/">IPアドレスから位置を調べるツール</a>」でも調べられますが、結果は目安です。</p>
<div class="slt-callout is-warn"><p class="slt-callout-title">注意</p><p>CDNを使っている場合、オリジンで止めても、CDNのキャッシュに残ったファイルが配られ続けることがあります。該当URLのキャッシュを削除(パージ)し、CDN側のアクセスログも確かめてください。ログの保存期間より前の公開は確かめられないため、その期間の値は読まれたものとして扱います。</p></div>

<h2>Git履歴から消すだけでは足りない理由と、消す手順</h2>
<p>Git履歴から秘密の値を消しても、すでに複製されたものは消えません。公開されていた.gitを取得した人の手元、開発者のクローン、フォークには古い履歴が残ります。<a href="https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository">GitHubの公式文書</a>も、秘密の値は最初に失効させるか作り直すべきだとしています。</p>
<p>そのうえで履歴から取り除くのは、古い値の再利用や、別の人による再公開を防ぐためです。GitHubが示す手順の要点は、新しいクローンで書き換えて、まとめて送り直すことです。</p>
<pre class="slt-code"><code># 1. 作業用に、新しくクローンする
git clone https://github.com/組織名/リポジトリ名.git
cd リポジトリ名

# 2. 全履歴から .env を取り除く(git-filter-repo 2.47以降)
git filter-repo --sensitive-data-removal --invert-paths --path .env

# 3. 書き換えた履歴を送る(共同作業者へ事前に知らせる)
git push --force --mirror origin

# 4. 今後は追跡しないよう .gitignore に加える
echo ".env" &gt;&gt; .gitignore
git add .gitignore
git commit -m "Ignore .env"
git push origin main</code></pre>
<p>書き換えのあと、古いクローンを持つ人はクローンし直します。GitHubの文書は、古い履歴から作ったブランチを、mergeではなくrebaseするよう求めています。GitHubの画面に残るキャッシュや、プルリクエストが参照する古いコミットの削除は、GitHubサポートへの依頼が必要です。</p>
<div class="slt-callout is-warn"><p class="slt-callout-title">注意</p><p>git-filter-repoは、新しいクローンでないと書き換えを拒みます。追跡をやめるコミットを先に作ると止まるため、上の順番を守ります。書き換えは共同作業者全員の作業に影響するため、実行する日時の事前の共有が必要です。</p></div>

<h2>再発防止の基本: 公開ディレクトリの外に置く</h2>
<p>根本の対策は、秘密の値と管理用のフォルダを、公開ディレクトリの外に置く配置にすることです。サーバーの拒否設定は、移行や設定の書き換えで消えることがあるため、2段目の守りと考えます。</p>
<figure class="slt-figure"><svg role="img" viewBox="0 0 800 380"><title>危険な配置と安全な配置の違い</title><desc>左の危険な配置は、プロジェクトの直下(/var/www/site/)を公開しているため、.env、.git/、app/ にURLで届く。右の安全な配置は、public/ だけを公開しているため、.env、.git/、app/ にはURLで届かない。</desc><rect x="0" y="0" width="800" height="380" fill="#FFFFFF"/><text x="200" y="36" font-size="24" fill="#10265A" text-anchor="middle" font-weight="bold">危険な配置</text><rect x="20" y="56" width="360" height="304" rx="12" fill="#FFFFFF" stroke="#D00A0A" stroke-width="3"/><text x="40" y="96" font-size="22" fill="#10265A">/var/www/site/</text><text x="40" y="128" font-size="22" fill="#10265A">(ここを公開)</text><text x="64" y="176" font-size="22" fill="#10265A">.env</text><text x="64" y="214" font-size="22" fill="#10265A">.git/</text><text x="64" y="252" font-size="22" fill="#10265A">app/</text><text x="64" y="290" font-size="22" fill="#10265A">public/</text><text x="200" y="338" font-size="22" fill="#10265A" text-anchor="middle">すべてURLで届く</text><text x="600" y="36" font-size="24" fill="#10265A" text-anchor="middle" font-weight="bold">安全な配置</text><rect x="420" y="56" width="360" height="304" rx="12" fill="#FFFFFF" stroke="#10265A" stroke-width="3"/><text x="440" y="96" font-size="22" fill="#10265A">/var/www/site/</text><text x="464" y="136" font-size="22" fill="#10265A">.env</text><text x="544" y="136" font-size="22" fill="#10265A">.git/</text><text x="634" y="136" font-size="22" fill="#10265A">app/</text><text x="464" y="172" font-size="22" fill="#10265A">URLで届かない</text><rect x="444" y="196" width="312" height="144" rx="10" fill="#EEF2F9" stroke="#10265A" stroke-width="3"/><text x="464" y="236" font-size="22" fill="#10265A">public/</text><text x="464" y="270" font-size="22" fill="#10265A">(ここだけを公開)</text><text x="488" y="312" font-size="22" fill="#10265A">index.php</text></svg><figcaption>図3 危険な配置と安全な配置。左はプロジェクトの直下を公開しているため、.env や .git/ にもURLで届きます。右は public/ だけを公開しているため、その外にある .env、.git/、app/ にはURLで届きません。</figcaption></figure>
<ul>
<li><strong>Laravelなど</strong>: 公開ディレクトリを <code>public</code> に設定し、<code>.env</code> や <code>.git</code> はその1つ上に置きます。</li>
<li><strong>WordPress</strong>: 公式の手引きのとおり、<code>wp-config.php</code> はインストール先の1つ上の階層へ移しても動きます。</li>
<li><strong>バックアップ</strong>: 圧縮ファイルやダンプは、公開ディレクトリの外か別の保管場所に置き、作業後に消すことを手順書に入れます。</li>
<li><strong>公開先を変えられないサーバー</strong>: サーバー会社の案内で、公開フォルダの外に置ける場所があるかを確かめます。</li>
</ul>

<h2>サーバー設定で拒否する: Apache、Nginx、WordPressの例</h2>
<p>配置を直すまでの応急処置と、置き忘れへの備えとして、ドットで始まるファイルとフォルダ、バックアップのような名前を拒否します。ここでの設定例と表の応答は、nginx 1.30.5とApache 2.4.69での動作確認に基づきます。</p>
<h3>Apache(.htaccess)</h3>
<p>公開ディレクトリの <code>.htaccess</code> の先頭に、次の2行を書きます。正規表現の <code>[.]</code> は、ドットそのものを表す書き方です。</p>
<pre class="slt-code"><code># ドットで始まるファイルとフォルダを 404 にする(.well-known は除く)
RedirectMatch 404 /[.](?!well-known/)
# バックアップや作業用のファイルを 404 にする
RedirectMatch 404 (?i)([.](bak|old|orig|save|swp|sql)|~)$</code></pre>
<p><code>.well-known</code> を除くのは、<a href="https://slt-inc.jp/glossary/ssl-tls-certificate/">SSL/TLS証明書</a>の自動更新(Let&#8217;s Encryptなど)や <code>security.txt</code> がこの場所を使うためです。除外を忘れると証明書の更新が失敗するので、更新の状況は「<a href="https://slt-inc.jp/article/ssl-tls-certificate-check/">SSL/TLS証明書のチェック方法</a>」の手順で確かめます。サイトでzipなどを配布していなければ、2行目に <code>zip</code> や <code>gz</code> を足せます。</p>
<div class="slt-table-wrap"><table class="slt-table"><thead><tr><th>確かめたURL</th><th>上の2行</th><th>FilesMatchだけ</th><th>「.」の記号漏れ</th></tr></thead><tbody>
<tr><td>/.env</td><td>404</td><td>403</td><td>403</td></tr>
<tr><td>/.git/HEAD</td><td>404</td><td>200(読める)</td><td>403</td></tr>
<tr><td>/wp-config.php.bak</td><td>404</td><td>200(読める)</td><td>403</td></tr>
<tr><td>/.well-known/acme-challenge/(トークン)</td><td>200</td><td>200</td><td>403(更新が止まる)</td></tr>
<tr><td>/index.html</td><td>200</td><td>200</td><td>403(サイト全体が止まる)</td></tr>
</tbody></table></div>
<p>表の「FilesMatchだけ」は、<code>&lt;FilesMatch "^[.]"&gt;</code> と <code>Require all denied</code> の組み合わせです。<a href="https://httpd.apache.org/docs/2.4/mod/core.html#files">Apacheの公式文書</a>のとおり、FilesMatchはファイル名(パスの最後の部分)だけを見ます。そのため <code>/.git/HEAD</code> は <code>HEAD</code> という名前で判定され、拒否されません。</p>
<div class="slt-callout is-warn"><p class="slt-callout-title">注意</p><p>正規表現の <code>.</code> は「任意の1文字」です。ドットの前の記号が抜けた <code>^.(?!well-known)</code> のような書き方は、ほぼすべてのURLに当てはまり、表の右端の列のようにトップページまで止まります。Webページからコピーすると記号が消えることがあるため、この記事では <code>[.]</code> と書いています。</p></div>
<p>.htaccessは、サーバーが上書きを許している時だけ効く仕組みです。許可が無いとエラーも出ずに何も効かないため、書いた後は <code>/.env</code> が404になるかをcurlで確かめます。</p>
<p>一覧表示を止める <code>Options -Indexes</code> は、上書きの許可が無いと、書いただけでサイト全体が500エラーになります。追加したら、すぐにトップページを開いて確かめてください。</p>
<h3>Nginx</h3>
<p>Nginxは.htaccessを読まないため、サーバー設定の <code>server</code> ブロックに書きます。書いたら <code>nginx -t</code> で構文を確かめてから、設定を再読み込みします。</p>
<pre class="slt-code"><code># ほかの正規表現の location より前に書く
location ~ /[.](?!well-known/) {
    return 404;
}
location ~* ([.](bak|old|orig|save|swp|sql)|~)$ {
    return 404;
}

# ^~ を付けた location の中では上の規則が効かないため、中にも書く
location ^~ /assets/ {
    location ~ /[.] {
        return 404;
    }
}</code></pre>
<p><a href="https://nginx.org/en/docs/http/ngx_http_core_module.html#location">Nginxの公式文書</a>のとおり、正規表現のlocationは書いた順に調べられ、最初に当てはまったものが使われます。静的ファイル用の正規表現を先に書くと、<code>/.notes.txt</code> のようなファイルがそちらで配られます。また、<code>^~</code> を付けたlocationの下では正規表現が調べられないため、例の <code>/assets/.env</code> は中に拒否を書くまで200のままです。</p>
<h3>WordPress</h3>
<p>Apacheで動くWordPressでは、上の2行に <code>wp-config.php</code> の拒否を加えたものを、<code>.htaccess</code> の先頭に置く形が基本です。<a href="https://developer.wordpress.org/advanced-administration/security/hardening/">WordPressの公式の手引き</a>によると、<code># BEGIN WordPress</code> と <code># END WordPress</code> の間は、WordPressが書き換えることがあります。そのため、追加する行はこの範囲の外に書きます。</p>
<pre class="slt-code"><code># 既存の「# BEGIN WordPress」より上に、次の行を足す
RedirectMatch 404 /[.](?!well-known/)
RedirectMatch 404 (?i)([.](bak|old|orig|save|swp|sql)|~)$
&lt;Files "wp-config.php"&gt;
    Require all denied
&lt;/Files&gt;

# (この下に、WordPressが管理する「# BEGIN WordPress」から
#  「# END WordPress」までが続く。その間には書き足さない)</code></pre>
<p>あわせて、<code>wp-config.php</code> の <code>WP_DEBUG_LOG</code> の値も確認が必要です。<code>true</code> にすると、エラーは既定で <code>wp-content/debug.log</code> に書かれ、公開ディレクトリの中に残ります。本体やプラグインの更新状況も合わせて点検するなら、「<a href="https://slt-inc.jp/article/wordpress-vulnerability-check/">WordPressの脆弱性を確認する方法</a>」の手順が使えます。</p>
<p>サーバー設定を開く機会に、<a href="https://slt-inc.jp/glossary/security-headers/">セキュリティヘッダー</a>も一緒に見直すと、作業が1回で済みます。設定例は「<a href="https://slt-inc.jp/article/security-headers-setup/">セキュリティヘッダーの設定方法</a>」にまとめています。</p>

<h2>デプロイ手順と.gitignoreで、混入を防ぐ</h2>
<p>.gitや.envを公開先へ持ち込まない手順にすれば、拒否の設定に頼る場面が減ります。要点は、公開するファイルだけを、決まった手順で送ることです。</p>
<ul>
<li><strong>送るのはビルド後の成果物だけ</strong>: <code>dist</code> や <code>public</code> など、公開用のフォルダだけを送ります。<code>git archive</code> で作るアーカイブには、.gitフォルダが入りません。</li>
<li><strong>公開ディレクトリでcloneしない</strong>: Gitの操作は公開ディレクトリの外で行い、成果物だけを配置します。</li>
<li><strong>FTPでフォルダごと上げない</strong>: 送る前に、ドットで始まる隠しファイルを表示して、中身を確かめます。</li>
<li><strong>検証環境も同じ扱いにする</strong>: <code>stg.</code> などの検証環境は、<a href="https://slt-inc.jp/glossary/ip%e5%88%b6%e9%99%90/">IP制限</a>やBasic認証で関係者だけに絞ります。</li>
</ul>
<p>.gitignoreは、秘密の値をリポジトリに入れないための設定です。ただし<a href="https://git-scm.com/docs/gitignore">Gitの公式文書</a>のとおり、すでに追跡しているファイルには効かないため、<code>git rm --cached</code> で追跡を外してから使います。</p>
<pre class="slt-code"><code># .gitignore の例(.env.example だけは共有する)
.env
.env.*
!.env.example
*.log
*.sql
*.bak

# すでに追跡している .env を外す(手元のファイルは残る)
git rm --cached .env</code></pre>
<h3>デプロイ前に自動で止める</h3>
<p>人の注意に頼らず、公開用のフォルダに置いてはいけないファイルがあれば、デプロイを止める確認を手順に組み込みます。次の例は、見つかった時に終了コード1で止まるため、CIの1工程として使えます。</p>
<pre class="slt-code"><code># 公開するフォルダ(ここでは dist)に、置いてはいけないファイルが無いか確かめる
found=$(find dist -name '.git' -o -name '.env*' -o -name '*.sql' -o -name '*.bak')
if [ -n "$found" ]; then
  echo "公開してはいけないファイルがあります:"
  echo "$found"
  exit 1
fi</code></pre>
<p>コミットの段階では、OSSのGitleaksなど、パスワードやAPIキーの形の文字列を見つける道具を、コミット前の確認(pre-commit)に入れられます。GitHubの公開リポジトリでは、シークレットスキャンが無料で自動的に動く仕組みです。公開後は、同じURLを外から定期的に確かめる処理を<a href="https://slt-inc.jp/glossary/%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e7%9b%a3%e8%a6%96/">サーバー監視</a>の項目に加えると、設定の巻き戻りに気づけます。</p>
<h3>公開前と更新後のチェックリスト</h3>
<ul class="slt-check">
<li>公開ディレクトリが <code>public</code> などの公開用フォルダだけを指している</li>
<li><code>/.git/HEAD</code>、<code>/.env</code>、<code>/wp-config.php.bak</code> が、すべてのホスト名とHTTP、HTTPSで404か403になる</li>
<li>CDNを使う場合、オリジンへ直接確かめても同じ結果になる</li>
<li>拒否の設定を入れた後も、トップページと <code>/.well-known/</code> の下が表示される</li>
<li>公開ディレクトリに、zip、SQLダンプ、debug.log、phpinfoのページが残っていない</li>
<li>.gitignoreに .env が入り、<code>git ls-files</code> の一覧に .env が出てこない</li>
<li>デプロイの手順に、置いてはいけないファイルの確認が入っている</li>
</ul>
<p>サーバーの入れ替え、デプロイ方法の変更、制作会社の交代の後が、このリストを最初からやり直す時期です。公開ファイル以外の点検項目は、「<a href="https://slt-inc.jp/article/website-security-check-items/">Webサイトのセキュリティチェック項目30選</a>」にまとめています。無料の簡易チェックで分かる範囲と、専門の診断が要る場面の違いは、「<a href="https://slt-inc.jp/article/vulnerability-assessment-vs-simple-check/">簡易チェックと脆弱性診断の違い</a>」で説明しています。</p>

<h2>よくある質問</h2>
<div class="slt-faq"><h3>.env.exampleや.gitignoreが見えているのも問題ですか？</h3><p>直ちに鍵が漏れるわけではありませんが、公開する必要は無いため、拒否の対象に含めます。.env.exampleは値を空にした見本のはずなので、本物の値が入ったまま置かれていないかの確認が必要です。.gitignoreに秘密の値は入りませんが、使っている仕組みやファイル名の手がかりになります。</p></div>
<div class="slt-faq"><h3>取引先や他社のサイトで.envが見えてしまったら、どうすればよいですか？</h3><p>中身を保存、共有、利用せず、見つけたURLと日時だけを伝えます。伝え先は、運営者に問い合わせ窓口があればそこ、無ければIPAの脆弱性関連情報の届出窓口です。ほかのファイルを試して確かめることは、本文で説明した法的な問題につながるため行いません。</p></div>
<div class="slt-faq"><h3>GitHubの公開リポジトリに.envを上げてしまった時も、同じ対処ですか？</h3><p>同じで、最初に中の値を失効させて作り直します。公開リポジトリではGitHubのシークレットスキャンが自動で動きますが、検出されるのは既知の形式の値で、すべての秘密が対象になるわけではありません。履歴からの削除は、本文の手順のとおり新しいクローンで行います。</p></div>
<div class="slt-faq"><h3>個人情報を扱うデータベースのパスワードが漏れたら、報告の義務はありますか？</h3><p>不正な接続の跡があるなど、個人データが漏えいしたおそれがある場合は、個人情報保護委員会への報告と本人への通知が必要になることがあります。委員会の案内では、不正の目的によるおそれがある漏えい等は報告の対象で、速報は発覚から3〜5日以内、確報は60日以内です。2026年7月に公布された改正法で一部の緩和が予定されているため、<a href="https://www.ppc.go.jp/personalinfo/legal/leakAction/">個人情報保護委員会の案内</a>で最新の扱いを確かめてください。</p></div>
<div class="slt-faq"><h3>公開されていた期間が分からない時は、どこまで作り直せばよいですか？</h3><p>そのファイルが公開ディレクトリに置かれた日以降に、一度でも書かれていた値をすべて作り直します。置かれた日は、デプロイの記録やファイルの更新日時、Gitの履歴から推定します。.gitが公開されていた場合は、履歴に残る全期間の値が対象です。</p></div>
<div class="slt-faq"><h3>レンタルサーバーで、サーバーの設定を変えられない時はどうすればよいですか？</h3><p>まず、ファイル自体を公開フォルダの外へ移すか、不要なら削除します。.htaccessはApache系のサーバーで上書きが許可されている時だけ効き、Nginxのサーバーでは置いても読まれません。どちらか分からない時は、サーバー会社の管理画面やサポートで、アクセスを制限する機能の有無を確かめます。</p></div>
<div class="slt-faq"><h3>静的なサイトやWordPressだけのサイトでも、確認は必要ですか？</h3><p>必要です。静的なサイトでも、リポジトリの直下をそのまま公開する構成や、フォルダごとアップロードする運用では.gitが入ります。WordPressでは、テーマやプラグインの開発フォルダに残る.git、<code>wp-config.php</code> の控え、<code>debug.log</code> が見落とされやすい場所です。</p></div>

<div class="slt-related"><a class="slt-related-item" href="https://slt-inc.jp/article/website-security-check-items/"><span class="slt-related-thumb"><img src="https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24854-security-checklist-300x200.png" srcset="https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24854-security-checklist-300x200.png 300w, https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24854-security-checklist-768x512.png 768w" sizes="auto, (max-width: 560px) 78vw, 300px" width="300" height="200" alt="" loading="lazy" decoding="async"></span><span class="slt-related-kind">関連記事</span><span class="slt-related-title">Webサイトのセキュリティチェック項目30選｜確認方法つき一覧表</span></a><a class="slt-related-item" href="https://slt-inc.jp/article/vulnerability-assessment-vs-simple-check/"><span class="slt-related-thumb"><img src="https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24878-assessment-difference-300x200.png" srcset="https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24878-assessment-difference-300x200.png 300w, https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24878-assessment-difference-768x512.png 768w" sizes="auto, (max-width: 560px) 78vw, 300px" width="300" height="200" alt="" loading="lazy" decoding="async"></span><span class="slt-related-kind">関連記事</span><span class="slt-related-title">簡易チェックと脆弱性診断の違い｜無料ツールでできることと、専門業者が必要な場面</span></a><a class="slt-related-item" href="https://slt-inc.jp/article/wordpress-vulnerability-check/"><span class="slt-related-thumb"><img src="https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24880-wordpress-vulnerability-300x200.png" srcset="https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24880-wordpress-vulnerability-300x200.png 300w, https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24880-wordpress-vulnerability-768x512.png 768w" sizes="auto, (max-width: 560px) 78vw, 300px" width="300" height="200" alt="" loading="lazy" decoding="async"></span><span class="slt-related-kind">関連記事</span><span class="slt-related-title">WordPressの脆弱性を確認する方法｜本体、プラグインの更新と対処の手順</span></a><a class="slt-related-item" href="https://slt-inc.jp/article/security-headers-setup/"><span class="slt-related-thumb"><img src="https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24853-security-headers-300x200.png" srcset="https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24853-security-headers-300x200.png 300w, https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24853-security-headers-768x512.png 768w" sizes="auto, (max-width: 560px) 78vw, 300px" width="300" height="200" alt="" loading="lazy" decoding="async"></span><span class="slt-related-kind">関連記事</span><span class="slt-related-title">セキュリティヘッダーの設定方法｜HSTS、CSPの設定例つき</span></a></div>

<div class="slt-cta"><p class="slt-cta-title">公開ファイルの確認を、まとめて無料で</p><p>URLを入れるだけで、.git、.env、wp-config.phpの控え、SQLダンプなどが外から読めないかを、ページの取得だけで確かめます。登録は不要で、診断できるのは自社または管理権限のあるサイトです。結果の読み方や見つかった後の対処に迷う時は、<a href="https://slt-inc.jp/inquiry/">お問い合わせ</a>から診断と対策をご相談いただけます。</p><a class="slt-cta-btn" href="https://slt-inc.jp/service/security-checker/">無料でWebサイトをチェックする</a></div>
</div>
<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": ".env.exampleや.gitignoreが見えているのも問題ですか？", "acceptedAnswer": {"@type": "Answer", "text": "直ちに鍵が漏れるわけではありませんが、公開する必要は無いため、拒否の対象に含めます。.env.exampleは値を空にした見本のはずなので、本物の値が入ったまま置かれていないかの確認が必要です。.gitignoreに秘密の値は入りませんが、使っている仕組みやファイル名の手がかりになります。"}}, {"@type": "Question", "name": "取引先や他社のサイトで.envが見えてしまったら、どうすればよいですか？", "acceptedAnswer": {"@type": "Answer", "text": "中身を保存、共有、利用せず、見つけたURLと日時だけを伝えます。伝え先は、運営者に問い合わせ窓口があればそこ、無ければIPAの脆弱性関連情報の届出窓口です。ほかのファイルを試して確かめることは、本文で説明した法的な問題につながるため行いません。"}}, {"@type": "Question", "name": "GitHubの公開リポジトリに.envを上げてしまった時も、同じ対処ですか？", "acceptedAnswer": {"@type": "Answer", "text": "同じで、最初に中の値を失効させて作り直します。公開リポジトリではGitHubのシークレットスキャンが自動で動きますが、検出されるのは既知の形式の値で、すべての秘密が対象になるわけではありません。履歴からの削除は、本文の手順のとおり新しいクローンで行います。"}}, {"@type": "Question", "name": "個人情報を扱うデータベースのパスワードが漏れたら、報告の義務はありますか？", "acceptedAnswer": {"@type": "Answer", "text": "不正な接続の跡があるなど、個人データが漏えいしたおそれがある場合は、個人情報保護委員会への報告と本人への通知が必要になることがあります。委員会の案内では、不正の目的によるおそれがある漏えい等は報告の対象で、速報は発覚から3〜5日以内、確報は60日以内です。2026年7月に公布された改正法で一部の緩和が予定されているため、個人情報保護委員会の案内で最新の扱いを確かめてください。"}}, {"@type": "Question", "name": "公開されていた期間が分からない時は、どこまで作り直せばよいですか？", "acceptedAnswer": {"@type": "Answer", "text": "そのファイルが公開ディレクトリに置かれた日以降に、一度でも書かれていた値をすべて作り直します。置かれた日は、デプロイの記録やファイルの更新日時、Gitの履歴から推定します。.gitが公開されていた場合は、履歴に残る全期間の値が対象です。"}}, {"@type": "Question", "name": "レンタルサーバーで、サーバーの設定を変えられない時はどうすればよいですか？", "acceptedAnswer": {"@type": "Answer", "text": "まず、ファイル自体を公開フォルダの外へ移すか、不要なら削除します。.htaccessはApache系のサーバーで上書きが許可されている時だけ効き、Nginxのサーバーでは置いても読まれません。どちらか分からない時は、サーバー会社の管理画面やサポートで、アクセスを制限する機能の有無を確かめます。"}}, {"@type": "Question", "name": "静的なサイトやWordPressだけのサイトでも、確認は必要ですか？", "acceptedAnswer": {"@type": "Answer", "text": "必要です。静的なサイトでも、リポジトリの直下をそのまま公開する構成や、フォルダごとアップロードする運用では.gitが入ります。WordPressでは、テーマやプラグインの開発フォルダに残る.git、wp-config.php の控え、debug.log が見落とされやすい場所です。"}}]}</script><p>The post <a href="https://slt-inc.jp/article/git-env-file-exposure/">.gitや.envが公開されていないか確認する方法と、見つかった時の対処</a> first appeared on <a href="https://slt-inc.jp">総合デジタルマーケティング企業 エスライン・テクノロジーズ</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>セキュリティヘッダーの設定方法｜HSTS・CSPの設定例つき</title>
		<link>https://slt-inc.jp/article/security-headers-setup/</link>
		
		<dc:creator><![CDATA[slt]]></dc:creator>
		<pubDate>Wed, 30 Sep 2026 00:47:00 +0000</pubDate>
				<category><![CDATA[セキュリティ]]></category>
		<category><![CDATA[記事]]></category>
		<category><![CDATA[CSP]]></category>
		<category><![CDATA[HSTS]]></category>
		<category><![CDATA[HTTPS]]></category>
		<category><![CDATA[Webサイトセキュリティ]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[セキュリティヘッダー]]></category>
		<category><![CDATA[セキュリティ対策]]></category>
		<guid isPermaLink="false">https://slt-inc.jp/?p=24853</guid>

					<description><![CDATA[<p><a class="glossaryLink"  aria-describedby="tt"  data-cmtooltip="&#60;div class=glossaryItemBody&#62;&#12475;&#12461;&#12517;&#12522;&#12486;&#12451;&#12504;&#12483;&#12480;&#12540;&#12392;&#12399;&#12475;&#12461;&#12517;&#12522;&#12486;&#12451;&#12504;&#12483;&#12480;&#12540;&#12399;&#12289;Web&#12469;&#12540;&#12496;&#12540;&#12364;HTTP&#12398;&#24540;&#31572;&#12395;&#20184;&#12369;&#12390;&#12289;&#12502;&#12521;&#12454;&#12470;&#12395;&#20633;&#12431;&#12387;&#12383;&#38450;&#24481;&#27231;&#33021;&#12434;&#26377;&#21177;&#12395;&#12373;&#12379;&#12427;HTTP&#12504;&#12483;&#12480;&#12540;&#12398;&#32207;&#31216;&#12391;&#12377;&#12290;&#12469;&#12540;&#12496;&#12540;&#12398;&#35373;&#23450;&#12434;&#36275;&#12377;&#12384;&#12369;&#12391;&#12289;&#12450;&#12503;&#12522;&#12465;&#12540;&#12471;&#12519;&#12531;&#12398;&#12467;&#12540;&#12489;&#12434;&#22793;&#12360;&#12378;&#12395;&#12289;&#23432;&#12426;&#12434;1&#23652;&#22679;&#12420;&#12379;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;&#12475;&#12461;&#12517;&#12522;&#12486;&#12451;&#12504;&#12483;&#12480;&#12540;&#12364;&#24517;&#35201;&#12394;&#29702;&#30001;XSS&#12289;&#12463;&#12522;&#12483;&#12463;&#12472;&#12515;&#12483;&#12461;&#12531;&#12464;&#12289;&#36890;&#20449;&#12398;&#12480;&#12454;&#12531;&#12464;&#12524;&#12540;&#12489;&#12289;&#12501;&#12449;&#12452;&#12523;&#31278;&#21029;&#12398;&#35492;&#35469;&#12392;&#12356;&#12387;&#12383;&#25915;&#25731;&#12399;&#12289;&#12502;&#12521;&#12454;&#12470;&#20596;&#12398;&#27231;&#33021;&#12391;&#38450;&#12370;&#12427;&#12418;&#12398;&#12364;&#12354;&#12426;&#12414;&#12377;&#12290;&#12383;&#12384;&#12375;&#12289;&#27231;&#33021;&#12399;&#12289;&#12469;&#12540;&#12496;&#12540;&#12364;&#25351;&#31034;&#12434;&#20986;&#12375;&#12390;&#21021;&#12417;&#12390;&#20685;&#12365;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;&#12475;&#12461;&#12517;&#12522;&#12486;&#12451;&#12504;&#12483;&#12480;&#12540;&#12399;&#12289;&#33030;&#24369;&#24615;&#12381;&#12398;&#12418;&#12398;&#12434;&#30452;&#12377;&#12418;&#12398;&#12391;&#12399;&#12394;&#12367;&#12289;&#34987;&#23475;&#12434;&#25233;&#12360;&#12427;&#35036;&#21161;&#12391;&#12377;&#12290;&#35386;&#26029;&#12484;&#12540;&#12523;&#12364;&#26368;&#21021;&#12395;&#30906;&#35469;&#12377;&#12427;&#38917;&#30446;&#12391;&#12418;&#12354;&#12426;&#12289;&#26410;&#35373;&#23450;&#12398;&#25351;&#25688;&#12364;&#20986;&#12420;&#12377;&#12356;&#37096;&#20998;&#12391;&#12377;&#12290;&#38;lt;br/&#38;gt;&#12475;&#12461;&#12517;&#12522;&#12486;&#12451;&#12504;&#12483;&#12480;&#12540;&#12398;&#20181;&#32068;&#12415;&#38;lt;table&#38;gt;&#38;lt;thead&#38;gt;&#38;lt;tr&#38;gt;&#38;lt;th&#38;gt;&#12504;&#12483;&#12480;&#12540;&#38;lt;/th&#38;gt;&#38;lt;th&#38;gt;&#24441;&#21106;&#38;lt;/th&#38;gt;&#38;lt;th&#38;gt;&#20516;&#12398;&#20363;&#38;lt;/th&#38;gt;&#38;lt;/tr&#38;gt;&#38;lt;/thead&#38;gt;&#38;lt;tbody&#38;gt;&#38;lt;tr&#38;gt;&#38;lt;td&#38;gt;Strict-Transport-Security&#38;lt;/td&#38;gt;&#38;lt;td&#38;gt;HTTPS&#12391;&#12398;&#25509;&#32154;&#12434;&#24375;&#21046;&#12377;&#12427;&#38;lt;/td&#38;gt;&#38;lt;td&#38;gt;&#38;lt;code&#38;gt;max-age=31536000&#38;lt;/code&#38;gt;&#38;lt;/td&#38;gt;&#38;lt;/tr&#38;gt;&#38;lt;tr&#38;gt;&#38;lt;td&#38;gt;Content-Security-Policy&#38;lt;/td&#38;gt;&#38;lt;td&#38;gt;&#35501;&#12415;&#36796;&#12415;&#20803;&#12434;&#21046;&#38480;&#12375;&#12289;XSS&#12398;&#34987;&#23475;&#12434;&#25233;&#12360;&#12427;&#38;lt;/td&#38;gt;&#38;lt;td&#38;gt;&#38;lt;code&#38;gt;default-src &#38;#039;self&#38;#039;&#38;lt;/code&#38;gt;&#38;lt;/td&#38;gt;&#38;lt;/tr&#38;gt;&#38;lt;tr&#38;gt;&#38;lt;td&#38;gt;X-Frame-Options&#38;lt;/td&#38;gt;&#38;lt;td&#38;gt;iframe&#12408;&#12398;&#22475;&#12417;&#36796;&#12415;&#12434;&#21046;&#38480;&#12377;&#12427;&#38;lt;/td&#38;gt;&#38;lt;td&#38;gt;&#38;lt;code&#38;gt;SAMEORIGIN&#38;lt;/code&#38;gt;&#38;lt;/td&#38;gt;&#38;lt;/tr&#38;gt;&#38;lt;tr&#38;gt;&#38;lt;td&#38;gt;X-Content-Type-Options&#38;lt;/td&#38;gt;&#38;lt;td&#38;gt;&#12501;&#12449;&#12452;&#12523;&#31278;&#21029;&#12398;&#25512;&#28204;&#12434;&#27490;&#12417;&#12427;&#38;lt;/td&#38;gt;&#38;lt;td&#38;gt;&#38;lt;code&#38;gt;nosniff&#38;lt;/code&#38;gt;&#38;lt;/td&#38;gt;&#38;lt;/tr&#38;gt;&#38;lt;tr&#38;gt;&#38;lt;td&#38;gt;Referrer-Policy&#38;lt;/td&#38;gt;&#38;lt;td&#38;gt;&#21442;&#29031;&#20803;URL&#12398;&#36865;&#20449;&#31684;&#22258;&#12434;&#27770;&#12417;&#12427;&#38;lt;/td&#38;gt;&#38;lt;td&#38;gt;&#38;lt;code&#38;gt;strict-origin-when-cross-origin&#38;lt;/code&#38;gt;&#38;lt;/td&#38;gt;&#38;lt;/tr&#38;gt;&#38;lt;tr&#38;gt;&#38;lt;td&#38;gt;Permissions-Policy&#38;lt;/td&#38;gt;&#38;lt;td&#38;gt;&#12502;&#12521;&#12454;&#12470;&#27231;&#33021;&#12398;&#21033;&#29992;&#12434;&#21046;&#38480;&#12377;&#12427;&#38;lt;/td&#38;gt;&#38;lt;td&#38;gt;&#38;lt;code&#38;gt;camera=(), microphone=()&#38;lt;/code&#38;gt;&#38;lt;/td&#38;gt;&#38;lt;/tr&#38;gt;&#38;lt;/tbody&#38;gt;&#38;lt;/table&#38;gt;&#12377;&#12391;&#12395;&#24441;&#30446;&#12434;&#32066;&#12360;&#12383;&#12418;&#12398;&#12418;&#12354;&#12426;&#12414;&#12377;&#12290;&#38;lt;code&#38;gt;X-XSS-Protection&#38;lt;/code&#38;gt; &#12399;&#12289;OWASP&#12364;&#20184;&#12369;&#12394;&#12356;&#12424;&#12358;&#21223;&#12417;&#12390;&#12356;&#12414;&#12377;&#12290;&#38;lt;code&#38;gt;Expect-CT&#38;lt;/code&#38;gt; &#12392; &#38;lt;code&#38;gt;Public-Key-Pins&#38;lt;/code&#38;gt; &#12418;&#12289;&#20351;&#12356;&#12414;&#12379;&#12435;&#12290;&#36870;&#12395;&#12289;&#38;lt;code&#38;gt;Server&#38;lt;/code&#38;gt; &#12420; &#38;lt;code&#38;gt;X-Powered-By&#38;lt;/code&#38;gt; &#12395;&#12496;&#12540;&#12472;&#12519;&#12531;&#30058;&#21495;&#12364;&#20986;&#12390;&#12356;&#12427;&#22580;&#21512;&#12399;&#12289;&#28040;&#12377;&#12363;&#12289;&#31777;&#32032;&#12395;&#12375;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;&#12475;&#12461;&#12517;&#12522;&#12486;&#12451;&#12504;&#12483;&#12480;&#12540;&#12398;&#30906;&#35469;&#26041;&#27861;&#38283;&#30330;&#32773;&#12484;&#12540;&#12523;&#12398;&#12300;&#12493;&#12483;&#12488;&#12527;&#12540;&#12463;&#12301;&#12479;&#12502;&#12391;&#12289;HTML&#25991;&#26360;&#12398;&#12300;&#12524;&#12473;&#12509;&#12531;&#12473;&#12504;&#12483;&#12480;&#12540;&#12301;&#12434;&#38283;&#12365;&#12414;&#12377;&#12290;&#12467;&#12510;&#12531;&#12489;&#12391;&#12399;&#12289;&#24540;&#31572;&#12504;&#12483;&#12480;&#12540;&#12434;&#12377;&#12409;&#12390;&#34920;&#31034;&#12391;&#12365;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt; &#38;lt;code&#38;gt;curl -s -D - -o /dev/null https://example.com/&#38;lt;/code&#38;gt; Windows&#12398;PowerShell&#12391;&#12399; &#38;lt;code&#38;gt;curl.exe -s -D - -o NUL https://example.com/&#38;lt;/code&#38;gt; &#12391;&#12377;&#12290;&#34920;&#12398;6&#12388;&#12398;&#12358;&#12385;&#12289;&#12393;&#12428;&#12364;&#36820;&#12387;&#12390;&#12356;&#12394;&#12356;&#12363;&#12434;&#35211;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;&#12475;&#12461;&#12517;&#12522;&#12486;&#12451;&#12504;&#12483;&#12480;&#12540;&#12398;&#35373;&#23450;&#20363;CSP&#12399;&#12289;&#27573;&#38542;&#30340;&#12394;&#23566;&#20837;&#12364;&#24517;&#35201;&#12394;&#12383;&#12417;&#12289;&#12371;&#12371;&#12395;&#12399;&#21547;&#12417;&#12390;&#12356;&#12414;&#12379;&#12435;&#12290;CSP&#12398;&#35299;&#35500;&#12398;&#25163;&#38918;&#12391;&#12289;&#21029;&#12395;&#36914;&#12417;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;Apache(.htaccess)&#12398;&#20363;&#12391;&#12377;&#12290;&#38;lt;br/&#38;gt; &#38;lt;code&#38;gt;&#38;amp;lt;IfModule mod_headers.c&#38;amp;gt;    Header always set Strict-Transport-Security &#38;quot;max-age=31536000&#38;quot; env=HTTPS    Header always set X-Content-Type-Options &#38;quot;nosniff&#38;quot;    Header always set X-Frame-Options &#38;quot;SAMEORIGIN&#38;quot;    Header always set Referrer-Policy &#38;quot;strict-origin-when-cross-origin&#38;quot;    Header always set Permissions-Policy &#38;quot;camera=(), microphone=(), geolocation=()&#38;quot;&#38;amp;lt;/IfModule&#38;amp;gt;&#38;lt;/code&#38;gt; nginx&#12398;&#20363;&#12391;&#12377;&#12290;&#38;lt;br/&#38;gt; &#38;lt;code&#38;gt;add_header Strict-Transport-Security &#38;quot;max-age=31536000&#38;quot; always;add_header X-Content-Type-Options &#38;quot;nosniff&#38;quot; always;add_header X-Frame-Options &#38;quot;SAMEORIGIN&#38;quot; always;add_header Referrer-Policy &#38;quot;strict-origin-when-cross-origin&#38;quot; always;add_header Permissions-Policy &#38;quot;camera=(), microphone=(), geolocation=()&#38;quot; always;&#38;lt;/code&#38;gt; WordPress(&#23376;&#12486;&#12540;&#12510;&#12398;functions.php)&#12398;&#20363;&#12391;&#12377;&#12290;&#38;lt;br/&#38;gt; &#38;lt;code&#38;gt;add_action(&#38;#039;send_headers&#38;#039;, function () {    header(&#38;#039;X-Content-Type-Options: nosniff&#38;#039;);    header(&#38;#039;X-Frame-Options: SAMEORIGIN&#38;#039;);    header(&#38;#039;Referrer-Policy: strict-origin-when-cross-origin&#38;#039;);    header(&#38;#039;Permissions-Policy: camera=(), microphone=(), geolocation=()&#38;#039;);    if (is_ssl()) {        header(&#38;#039;Strict-Transport-Security: max-age=31536000&#38;#039;);    }});&#38;lt;/code&#38;gt; &#12424;&#12367;&#12354;&#12427;&#38291;&#36949;&#12356;&#12392;&#27880;&#24847;&#28857;nginx&#12391;&#12399;&#12289;&#38;lt;code&#38;gt;location&#38;lt;/code&#38;gt; &#12502;&#12525;&#12483;&#12463;&#12398;&#20013;&#12395;&#21029;&#12398; &#38;lt;code&#38;gt;add_header&#38;lt;/code&#38;gt; &#12364;1&#12388;&#12391;&#12418;&#12354;&#12427;&#12392;&#12289;&#19978;&#12398;&#38542;&#23652;&#12398; &#38;lt;code&#38;gt;add_header&#38;lt;/code&#38;gt; &#12399;&#24341;&#12365;&#32153;&#12364;&#12428;&#12414;&#12379;&#12435;&#12290;&#35373;&#23450;&#24460;&#12395;&#12289;&#20195;&#34920;&#30340;&#12394;URL&#12391;&#23455;&#38555;&#12398;&#24540;&#31572;&#12434;&#30906;&#12363;&#12417;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;&#38;lt;code&#38;gt;always&#38;lt;/code&#38;gt; &#12434;&#20184;&#12369;&#12394;&#12356;&#12392;&#12289;404&#12420;500&#12394;&#12393;&#12398;&#12456;&#12521;&#12540;&#24540;&#31572;&#12395;&#12399;&#12289;&#12504;&#12483;&#12480;&#12540;&#12364;&#20184;&#12365;&#12414;&#12379;&#12435;&#12290;&#38;lt;br/&#38;gt;WordPress&#12398;&#12461;&#12515;&#12483;&#12471;&#12517;&#12503;&#12521;&#12464;&#12452;&#12531;&#12364;&#12289;&#38745;&#30340;&#12394;HTML&#12434;PHP&#12434;&#36890;&#12373;&#12378;&#12395;&#36820;&#12375;&#12390;&#12356;&#12427;&#22580;&#21512;&#12289;PHP&#12391;&#20184;&#12369;&#12383;&#12504;&#12483;&#12480;&#12540;&#12399;&#20986;&#12414;&#12379;&#12435;&#12290;&#12469;&#12540;&#12496;&#12540;&#35373;&#23450;&#12391;&#20184;&#12369;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;&#12504;&#12483;&#12480;&#12540;&#12434;&#20184;&#12369;&#12390;&#12418;&#12289;&#33030;&#24369;&#24615;&#12399;&#28040;&#12360;&#12414;&#12379;&#12435;&#12290;&#26356;&#26032;&#12420;&#20837;&#21147;&#20516;&#12398;&#20966;&#29702;&#12398;&#20462;&#27491;&#12392;&#12289;&#32068;&#12415;&#21512;&#12431;&#12379;&#12390;&#34892;&#12356;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;&#38;lt;br/&#38;gt;Web&#12469;&#12452;&#12488; &#12475;&#12461;&#12517;&#12522;&#12486;&#12451;&#12481;&#12455;&#12483;&#12459;&#12540;&#12391;&#30906;&#35469;&#12377;&#12427;Web&#12469;&#12452;&#12488; &#12475;&#12461;&#12517;&#12522;&#12486;&#12451;&#12481;&#12455;&#12483;&#12459;&#12540;&#12399;&#12289;&#19978;&#12398;6&#12388;&#12398;&#12504;&#12483;&#12480;&#12540;&#12398;&#26377;&#28961;&#12392;&#12289;&#20516;&#12398;&#24369;&#12373;&#12289;&#12496;&#12540;&#12472;&#12519;&#12531;&#30058;&#21495;&#12434;&#34920;&#12395;&#20986;&#12375;&#12390;&#12356;&#12427;&#12504;&#12483;&#12480;&#12540;&#12289;CORS&#12398;&#35373;&#23450;&#12398;&#32233;&#12373;&#12434;&#35386;&#26029;&#12375;&#12414;&#12377;&#12290;URL&#12434;&#20837;&#12428;&#12427;&#12384;&#12369;&#12391;&#12289;&#12467;&#12510;&#12531;&#12489;&#12394;&#12375;&#12391;&#19968;&#35239;&#12391;&#12365;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;&#38306;&#36899;&#29992;&#35486;HSTS&#38;lt;br/&#38;gt;CSP&#38;lt;br/&#38;gt;X-Frame-Options&#38;lt;br/&#38;gt;X-Content-Type-Options&#38;lt;br/&#38;gt;Referrer-Policy&#38;lt;br/&#38;gt;Permissions-Policy&#38;lt;br/&#38;gt;&#38;lt;br/&#38;gt;&#12469;&#12452;&#12488;&#12398;&#35373;&#23450;&#12434;&#28961;&#26009;&#12391;&#30906;&#35469;&#12377;&#12427;&#12469;&#12452;&#12488;&#12398;URL&#12434;&#20837;&#21147;&#12377;&#12427;&#12384;&#12369;&#12391;&#12289;&#12475;&#12461;&#12517;&#12522;&#12486;&#12451;&#12504;&#12483;&#12480;&#12540; &#12394;&#12393;&#12398;&#35373;&#23450;&#29366;&#27841;&#12434;&#35386;&#26029;&#12391;&#12365;&#12414;&#12377;&#12290;Web&#12469;&#12452;&#12488; &#12475;&#12461;&#12517;&#12522;&#12486;&#12451;&#12481;&#12455;&#12483;&#12459;&#12540;&#12300;Security Checker X&#12301;&#12399;&#12289;&#30331;&#37682;&#12394;&#12375;&#12391;&#20351;&#12360;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;&#60;/div&#62;"  href="https://slt-inc.jp/glossary/security-headers/"  data-gt-translate-attributes='[{"attribute":"data-cmtooltip", "format":"html"}]'  tabindex='0' role='link'>&#12475;&#12461;&#12517;&#12522;&#12486;&#12451;&#12504;&#12483;&#12480;&#12540;</a>&#12398;&#35373;&#23450;&#26041;&#27861;&#12434;&#12289;Apache&#12289;nginx&#12289;WordPress&#12289;Cloudflare&#12398;&#35373;&#23450;&#20363;&#12388;&#12365;&#12391;&#35299;&#35500;&#12375;&#12414;&#12377;&#12290;always&#12398;&#20184;&#12369;&#24536;&#12428;&#12420;&#32153;&#25215;&#12391;&#12504;&#12483;&#12480;&#12540;&#12364;&#28040;&#12360;&#12427;&#33853;&#12392;&#12375;&#31348;&#12289;<a class="glossaryLink"  aria-describedby="tt"  data-cmtooltip="&#60;div class=glossaryItemBody&#62;HSTS&#12392;&#12399;HSTS(HTTP Strict Transport Security)&#12399;&#12289;&#12300;&#12371;&#12398;&#12469;&#12452;&#12488;&#12395;&#12399;&#12289;&#20170;&#24460;&#12399;&#24517;&#12378;HTTPS&#12391;&#25509;&#32154;&#12377;&#12427;&#12301;&#12392;&#12502;&#12521;&#12454;&#12470;&#12395;&#35226;&#12360;&#12373;&#12379;&#12427;&#20181;&#32068;&#12415;&#12391;&#12377;&#12290;&#12469;&#12540;&#12496;&#12540;&#12364;HTTPS&#12398;&#24540;&#31572;&#12395; &#38;lt;code&#38;gt;Strict-Transport-Security&#38;lt;/code&#38;gt; &#12504;&#12483;&#12480;&#12540;&#12434;&#20184;&#12369;&#12427;&#12392;&#26377;&#21177;&#12395;&#12394;&#12426;&#12414;&#12377;&#12290;&#20181;&#27096;&#12399;RFC 6797&#12391;&#12377;&#12290;&#38;lt;br/&#38;gt;HSTS&#12364;&#24517;&#35201;&#12394;&#29702;&#30001;&#12469;&#12452;&#12488;&#12434;HTTPS&#21270;&#12375;&#12390;&#12418;&#12289;&#21033;&#29992;&#32773;&#12364; &#38;lt;code&#38;gt;http://&#38;lt;/code&#38;gt; &#12391;&#12450;&#12489;&#12524;&#12473;&#12434;&#20837;&#21147;&#12375;&#12383;&#12426;&#12289;&#21476;&#12356;&#12522;&#12531;&#12463;&#12363;&#12425;&#35370;&#12428;&#12383;&#12426;&#12377;&#12427;&#12392;&#12289;&#26368;&#21021;&#12398;1&#22238;&#12399;HTTP&#12391;&#25509;&#32154;&#12375;&#12414;&#12377;&#12290;&#12371;&#12398;&#36890;&#20449;&#12399;&#26263;&#21495;&#21270;&#12373;&#12428;&#12390;&#12356;&#12414;&#12379;&#12435;&#12290;&#20844;&#34886;Wi-Fi&#12394;&#12393;&#12391;&#12399;&#12289;&#36890;&#20449;&#12398;&#36884;&#20013;&#12395;&#12356;&#12427;&#31532;&#19977;&#32773;&#12364;HTTPS&#12408;&#12398;&#20999;&#12426;&#26367;&#12360;&#12434;&#22952;&#12370;&#12289;&#20605;&#12398;&#12506;&#12540;&#12472;&#12434;&#35211;&#12379;&#12427;&#12371;&#12392;&#12364;&#12354;&#12426;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;HSTS&#12434;&#26377;&#21177;&#12395;&#12377;&#12427;&#12392;&#12289;&#12502;&#12521;&#12454;&#12470;&#12399;&#35352;&#25014;&#12375;&#12390;&#12356;&#12427;&#26399;&#38291;&#12289;HTTP&#12391;&#12398;&#25509;&#32154;&#12434;&#33258;&#20998;&#12391;HTTPS&#12395;&#35501;&#12415;&#26367;&#12360;&#12414;&#12377;&#12290;&#35388;&#26126;&#26360;&#12395;&#12456;&#12521;&#12540;&#12364;&#12354;&#12427;&#22580;&#21512;&#12418;&#12289;&#21033;&#29992;&#32773;&#12364;&#35686;&#21578;&#12434;&#28961;&#35222;&#12375;&#12390;&#20808;&#12408;&#36914;&#12416;&#12371;&#12392;&#12399;&#12391;&#12365;&#12394;&#12367;&#12394;&#12426;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;HSTS&#12398;&#20181;&#32068;&#12415;&#38;lt;ol&#38;gt;&#12502;&#12521;&#12454;&#12470;&#12364;HTTPS&#12391;&#12469;&#12452;&#12488;&#12395;&#25509;&#32154;&#12375;&#12289;&#24540;&#31572;&#12395;HSTS&#12504;&#12483;&#12480;&#12540;&#12364;&#21547;&#12414;&#12428;&#12427;&#12290;&#38;lt;br/&#38;gt;&#12502;&#12521;&#12454;&#12470;&#12364;&#12289;&#12381;&#12398;&#12489;&#12513;&#12452;&#12531;&#12392;&#26377;&#21177;&#26399;&#38291;(max-age)&#12434;&#35352;&#25014;&#12377;&#12427;&#12290;&#38;lt;br/&#38;gt;&#26399;&#38291;&#20869;&#12399;&#12289;HTTP&#12398;&#12450;&#12489;&#12524;&#12473;&#12434;&#20869;&#37096;&#12391;HTTPS&#12395;&#32622;&#12365;&#25563;&#12360;&#12390;&#12363;&#12425;&#25509;&#32154;&#12377;&#12427;&#12290;&#38;lt;br/&#38;gt;&#38;lt;/ol&#38;gt;&#38;lt;table&#38;gt;&#38;lt;thead&#38;gt;&#38;lt;tr&#38;gt;&#38;lt;th&#38;gt;&#25351;&#23450;&#38;lt;/th&#38;gt;&#38;lt;th&#38;gt;&#24847;&#21619;&#38;lt;/th&#38;gt;&#38;lt;/tr&#38;gt;&#38;lt;/thead&#38;gt;&#38;lt;tbody&#38;gt;&#38;lt;tr&#38;gt;&#38;lt;td&#38;gt;&#38;lt;code&#38;gt;max-age=31536000&#38;lt;/code&#38;gt;&#38;lt;/td&#38;gt;&#38;lt;td&#38;gt;&#35352;&#25014;&#12377;&#12427;&#31186;&#25968;&#12290;31536000&#31186;&#12399;1&#24180;&#38;lt;/td&#38;gt;&#38;lt;/tr&#38;gt;&#38;lt;tr&#38;gt;&#38;lt;td&#38;gt;&#38;lt;code&#38;gt;includeSubDomains&#38;lt;/code&#38;gt;&#38;lt;/td&#38;gt;&#38;lt;td&#38;gt;&#12469;&#12502;&#12489;&#12513;&#12452;&#12531;&#12395;&#12418;&#36969;&#29992;&#12377;&#12427;&#38;lt;/td&#38;gt;&#38;lt;/tr&#38;gt;&#38;lt;tr&#38;gt;&#38;lt;td&#38;gt;&#38;lt;code&#38;gt;preload&#38;lt;/code&#38;gt;&#38;lt;/td&#38;gt;&#38;lt;td&#38;gt;&#12502;&#12521;&#12454;&#12470;&#12395;&#32068;&#12415;&#36796;&#12414;&#12428;&#12427;HSTS&#12522;&#12473;&#12488;&#12408;&#12398;&#30331;&#37682;&#12434;&#24076;&#26395;&#12377;&#12427;(&#21029;&#36884;&#30003;&#35531;&#12364;&#24517;&#35201;)&#38;lt;/td&#38;gt;&#38;lt;/tr&#38;gt;&#38;lt;/tbody&#38;gt;&#38;lt;/table&#38;gt;HTTP&#12398;&#24540;&#31572;&#12395;&#20184;&#12356;&#12383;&#12504;&#12483;&#12480;&#12540;&#12399;&#28961;&#35222;&#12373;&#12428;&#12414;&#12377;&#12290;&#12414;&#12383;&#12289;&#35352;&#25014;&#12377;&#12427;&#21069;&#12398;&#21021;&#22238;&#35370;&#21839;&#12399;&#20445;&#35703;&#12373;&#12428;&#12414;&#12379;&#12435;&#12290;&#38;lt;br/&#38;gt;HSTS&#12398;&#30906;&#35469;&#26041;&#27861;&#12502;&#12521;&#12454;&#12470;&#12398;&#38283;&#30330;&#32773;&#12484;&#12540;&#12523;(F12)&#12391;&#12300;&#12493;&#12483;&#12488;&#12527;&#12540;&#12463;&#12301;&#12479;&#12502;&#12434;&#38283;&#12365;&#12289;&#12506;&#12540;&#12472;&#12434;&#20877;&#35501;&#12415;&#36796;&#12415;&#12375;&#12390;&#12289;&#26368;&#19978;&#27573;&#12398;HTML&#25991;&#26360;&#12398;&#12524;&#12473;&#12509;&#12531;&#12473;&#12504;&#12483;&#12480;&#12540;&#12395; &#38;lt;code&#38;gt;strict-transport-security&#38;lt;/code&#38;gt; &#12364;&#12354;&#12427;&#12363;&#12434;&#35211;&#12414;&#12377;&#12290;&#12467;&#12510;&#12531;&#12489;&#12391;&#12399;&#27425;&#12398;&#12392;&#12362;&#12426;&#12391;&#12377;&#12290;&#38;lt;br/&#38;gt; &#38;lt;code&#38;gt;curl -s -D - -o /dev/null https://example.com/ &#124; grep -i &#38;#039;^strict-transport-security&#38;#039;&#38;lt;/code&#38;gt; &#20309;&#12418;&#34920;&#31034;&#12373;&#12428;&#12394;&#12369;&#12428;&#12400;&#26410;&#35373;&#23450;&#12391;&#12377;&#12290;Windows&#12398;PowerShell&#12391;&#12399; &#38;lt;code&#38;gt;curl.exe -s -D - -o NUL https://example.com/ &#124; Select-String strict-transport-security&#38;lt;/code&#38;gt; &#12434;&#20351;&#12356;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;HSTS&#12398;&#35373;&#23450;&#20363;HTTPS&#12391;&#36820;&#12377;&#24540;&#31572;&#12395;&#12384;&#12369;&#20184;&#12369;&#12414;&#12377;&#12290;&#21021;&#12417;&#12390;&#26377;&#21177;&#12395;&#12377;&#12427;&#12392;&#12365;&#12399;&#12289;&#25968;&#20516;&#12434;300(5&#20998;)&#12394;&#12393;&#12398;&#30701;&#12356;&#20516;&#12395;&#12375;&#12390;&#22987;&#12417;&#12289;&#21839;&#38988;&#12364;&#12394;&#12369;&#12428;&#12400;&#27573;&#38542;&#30340;&#12395;&#24310;&#12400;&#12375;&#12414;&#12377;&#12290;hstspreload.org&#12399;&#12289;5&#20998;&#12289;1&#36913;&#38291;&#12289;1&#12363;&#26376;&#12392;&#24310;&#12400;&#12375;&#12289;&#26368;&#32066;&#30340;&#12395;1&#24180;(31536000&#31186;)&#20197;&#19978;&#12395;&#12377;&#12427;&#25163;&#38918;&#12434;&#31034;&#12375;&#12390;&#12356;&#12414;&#12377;&#12290;&#20197;&#19979;&#12399;&#26368;&#32066;&#30340;&#12394;&#20516;&#12398;&#20363;&#12391;&#12377;&#12290;&#38;lt;br/&#38;gt;Apache(.htaccess)&#12398;&#20363;&#12391;&#12377;&#12290;&#38;lt;br/&#38;gt; &#38;lt;code&#38;gt;&#38;amp;lt;IfModule mod_headers.c&#38;amp;gt;    Header always set Strict-Transport-Security &#38;quot;max-age=31536000&#38;quot; env=HTTPS&#38;amp;lt;/IfModule&#38;amp;gt;&#38;lt;/code&#38;gt; nginx(HTTPS&#12398;server&#12502;&#12525;&#12483;&#12463;)&#12398;&#20363;&#12391;&#12377;&#12290;&#38;lt;br/&#38;gt; &#38;lt;code&#38;gt;add_header Strict-Transport-Security &#38;quot;max-age=31536000&#38;quot; always;&#38;lt;/code&#38;gt; WordPress(&#23376;&#12486;&#12540;&#12510;&#12398;functions.php)&#12398;&#20363;&#12391;&#12377;&#12290;&#38;lt;br/&#38;gt; &#38;lt;code&#38;gt;add_action(&#38;#039;send_headers&#38;#039;, function () {    if (is_ssl()) {        header(&#38;#039;Strict-Transport-Security: max-age=31536000&#38;#039;);    }});&#38;lt;/code&#38;gt; &#12424;&#12367;&#12354;&#12427;&#38291;&#36949;&#12356;&#12392;&#27880;&#24847;&#28857;&#26368;&#21021;&#12363;&#12425;&#38263;&#12356;&#26399;&#38291;&#12434;&#25351;&#23450;&#12377;&#12427;&#12392;&#12289;&#35388;&#26126;&#26360;&#12398;&#26399;&#38480;&#20999;&#12428;&#12420;&#35373;&#23450;&#12511;&#12473;&#12364;&#36215;&#12365;&#12383;&#12392;&#12365;&#12289;&#12381;&#12398;&#26399;&#38291;&#12356;&#12387;&#12401;&#12356;&#12469;&#12452;&#12488;&#12434;&#38283;&#12369;&#12394;&#12356;&#21033;&#29992;&#32773;&#12364;&#20986;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;&#38;lt;code&#38;gt;includeSubDomains&#38;lt;/code&#38;gt; &#12399;&#12289;&#31038;&#20869;&#29992;&#12420;&#12486;&#12473;&#12488;&#29992;&#12434;&#21547;&#12416;&#12377;&#12409;&#12390;&#12398;&#12469;&#12502;&#12489;&#12513;&#12452;&#12531;&#12364;HTTPS&#12391;&#21205;&#12367;&#12392;&#30906;&#12363;&#12417;&#12390;&#12363;&#12425;&#20184;&#12369;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;&#38;lt;code&#38;gt;preload&#38;lt;/code&#38;gt; &#12399;&#12289;&#21462;&#12426;&#28040;&#12375;&#12395;&#12502;&#12521;&#12454;&#12470;&#12398;&#26356;&#26032;&#12434;&#24453;&#12388;&#12383;&#12417;&#12289;&#25968;&#12363;&#26376;&#12363;&#12363;&#12427;&#12371;&#12392;&#12364;&#12354;&#12426;&#12414;&#12377;&#12290;hstspreload.org&#12398;&#35201;&#20214;(max-age&#12364;1&#24180;&#20197;&#19978;&#12289;includeSubDomains&#12289;preload)&#12434;&#28288;&#12383;&#12375;&#12289;HTTPS&#12434;&#38263;&#12367;&#32173;&#25345;&#12391;&#12365;&#12427;&#22580;&#21512;&#12384;&#12369;&#30003;&#35531;&#12375;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;HTTP&#12363;&#12425;HTTPS&#12408;&#12398;301&#36578;&#36865;&#12399;&#21029;&#12395;&#24517;&#35201;&#12391;&#12377;&#12290;HSTS&#12384;&#12369;&#12391;&#12399;&#12289;&#21021;&#22238;&#12398;HTTP&#25509;&#32154;&#12399;&#38450;&#12370;&#12414;&#12379;&#12435;&#12290;&#38;lt;br/&#38;gt;CDN&#12420;&#12522;&#12496;&#12540;&#12473;&#12503;&#12525;&#12461;&#12471;&#12398;&#32972;&#24460;&#12391;&#12399;&#12289;&#12504;&#12483;&#12480;&#12540;&#12364;&#21033;&#29992;&#32773;&#12414;&#12391;&#23626;&#12356;&#12390;&#12356;&#12427;&#12363;&#12434;&#12289;&#20844;&#38283;URL&#12391;&#23455;&#38555;&#12395;&#30906;&#35469;&#12375;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;&#38;lt;br/&#38;gt;Web&#12469;&#12452;&#12488; &#12475;&#12461;&#12517;&#12522;&#12486;&#12451;&#12481;&#12455;&#12483;&#12459;&#12540;&#12391;&#30906;&#35469;&#12377;&#12427;Web&#12469;&#12452;&#12488; &#12475;&#12461;&#12517;&#12522;&#12486;&#12451;&#12481;&#12455;&#12483;&#12459;&#12540;&#12399;&#12289;URL&#12434;&#20837;&#21147;&#12377;&#12427;&#12392;&#12289;HSTS&#12504;&#12483;&#12480;&#12540;&#12398;&#26377;&#28961;&#12392;max-age&#12398;&#38263;&#12373;&#12289;HTTP&#12363;&#12425;HTTPS&#12408;&#12398;&#36578;&#36865;&#12398;&#29366;&#24907;&#12434;&#35386;&#26029;&#12375;&#12414;&#12377;&#12290;&#32080;&#26524;&#12395;&#12399;&#12289;&#21028;&#26029;&#12398;&#26681;&#25312;&#12392;&#12394;&#12387;&#12383;&#24540;&#31572;&#12398;&#20869;&#23481;&#12364;&#31034;&#12373;&#12428;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;&#38306;&#36899;&#29992;&#35486;SSL/TLS&#35388;&#26126;&#26360;&#38;lt;br/&#38;gt;TLS&#38;lt;br/&#38;gt;&#12475;&#12461;&#12517;&#12522;&#12486;&#12451;&#12504;&#12483;&#12480;&#12540;&#38;lt;br/&#38;gt;&#28151;&#22312;&#12467;&#12531;&#12486;&#12531;&#12484;&#38;lt;br/&#38;gt;&#38;lt;br/&#38;gt;&#12469;&#12452;&#12488;&#12398;&#35373;&#23450;&#12434;&#28961;&#26009;&#12391;&#30906;&#35469;&#12377;&#12427;&#12469;&#12452;&#12488;&#12398;URL&#12434;&#20837;&#21147;&#12377;&#12427;&#12384;&#12369;&#12391;&#12289;HSTS &#12394;&#12393;&#12398;&#35373;&#23450;&#29366;&#27841;&#12434;&#35386;&#26029;&#12391;&#12365;&#12414;&#12377;&#12290;Web&#12469;&#12452;&#12488; &#12475;&#12461;&#12517;&#12522;&#12486;&#12451;&#12481;&#12455;&#12483;&#12459;&#12540;&#12300;Security Checker X&#12301;&#12399;&#12289;&#30331;&#37682;&#12394;&#12375;&#12391;&#20351;&#12360;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;&#60;/div&#62;"  href="https://slt-inc.jp/glossary/hsts/"  data-gt-translate-attributes='[{"attribute":"data-cmtooltip", "format":"html"}]'  tabindex='0' role='link'>HSTS</a>&#12392;<a class="glossaryLink"  aria-describedby="tt"  data-cmtooltip="&#60;div class=glossaryItemBody&#62;CSP&#12392;&#12399;CSP(Content Security Policy&#12289;&#12467;&#12531;&#12486;&#12531;&#12484;&#12475;&#12461;&#12517;&#12522;&#12486;&#12451;&#12509;&#12522;&#12471;&#12540;)&#12399;&#12289;&#12506;&#12540;&#12472;&#12364;&#35501;&#12415;&#36796;&#12435;&#12391;&#12424;&#12356;&#12473;&#12463;&#12522;&#12503;&#12488;&#12289;&#30011;&#20687;&#12289;&#12473;&#12479;&#12452;&#12523;&#12471;&#12540;&#12488;&#12394;&#12393;&#12398;&#21462;&#24471;&#20803;&#12434;&#12289;&#12469;&#12540;&#12496;&#12540;&#12364;&#12502;&#12521;&#12454;&#12470;&#12395;&#25351;&#31034;&#12377;&#12427;&#20181;&#32068;&#12415;&#12391;&#12377;&#12290;&#38;lt;code&#38;gt;Content-Security-Policy&#38;lt;/code&#38;gt; &#12504;&#12483;&#12480;&#12540;&#12391;&#25351;&#23450;&#12375;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;CSP&#12364;&#24517;&#35201;&#12394;&#29702;&#30001;&#20837;&#21147;&#20516;&#12398;&#20966;&#29702;&#12395;&#19981;&#20633;&#12364;&#12354;&#12426;&#12289;&#25915;&#25731;&#32773;&#12398;&#12473;&#12463;&#12522;&#12503;&#12488;&#12364;&#12506;&#12540;&#12472;&#12395;&#28151;&#20837;&#12377;&#12427;&#12392;&#12289;XSS&#12364;&#25104;&#31435;&#12375;&#12414;&#12377;&#12290;CSP&#12391;&#35377;&#21487;&#12375;&#12383;&#21462;&#24471;&#20803;&#20197;&#22806;&#12398;&#12473;&#12463;&#12522;&#12503;&#12488;&#12434;&#27490;&#12417;&#12390;&#12362;&#12369;&#12400;&#12289;&#28151;&#20837;&#12375;&#12390;&#12418;&#23455;&#34892;&#12373;&#12428;&#12378;&#12289;&#22806;&#37096;&#12408;&#12398;&#36865;&#20449;&#20808;&#12418;&#32094;&#12428;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;CSP&#12399;&#12289;&#26681;&#26412;&#23550;&#31574;&#12398;&#20195;&#12431;&#12426;&#12395;&#12399;&#12394;&#12426;&#12414;&#12379;&#12435;&#12290;&#20986;&#21147;&#26178;&#12398;&#12456;&#12473;&#12465;&#12540;&#12503;&#12394;&#12393;&#12398;&#20462;&#27491;&#12434;&#34892;&#12387;&#12383;&#12358;&#12360;&#12391;&#12289;&#34987;&#23475;&#12434;&#23567;&#12373;&#12367;&#12377;&#12427;&#12383;&#12417;&#12398;&#20108;&#37325;&#12398;&#20633;&#12360;&#12392;&#12375;&#12390;&#20351;&#12356;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;CSP&#12398;&#20181;&#32068;&#12415;&#12504;&#12483;&#12480;&#12540;&#12398;&#20516;&#12399;&#12289;&#12300;&#12487;&#12451;&#12524;&#12463;&#12486;&#12451;&#12502;(&#21046;&#24481;&#12377;&#12427;&#23550;&#35937;)&#12392;&#35377;&#21487;&#12377;&#12427;&#21462;&#24471;&#20803;&#12301;&#12434;&#12289;&#12475;&#12511;&#12467;&#12525;&#12531;&#12391;&#21306;&#20999;&#12387;&#12390;&#20006;&#12409;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;&#38;lt;table&#38;gt;&#38;lt;thead&#38;gt;&#38;lt;tr&#38;gt;&#38;lt;th&#38;gt;&#12487;&#12451;&#12524;&#12463;&#12486;&#12451;&#12502;&#38;lt;/th&#38;gt;&#38;lt;th&#38;gt;&#21046;&#24481;&#12377;&#12427;&#23550;&#35937;&#38;lt;/th&#38;gt;&#38;lt;/tr&#38;gt;&#38;lt;/thead&#38;gt;&#38;lt;tbody&#38;gt;&#38;lt;tr&#38;gt;&#38;lt;td&#38;gt;&#38;lt;code&#38;gt;default-src&#38;lt;/code&#38;gt;&#38;lt;/td&#38;gt;&#38;lt;td&#38;gt;&#20491;&#21029;&#12398;&#25351;&#23450;&#12364;&#12394;&#12356;&#35501;&#12415;&#36796;&#12415;&#20840;&#33324;&#12398;&#26082;&#23450;&#20516;&#38;lt;/td&#38;gt;&#38;lt;/tr&#38;gt;&#38;lt;tr&#38;gt;&#38;lt;td&#38;gt;&#38;lt;code&#38;gt;script-src&#38;lt;/code&#38;gt;&#38;lt;/td&#38;gt;&#38;lt;td&#38;gt;JavaScript&#38;lt;/td&#38;gt;&#38;lt;/tr&#38;gt;&#38;lt;tr&#38;gt;&#38;lt;td&#38;gt;&#38;lt;code&#38;gt;style-src&#38;lt;/code&#38;gt;&#38;lt;/td&#38;gt;&#38;lt;td&#38;gt;CSS&#38;lt;/td&#38;gt;&#38;lt;/tr&#38;gt;&#38;lt;tr&#38;gt;&#38;lt;td&#38;gt;&#38;lt;code&#38;gt;img-src&#38;lt;/code&#38;gt;&#38;lt;/td&#38;gt;&#38;lt;td&#38;gt;&#30011;&#20687;&#38;lt;/td&#38;gt;&#38;lt;/tr&#38;gt;&#38;lt;tr&#38;gt;&#38;lt;td&#38;gt;&#38;lt;code&#38;gt;connect-src&#38;lt;/code&#38;gt;&#38;lt;/td&#38;gt;&#38;lt;td&#38;gt;fetch&#12420;XMLHttpRequest&#12398;&#36890;&#20449;&#20808;&#38;lt;/td&#38;gt;&#38;lt;/tr&#38;gt;&#38;lt;tr&#38;gt;&#38;lt;td&#38;gt;&#38;lt;code&#38;gt;object-src&#38;lt;/code&#38;gt;&#12289;&#38;lt;code&#38;gt;base-uri&#38;lt;/code&#38;gt;&#38;lt;/td&#38;gt;&#38;lt;td&#38;gt;&#12503;&#12521;&#12464;&#12452;&#12531;&#12398;&#22475;&#12417;&#36796;&#12415;&#12289;base&#12479;&#12464;&#12395;&#12424;&#12427;&#22522;&#28310;URL&#12398;&#26360;&#12365;&#25563;&#12360;&#38;lt;/td&#38;gt;&#38;lt;/tr&#38;gt;&#38;lt;tr&#38;gt;&#38;lt;td&#38;gt;&#38;lt;code&#38;gt;frame-ancestors&#38;lt;/code&#38;gt;&#38;lt;/td&#38;gt;&#38;lt;td&#38;gt;&#12371;&#12398;&#12506;&#12540;&#12472;&#12434;iframe&#12391;&#22475;&#12417;&#36796;&#12417;&#12427;&#20803;(&#12463;&#12522;&#12483;&#12463;&#12472;&#12515;&#12483;&#12461;&#12531;&#12464;&#23550;&#31574;)&#38;lt;/td&#38;gt;&#38;lt;/tr&#38;gt;&#38;lt;/tbody&#38;gt;&#38;lt;/table&#38;gt;&#21462;&#24471;&#20803;&#12395;&#12399;&#12289;&#38;lt;code&#38;gt;&#38;#039;self&#38;#039;&#38;lt;/code&#38;gt;(&#33258;&#12469;&#12452;&#12488;)&#12289;&#38;lt;code&#38;gt;&#38;#039;none&#38;#039;&#38;lt;/code&#38;gt;(&#12377;&#12409;&#12390;&#31105;&#27490;)&#12289;&#38;lt;code&#38;gt;https://cdn.example.com&#38;lt;/code&#38;gt; &#12398;&#12424;&#12358;&#12394;&#12507;&#12473;&#12488;&#21517;&#12434;&#26360;&#12365;&#12414;&#12377;&#12290;&#12452;&#12531;&#12521;&#12452;&#12531;&#12398;&#12473;&#12463;&#12522;&#12503;&#12488;&#12434;&#20491;&#21029;&#12395;&#35377;&#21487;&#12377;&#12427; &#38;lt;code&#38;gt;&#38;#039;nonce-...&#38;#039;&#38;lt;/code&#38;gt; &#12420; &#38;lt;code&#38;gt;&#38;#039;sha256-...&#38;#039;&#38;lt;/code&#38;gt; &#12418;&#20351;&#12360;&#12414;&#12377;&#12290;&#38;lt;code&#38;gt;frame-ancestors&#38;lt;/code&#38;gt;&#12289;&#38;lt;code&#38;gt;base-uri&#38;lt;/code&#38;gt;&#12289;&#38;lt;code&#38;gt;form-action&#38;lt;/code&#38;gt; &#12399; &#38;lt;code&#38;gt;default-src&#38;lt;/code&#38;gt; &#12391;&#12399;&#20195;&#29992;&#12373;&#12428;&#12394;&#12356;&#12383;&#12417;&#12289;&#20491;&#21029;&#12395;&#26360;&#12365;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;CSP&#12398;&#30906;&#35469;&#26041;&#27861;&#38283;&#30330;&#32773;&#12484;&#12540;&#12523;&#12398;&#12300;&#12493;&#12483;&#12488;&#12527;&#12540;&#12463;&#12301;&#12479;&#12502;&#12391;&#12524;&#12473;&#12509;&#12531;&#12473;&#12504;&#12483;&#12480;&#12540;&#12434;&#35211;&#12427;&#12363;&#12289;&#27425;&#12398;&#12467;&#12510;&#12531;&#12489;&#12434;&#23455;&#34892;&#12375;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt; &#38;lt;code&#38;gt;curl -s -D - -o /dev/null https://example.com/ &#124; grep -i &#38;#039;^content-security-policy&#38;#039;&#38;lt;/code&#38;gt; &#12509;&#12522;&#12471;&#12540;&#12395;&#21453;&#12375;&#12383;&#35501;&#12415;&#36796;&#12415;&#12399;&#12289;&#38283;&#30330;&#32773;&#12484;&#12540;&#12523;&#12398;&#12300;&#12467;&#12531;&#12477;&#12540;&#12523;&#12301;&#12395;&#12300;Refused to load ...&#12301;&#12394;&#12393;&#12398;&#24418;&#12391;&#35352;&#37682;&#12373;&#12428;&#12414;&#12377;&#12290;&#38;lt;code&#38;gt;Content-Security-Policy-Report-Only&#38;lt;/code&#38;gt; &#12384;&#12369;&#12364;&#20986;&#12427;&#22580;&#21512;&#12399;&#12289;&#12414;&#12384;&#24375;&#21046;&#12373;&#12428;&#12390;&#12356;&#12414;&#12379;&#12435;&#12290;&#38;lt;br/&#38;gt;CSP&#12398;&#35373;&#23450;&#20363;&#12356;&#12365;&#12394;&#12426;&#24375;&#21046;&#12377;&#12427;&#12392;&#12289;&#12469;&#12452;&#12488;&#12398;&#34920;&#31034;&#12420;&#27231;&#33021;&#12364;&#22730;&#12428;&#12427;&#12371;&#12392;&#12364;&#12354;&#12426;&#12414;&#12377;&#12290;&#12414;&#12378; &#38;lt;code&#38;gt;Content-Security-Policy-Report-Only&#38;lt;/code&#38;gt; &#12391;&#36949;&#21453;&#12398;&#35352;&#37682;&#12384;&#12369;&#12434;&#34892;&#12356;&#12289;&#12467;&#12531;&#12477;&#12540;&#12523;&#12398;&#36949;&#21453;&#12364;&#12394;&#12367;&#12394;&#12387;&#12390;&#12363;&#12425;&#12289;&#24375;&#21046;&#12398; &#38;lt;code&#38;gt;Content-Security-Policy&#38;lt;/code&#38;gt; &#12395;&#20999;&#12426;&#26367;&#12360;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;Apache(.htaccess)&#12398;&#20363;&#12391;&#12377;&#12290;&#38;lt;br/&#38;gt; &#38;lt;code&#38;gt;Header always set Content-Security-Policy-Report-Only &#38;quot;default-src &#38;#039;self&#38;#039;; img-src &#38;#039;self&#38;#039; data: https:; object-src &#38;#039;none&#38;#039;; base-uri &#38;#039;self&#38;#039;&#38;quot;&#38;lt;/code&#38;gt; nginx&#12398;&#20363;&#12391;&#12377;&#12290;&#38;lt;br/&#38;gt; &#38;lt;code&#38;gt;add_header Content-Security-Policy-Report-Only &#38;quot;default-src &#38;#039;self&#38;#039;; img-src &#38;#039;self&#38;#039; data: https:; object-src &#38;#039;none&#38;#039;; base-uri &#38;#039;self&#38;#039;&#38;quot; always;&#38;lt;/code&#38;gt; WordPress(&#23376;&#12486;&#12540;&#12510;&#12398;functions.php)&#12398;&#20363;&#12391;&#12377;&#12290;&#38;lt;br/&#38;gt; &#38;lt;code&#38;gt;add_action(&#38;#039;send_headers&#38;#039;, function () {    header(&#38;quot;Content-Security-Policy-Report-Only: default-src &#38;#039;self&#38;#039;; img-src &#38;#039;self&#38;#039; data: https:; object-src &#38;#039;none&#38;#039;; base-uri &#38;#039;self&#38;#039;&#38;quot;);});&#38;lt;/code&#38;gt; &#23455;&#38555;&#12398;&#12469;&#12452;&#12488;&#12391;&#12399;&#12289;&#35299;&#26512;&#12479;&#12464;&#12420;&#22475;&#12417;&#36796;&#12415;&#22320;&#22259;&#12394;&#12393;&#12398;&#22806;&#37096;&#12469;&#12540;&#12499;&#12473;&#12364;&#36949;&#21453;&#12392;&#12375;&#12390;&#35352;&#37682;&#12373;&#12428;&#12414;&#12377;&#12290;&#24517;&#35201;&#12394;&#12418;&#12398;&#12384;&#12369;&#12434;&#21462;&#24471;&#20803;&#12395;&#21152;&#12360;&#12390;&#12356;&#12365;&#12414;&#12377;&#12290;&#36949;&#21453;&#12398;&#22577;&#21578;&#12434;&#38598;&#12417;&#12383;&#12356;&#22580;&#21512;&#12399;&#12289;&#38;lt;code&#38;gt;report-to&#38;lt;/code&#38;gt; &#12420; &#38;lt;code&#38;gt;report-uri&#38;lt;/code&#38;gt; &#12391;&#36865;&#20449;&#20808;&#12434;&#25351;&#23450;&#12375;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;&#12424;&#12367;&#12354;&#12427;&#38291;&#36949;&#12356;&#12392;&#27880;&#24847;&#28857;&#38;lt;code&#38;gt;script-src&#38;lt;/code&#38;gt; &#12395; &#38;lt;code&#38;gt;&#38;#039;unsafe-inline&#38;#039;&#38;lt;/code&#38;gt; &#12420; &#38;lt;code&#38;gt;*&#38;lt;/code&#38;gt;&#12289;&#38;lt;code&#38;gt;https:&#38;lt;/code&#38;gt; &#12434;&#20837;&#12428;&#12427;&#12392;&#12289;XSS&#12434;&#27490;&#12417;&#12427;&#21177;&#26524;&#12364;&#12411;&#12392;&#12435;&#12393;&#22833;&#12431;&#12428;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;&#35377;&#21487;&#12377;&#12427;&#21462;&#24471;&#20803;&#12434;&#20006;&#12409;&#12427;&#26041;&#24335;&#12399;&#12289;&#35373;&#35336;&#12392;&#32173;&#25345;&#12364;&#38627;&#12375;&#12367;&#12394;&#12426;&#12364;&#12385;&#12391;&#12377;&#12290;MDN&#12399;&#12289;nonce&#12420;&#12495;&#12483;&#12471;&#12517;&#12434;&#20351;&#12358;&#26041;&#24335;&#12434;&#21223;&#12417;&#12390;&#12356;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;&#38;lt;code&#38;gt;&#38;amp;lt;meta http-equiv=&#38;quot;Content-Security-Policy&#38;quot;&#38;amp;gt;&#38;lt;/code&#38;gt; &#12391;&#12399;&#12289;&#38;lt;code&#38;gt;frame-ancestors&#38;lt;/code&#38;gt; &#12420; &#38;lt;code&#38;gt;report-uri&#38;lt;/code&#38;gt; &#12364;&#21177;&#12363;&#12378;&#12289;Report-Only&#12418;&#20351;&#12360;&#12414;&#12379;&#12435;&#12290;HTTP&#12504;&#12483;&#12480;&#12540;&#12391;&#25351;&#23450;&#12375;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;Report-Only&#12398;&#20013;&#12398; &#38;lt;code&#38;gt;frame-ancestors&#38;lt;/code&#38;gt; &#12399;&#28961;&#35222;&#12373;&#12428;&#12414;&#12377;&#12290;&#12463;&#12522;&#12483;&#12463;&#12472;&#12515;&#12483;&#12461;&#12531;&#12464;&#23550;&#31574;&#12384;&#12369;&#12434;&#20808;&#12395;&#34892;&#12358;&#12394;&#12425;&#12289;&#24375;&#21046;&#12398; &#38;lt;code&#38;gt;Content-Security-Policy: frame-ancestors &#38;#039;self&#38;#039;&#38;lt;/code&#38;gt; &#12398;1&#34892;&#12363;&#12425;&#22987;&#12417;&#12425;&#12428;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;WordPress&#12398;&#31649;&#29702;&#30011;&#38754;&#12399;&#12452;&#12531;&#12521;&#12452;&#12531;&#12473;&#12463;&#12522;&#12503;&#12488;&#12434;&#22810;&#12367;&#20351;&#12356;&#12414;&#12377;&#12290;&#31649;&#29702;&#30011;&#38754;&#12395;&#12414;&#12391;&#24375;&#21046;&#12377;&#12427;&#21069;&#12395;&#12289;&#21205;&#20316;&#12434;&#30906;&#12363;&#12417;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;&#38;lt;br/&#38;gt;Web&#12469;&#12452;&#12488; &#12475;&#12461;&#12517;&#12522;&#12486;&#12451;&#12481;&#12455;&#12483;&#12459;&#12540;&#12391;&#30906;&#35469;&#12377;&#12427;Web&#12469;&#12452;&#12488; &#12475;&#12461;&#12517;&#12522;&#12486;&#12451;&#12481;&#12455;&#12483;&#12459;&#12540;&#12399;&#12289;Content-Security-Policy&#12398;&#26377;&#28961;&#12392;&#12289;&#38;lt;code&#38;gt;script-src&#38;lt;/code&#38;gt; &#12395; &#38;lt;code&#38;gt;&#38;#039;unsafe-inline&#38;#039;&#38;lt;/code&#38;gt; &#12394;&#12393;&#12398;&#24369;&#12356;&#25351;&#23450;&#12364;&#27531;&#12387;&#12390;&#12356;&#12394;&#12356;&#12363;&#12434;&#35386;&#26029;&#12375;&#12414;&#12377;&#12290;Report-Only&#12384;&#12369;&#12391;&#24375;&#21046;&#12373;&#12428;&#12390;&#12356;&#12394;&#12356;&#29366;&#24907;&#12418;&#12289;&#21306;&#21029;&#12375;&#12390;&#31034;&#12375;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;&#38306;&#36899;&#29992;&#35486;XSS(&#12463;&#12525;&#12473;&#12469;&#12452;&#12488;&#12473;&#12463;&#12522;&#12503;&#12486;&#12451;&#12531;&#12464;)&#38;lt;br/&#38;gt;&#12463;&#12522;&#12483;&#12463;&#12472;&#12515;&#12483;&#12461;&#12531;&#12464;&#38;lt;br/&#38;gt;&#12475;&#12461;&#12517;&#12522;&#12486;&#12451;&#12504;&#12483;&#12480;&#12540;&#38;lt;br/&#38;gt;SRI(&#12469;&#12502;&#12522;&#12477;&#12540;&#12473;&#23436;&#20840;&#24615;)&#38;lt;br/&#38;gt;&#38;lt;br/&#38;gt;&#12469;&#12452;&#12488;&#12398;&#35373;&#23450;&#12434;&#28961;&#26009;&#12391;&#30906;&#35469;&#12377;&#12427;&#12469;&#12452;&#12488;&#12398;URL&#12434;&#20837;&#21147;&#12377;&#12427;&#12384;&#12369;&#12391;&#12289;CSP &#12394;&#12393;&#12398;&#35373;&#23450;&#29366;&#27841;&#12434;&#35386;&#26029;&#12391;&#12365;&#12414;&#12377;&#12290;Web&#12469;&#12452;&#12488; &#12475;&#12461;&#12517;&#12522;&#12486;&#12451;&#12481;&#12455;&#12483;&#12459;&#12540;&#12300;Security Checker X&#12301;&#12399;&#12289;&#30331;&#37682;&#12394;&#12375;&#12391;&#20351;&#12360;&#12414;&#12377;&#12290;&#38;lt;br/&#38;gt;&#60;/div&#62;"  href="https://slt-inc.jp/glossary/csp/"  data-gt-translate-attributes='[{"attribute":"data-cmtooltip", "format":"html"}]'  tabindex='0' role='link'>CSP</a>&#12398;&#27573;&#38542;&#23566;&#20837;&#12289;&#37325;&#35079;&#26178;&#12398;&#25201;&#12356;&#12289;&#30906;&#35469;&#12392;&#25147;&#12375;&#26041;&#12414;&#12391;&#12414;&#12392;&#12417;&#12390;&#12356;&#12414;&#12377;&#12290;</p>
<p>The post <a href="https://slt-inc.jp/article/security-headers-setup/">セキュリティヘッダーの設定方法｜HSTS・CSPの設定例つき</a> first appeared on <a href="https://slt-inc.jp">総合デジタルマーケティング企業 エスライン・テクノロジーズ</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="slt-art">
<div class="slt-meta">最終確認日: 2026年10月12日 / 編集: エスライン・テクノロジーズ株式会社 Webサイトセキュリティ編集チーム</div>
<div class="slt-lead"><p class="slt-lead-label">この記事の結論</p><p>セキュリティヘッダーは、1つのヘッダーを1か所（原則はWebサーバー）だけで付けるのが基本です。X-Content-Type-Options、Referrer-Policy、X-Frame-Options、Permissions-Policyの4つは、確認後すぐに入れられます。HSTSはmax-age=300から段階的に延ばし、CSPはReport-Onlyで違反を集めてから強制に切り替えます。設定後は curl -I で、トップページ、存在しないURL、リダイレクトの応答に、各ヘッダーが1本ずつ付いているかを確かめてください。</p></div>

<h2>セキュリティヘッダーは影響の小さい順に4段階で入れる</h2>
<p>最初に入れるのは、表示が壊れにくいX-Content-Type-OptionsとReferrer-Policyです。次にX-Frame-OptionsとPermissions-Policy、3段階目にHSTS、最後にCSPを入れます。段階を分けておくと、表示や機能が壊れたときに原因のヘッダーを1つに絞り込めます。</p>
<div class="slt-table-wrap"><table class="slt-table"><thead><tr><th>段階</th><th>ヘッダー</th><th>推奨値</th><th>入れる前に確かめること</th></tr></thead><tbody>
<tr><td>1</td><td>X-Content-Type-Options</td><td><code>nosniff</code></td><td>JavaScriptとCSSが正しいContent-Typeで返っているか</td></tr>
<tr><td>1</td><td>Referrer-Policy</td><td><code>strict-origin-when-cross-origin</code></td><td>外部サービスにURLのパスまで渡す連携がないか</td></tr>
<tr><td>2</td><td>X-Frame-Options</td><td><code>SAMEORIGIN</code></td><td>他サイトの枠（iframe）に自サイトを表示させていないか</td></tr>
<tr><td>2</td><td>Permissions-Policy</td><td><code>camera=(), microphone=(), geolocation=()</code></td><td>カメラ、マイク、位置情報を使う画面がないか</td></tr>
<tr><td>3</td><td>Strict-Transport-Security</td><td><code>max-age=300</code>から延ばし、最終は1年以上</td><td>全ページとサブドメインがHTTPSか、証明書の更新が自動か</td></tr>
<tr><td>4</td><td>Content-Security-Policy</td><td>Report-Onlyから始め、値はサイトごとに設計</td><td>外部のタグ、埋め込み、インラインスクリプトの一覧</td></tr>
</tbody></table></div>
<p><a href="https://slt-inc.jp/glossary/security-headers/">セキュリティヘッダー</a>の推奨値は、OWASPの<a href="https://cheatsheetseries.owasp.org/cheatsheets/HTTP_Headers_Cheat_Sheet.html">HTTP Headers Cheat Sheet</a>を基準にし、X-Frame-Optionsだけは自サイト内の枠表示を残せる <code>SAMEORIGIN</code> にしています（OWASPは <code>DENY</code>）。段階1と同時に、ServerヘッダーとX-Powered-Byに出る版の表記も消します。</p>
<div class="slt-callout is-point"><p class="slt-callout-title">ポイント</p><p>各段階の後で、問い合わせフォーム、決済、地図、動画、アクセス解析など、外部と連携する画面を動かしてから次へ進みます。</p></div>

<h2>ヘッダーはどこで付き、ブラウザはどう使うか</h2>
<p>セキュリティヘッダーは、アプリ（WordPressなど）、Webサーバー、CDNのどこでも付けられ、ブラウザは手元に届いた応答のヘッダーに従って動作を変えます。ブラウザからは、どこで付いたヘッダーかを区別できません。1つのヘッダーを付ける場所を1か所に決めることが、重複と付け漏れを防ぐ近道です。</p>
<figure class="slt-figure"><svg role="img" viewBox="0 0 800 400"><title>ヘッダーが付く場所とブラウザでの使われ方</title><desc>左の列に、アプリ、Webサーバー、CDNの3つの箱が上から順に並び、応答はこの順に通ってヘッダーが足される。右のブラウザは、届いたヘッダーに従ってHTTPSへの固定、読み込みの制限、他サイトの枠の拒否、使わない機能の停止を行う。下の赤枠は、同じヘッダーを2か所で付けるとブラウザに2本届くことを示す。</desc><defs><marker id="f1-arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto"><path d="M0,0 L10,5 L0,10 z" fill="#10265A"/></marker></defs><rect x="0" y="0" width="800" height="400" fill="#FFFFFF"/><rect x="20" y="20" width="330" height="80" rx="10" fill="#EEF2F9" stroke="#10265A" stroke-width="3"/><text x="185" y="54" text-anchor="middle" font-size="24" font-weight="bold" fill="#10265A">アプリ（PHPなど）</text><text x="185" y="88" text-anchor="middle" font-size="22" fill="#10265A">ページごとに付ける</text><line x1="185" y1="100" x2="185" y2="126" stroke="#10265A" stroke-width="3" marker-end="url(#f1-arrow)"/><rect x="20" y="130" width="330" height="80" rx="10" fill="#EEF2F9" stroke="#10265A" stroke-width="3"/><text x="185" y="164" text-anchor="middle" font-size="24" font-weight="bold" fill="#10265A">Webサーバー</text><text x="185" y="198" text-anchor="middle" font-size="22" fill="#10265A">Apache、nginxで付ける</text><line x1="185" y1="210" x2="185" y2="236" stroke="#10265A" stroke-width="3" marker-end="url(#f1-arrow)"/><rect x="20" y="240" width="330" height="80" rx="10" fill="#EEF2F9" stroke="#10265A" stroke-width="3"/><text x="185" y="274" text-anchor="middle" font-size="24" font-weight="bold" fill="#10265A">CDN</text><text x="185" y="308" text-anchor="middle" font-size="22" fill="#10265A">Cloudflareなどで上書き</text><line x1="350" y1="280" x2="464" y2="280" stroke="#10265A" stroke-width="4" marker-end="url(#f1-arrow)"/><text x="406" y="266" text-anchor="middle" font-size="22" fill="#10265A">応答</text><rect x="470" y="40" width="310" height="280" rx="10" fill="#FFFFFF" stroke="#10265A" stroke-width="3"/><text x="625" y="82" text-anchor="middle" font-size="24" font-weight="bold" fill="#10265A">ブラウザ</text><line x1="500" y1="100" x2="750" y2="100" stroke="#4A5C82" stroke-width="3"/><text x="500" y="144" font-size="22" fill="#10265A">HTTPSに固定する</text><text x="500" y="188" font-size="22" fill="#10265A">読み込みを制限する</text><text x="500" y="232" font-size="22" fill="#10265A">他サイトの枠を拒否</text><text x="500" y="276" font-size="22" fill="#10265A">使わない機能を止める</text><rect x="20" y="338" width="760" height="52" rx="10" fill="#FFFFFF" stroke="#D00A0A" stroke-width="3"/><text x="400" y="372" text-anchor="middle" font-size="22" fill="#10265A">同じヘッダーを2か所で付けると、ブラウザに2本届く</text></svg><figcaption>図1 ヘッダーは、アプリ、Webサーバー、CDNの順に応答へ足されます。ブラウザは、HSTSならHTTPSへの固定、CSPなら読み込みの制限、X-Frame-Optionsなら枠の拒否、Permissions-Policyなら機能の停止を行います。同じヘッダーを2か所で付けると、2本届きます。</figcaption></figure>
<div class="slt-table-wrap"><table class="slt-table"><thead><tr><th>付ける場所</th><th>ヘッダーが付く応答</th><th>向いている場面</th><th>注意点</th></tr></thead><tbody>
<tr><td>Webサーバー（Apache、nginx）</td><td>静的ファイル、エラー、リダイレクトを含む全応答（alwaysを付けた場合）</td><td>基本の置き場所</td><td>アプリが同じヘッダーを出すと2本並ぶ</td></tr>
<tr><td>CDN（Cloudflareなど）</td><td>CDNを通る全応答</td><td>サーバーの設定を変えられないとき</td><td>「追加」の操作は既存の同名ヘッダーを残す</td></tr>
<tr><td>アプリ（WordPressなど）</td><td>アプリが生成したページだけ</td><td>応答ごとに値が変わるCSPのnonce</td><td>画像、CSS、サーバー側のリダイレクトには付かない</td></tr>
</tbody></table></div>
<div class="slt-callout is-point"><p class="slt-callout-title">ポイント</p><p>原則はWebサーバーで付け、CSPのnonceのように応答ごとに値を作るものだけをアプリで付けます。CDNは、サーバーの設定を変えられないときの代わりです。どのヘッダーをどこで付けたかは、一覧にして残します。</p></div>

<h2>各ヘッダーの設定値と推奨値</h2>
<p>段階1と2の4つは推奨値がほぼ決まっており、自サイトの使い方と突き合わせれば決められます。HSTSとCSPは、後の節の手順で扱います。</p>

<h3>X-Content-Type-Options: nosniff</h3>
<p><a href="https://slt-inc.jp/glossary/x-content-type-options/">X-Content-Type-Options</a>の値は <code>nosniff</code> だけで、Content-TypeがJavaScriptの種類でないスクリプトと、text/cssでないスタイルシートを読み込ませなくします。Chrome 146の場合、text/plainで返したJavaScriptは、nosniffが無いと実行され、付けると止まります。</p>
<p>入れる前に <code>curl -sI https://example.com/main.js</code> で、主なJavaScriptのContent-Typeを調べます。<code>text/javascript</code> などなら合格で、<code>text/plain</code> などならサーバーのMIMEタイプの設定を先に直します。</p>

<h3>Referrer-Policy: strict-origin-when-cross-origin</h3>
<p><a href="https://slt-inc.jp/glossary/referrer-policy/">Referrer-Policy</a>は、リンク先や外部の読み込み先へ、元のページのURLをどこまで伝えるかを決めます。推奨値は、同じオリジンにはURL全体を、別のオリジンには <code>https://example.com/</code> のようなオリジンだけを伝え、HTTPSからHTTPへは何も送りません。指定が無いときの既定値でもありますが、OWASPは明示するよう勧めています。</p>
<p>URLに会員番号などを含むサイトでは、<code>no-referrer</code> や <code>same-origin</code> も選べます。ただし、Google Maps Platformの公式文書によると、この2つではRefererが送られず、Refererで制限したAPIキーが要求を拒否する場合があります。</p>

<h3>X-Frame-Options と frame-ancestors の関係</h3>
<p><a href="https://slt-inc.jp/glossary/x-frame-options/">X-Frame-Options</a>は、自サイトのページを他サイトの枠（iframe）の中に表示させない指示で、<a href="https://slt-inc.jp/glossary/clickjacking/">クリックジャッキング</a>を防ぎます。値は、すべての枠を拒否する <code>DENY</code> と、すべての親が同じオリジンのときだけ許す <code>SAMEORIGIN</code> の2つです。特定のサイトを許す <code>ALLOW-FROM</code> は廃止され、現在のブラウザはこの値を含むヘッダー全体を無視します。</p>
<p>特定のサイトにだけ埋め込みを許す方法は、CSPの <code>frame-ancestors 'self' https://partner.example.jp</code> のような指定です。CSPの仕様（<a href="https://www.w3.org/TR/CSP3/">W3C CSP Level 3</a>）は、強制モードのCSPに frame-ancestors があれば、X-Frame-Optionsを無視すると定めています。Chrome 146でも、<code>X-Frame-Options: DENY</code> より frame-ancestors の許可が優先されます。</p>
<p>新旧のブラウザに対応するため、2つは併記できます。WordPressは管理画面やカスタマイザーで自サイトを枠の中に表示し、本体も <code>SAMEORIGIN</code> を付けるため、サーバー側もSAMEORIGINにそろえます。</p>

<h3>Permissions-Policy</h3>
<p><a href="https://slt-inc.jp/glossary/permissions-policy/">Permissions-Policy</a>は、カメラ、マイク、位置情報などのブラウザ機能を、そのページと埋め込んだiframeで使えるかを決めます。値は機能ごとに、<code>()</code> で全面禁止、<code>(self)</code> で自サイトだけ、<code>(self "https://map.example.jp")</code> で指定のオリジンにも許可します。旧仕様のFeature-Policyの <code>camera 'none'</code> は、<code>camera=()</code> と書き換えます。</p>
<p>止めるのは、使っていない機能だけです。店舗検索で位置情報を使うなら <code>geolocation=(self)</code> にし、決済でPayment Request APIを使うなら <code>payment</code> は止めません。</p>

<h3>付けないヘッダーと、消すヘッダー</h3>
<p>X-XSS-Protectionは廃止されたヘッダーで、OWASPは付けないか、付けるなら <code>0</code> にするよう勧めています。古いブラウザのXSS検出機能が、安全なサイトにかえって<a href="https://slt-inc.jp/glossary/xss/">XSS</a>の弱点を生む場合があったためです。ChromiumがVersion 107で廃止したExpect-CTも、付ける必要はありません。</p>
<p>ServerとX-Powered-Byに出る版の表記は、Apacheならhttpd.confの <code>ServerTokens Prod</code>（.htaccessでは不可）で消します。nginxは <code>server_tokens off;</code>、PHPはphp.iniの <code>expose_php = Off</code> です。版を隠すだけでは安全にならないとApacheの公式文書も述べており、<a href="https://slt-inc.jp/article/wordpress-vulnerability-check/">WordPressの本体とプラグインの更新</a>のような更新作業を優先します。</p>

<h2>Apache、nginx、WordPress、Cloudflareの設定例</h2>
<p>段階1と2の4つのヘッダーに、HSTSの最初の値（max-age=300）を加えた設定例です。どの環境でも、404などのエラー応答とリダイレクトにもヘッダーが付く書き方を選ぶことが要点です。</p>

<h3>Apache（.htaccess、VirtualHost）</h3>
<pre class="slt-code"><code># .htaccess、またはHTTPSのVirtualHostに書く
&lt;IfModule mod_headers.c&gt;
  # アプリが同名のヘッダーを出しても1本になるよう、unsetとalways setを対にする
  Header unset X-Content-Type-Options
  Header always set X-Content-Type-Options "nosniff"
  Header unset Referrer-Policy
  Header always set Referrer-Policy "strict-origin-when-cross-origin"
  Header unset X-Frame-Options
  Header always set X-Frame-Options "SAMEORIGIN"
  Header unset Permissions-Policy
  Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
  Header unset Strict-Transport-Security
  Header always set Strict-Transport-Security "max-age=300"
  # PHPの版の表記を消す（PHPの動かし方で入る表が違うため2行とも書く）
  Header unset X-Powered-By
  Header always unset X-Powered-By
&lt;/IfModule&gt;</code></pre>
<p>Apacheの <code>Header</code> には、既定の「onsuccess」と「always」の2つの表があります。Apacheが自ら作る404やリダイレクト（RedirectやRewriteRuleの301）では、always の表しか使われず、always の無い指定は付きません（<a href="https://httpd.apache.org/docs/2.4/mod/mod_headers.html">mod_headersの公式文書</a>）。</p>
<p>PHPのヘッダーが入る表は動かし方で違い、mod_phpでは既定の表に、CGIやFastCGI（PHP-FPMなど）では always の表に入ります。<code>Header always set</code> だけではmod_phpでアプリの同名ヘッダーと2本並ぶため、例のように <code>Header unset</code> と対で書くと、どちらの方式でも1本になります。LiteSpeedなどApache互換のサーバーでは扱いが異なる場合があるため、設定後にcurlで本数を確かめます。</p>
<p>.htaccessの指定は、そのフォルダに届いた要求にだけ効き、VirtualHostやコントロールパネルで行うリダイレクトには付きません。HSTSは、変更できるならVirtualHostに書くのが確実です。mod_headersが無効な場合、<code>&lt;IfModule&gt;</code> で囲んだ指定は黙って無視され、囲まない指定は500エラーになります。</p>

<h3>nginx</h3>
<pre class="slt-code"><code># /etc/nginx/snippets/security-headers.conf（共通の指定を1か所にまとめる）
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
add_header Strict-Transport-Security "max-age=300" always;

# HTTPSのserverブロック（証明書などの設定は省略）
server {
    listen 443 ssl;
    server_name example.com;
    server_tokens off;
    include snippets/security-headers.conf;

    location /assets/ {
        add_header Cache-Control "public, max-age=2592000";
        # add_headerを書いた場所では上の指定が消えるため、読み込み直す
        include snippets/security-headers.conf;
    }
}</code></pre>
<p>nginxの <code>add_header</code> は、<code>always</code> が無いと200や301などの決まった応答にしか付かず、404や500には付きません（<a href="https://nginx.org/en/docs/http/ngx_http_headers_module.html">nginxの公式文書</a>）。また、下の階層に <code>add_header</code> が1つでもあると、上の階層の <code>add_header</code> はすべて引き継がれません。例の <code>/assets/</code> のように、キャッシュ用のヘッダーを足したlocationでセキュリティヘッダーが消えるのは、このためです。</p>
<p>対策は、共通のファイルを各locationで読み込み直すか、nginx 1.29.3以降（安定版は1.30.0以降）の <code>add_header_inherit merge;</code> をserverブロックに書く方法です。OSの標準パッケージは版が古いことがあるため、<code>nginx -v</code> で確かめてから選びます。アプリが出した同名のヘッダーは置き換わらずに残るので、PHP-FPMなら <code>fastcgi_hide_header X-Frame-Options;</code> のように隠します（リバースプロキシは <code>proxy_hide_header</code>）。</p>

<h3>WordPress</h3>
<p>サーバーの設定を変えられない場合は、WordPressの <code>wp_headers</code> フィルターで足せます。コードを <code>wp-content/mu-plugins/</code> の直下に置くと自動で読み込まれ、テーマの変更でも消えず、管理画面から無効にもできません。</p>
<pre class="slt-code"><code>&lt;?php
// wp-content/mu-plugins/security-headers.php として保存する
add_filter( 'wp_headers', function ( $headers ) {
    $headers['X-Content-Type-Options'] = 'nosniff';
    $headers['Referrer-Policy']        = 'strict-origin-when-cross-origin';
    $headers['X-Frame-Options']        = 'SAMEORIGIN';
    $headers['Permissions-Policy']     = 'camera=(), microphone=(), geolocation=()';
    return $headers;
} );</code></pre>
<p>このフィルターは、<a href="https://developer.wordpress.org/reference/hooks/wp_headers/">公式リファレンス</a>にあるとおりWP::send_headers()の中で適用され、効くのは公開ページの応答だけです。管理画面、ログイン画面、REST API、画像やCSSには付かないため、HSTSはサーバーかCDNで付けます。</p>
<p>WordPress 6.9以降は、管理画面とログイン画面に、本体が <code>X-Frame-Options: SAMEORIGIN</code> と <code>frame-ancestors 'self'</code> のCSPを付けます。サーバー側でCSPを付けるときは、この2つの画面でも値が食い違わないかの確認が必要です。</p>

<h3>Cloudflare</h3>
<p>Cloudflareでは、Rules Overviewの「Create rule」から「Response Header Transform Rule」を作ります。操作は、同名のヘッダーを上書きする「Set static」を選びます。「Add」は既存のヘッダーを残したまま足すため、オリジンの値と2本並びます。</p>
<p>HSTSは、Edge Certificatesの画面にある専用の設定で付けられます。マネージド変換の「Add security headers」は、OWASPが勧めない <code>X-XSS-Protection: 1; mode=block</code> や廃止済みのExpect-CTも付けるため、個別のルールで付ける方が推奨値にそろえやすくなります。</p>

<h2>HSTSの設定方法と、max-ageを延ばす手順</h2>
<p>HSTSは、HTTPSがサイト全体で安定してから、max-ageを5分、1週間、1か月と延ばし、最後に1年以上にします。HSTSを覚えたブラウザでは、証明書の期限切れなどのエラーのとき、利用者が警告を越えて進めなくなります。そのため、証明書の更新の自動化を先に済ませます。</p>
<p><a href="https://slt-inc.jp/glossary/hsts/">HSTS</a>を受け取ったブラウザは、受け取った時点からmax-ageの秒数だけそのホストを覚え、HTTPのURLもHTTPSに切り替えて接続します（<a href="https://www.rfc-editor.org/rfc/rfc6797">RFC 6797</a>）。HTTPの応答に付けたHSTSは無視されるため、HTTPSの応答に付けます。</p>
<ol class="slt-steps">
<li><strong>前提をそろえる</strong>全ページがHTTPSで表示され、<a href="https://slt-inc.jp/glossary/mixed-content/">混在コンテンツ</a>が無く、HTTPからHTTPSへ301で転送していることを確かめます。証明書の自動更新と期限の監視も整えます。期限の確かめ方は、<a href="https://slt-inc.jp/article/ssl-tls-certificate-check/">SSL/TLS証明書のチェック方法</a>で説明しています。</li>
<li><strong>サブドメインを含めるか決める</strong>includeSubDomainsは、社内向けを含むすべてのサブドメインがHTTPSで動く場合だけ付けます。付けるなら、登録窓口のhstspreload.orgが勧める手順のとおり、最初の5分の段階から付けて試します。</li>
<li><strong>max-age=300で配信する</strong>全ページと各サブドメインを開き、問い合わせ、決済、ログインまで動かします。</li>
<li><strong>1週間、1か月と延ばす</strong>604800、2592000の順に延ばします。各段階では、その値の期間が過ぎるまで待ってから次へ進みます。</li>
<li><strong>1年以上にする</strong>最終値は31536000（1年）以上にします。OWASPとhstspreload.orgの例は63072000（2年）です。</li>
</ol>
<pre class="slt-code"><code># 段階ごとの値（includeSubDomainsは、付けると決めた場合だけ）
Strict-Transport-Security: max-age=300; includeSubDomains
Strict-Transport-Security: max-age=604800; includeSubDomains
Strict-Transport-Security: max-age=2592000; includeSubDomains
Strict-Transport-Security: max-age=31536000; includeSubDomains</code></pre>
<div class="slt-callout is-warn"><p class="slt-callout-title">注意</p><p>preloadは付けません。hstspreload.org自身が『HSTSは推奨するが、HSTS preloadは推奨しない』と明記しています。ChromeやSafariはHSTSが無くてもHTTPの移動をHTTPSへ切り替えるため、preloadの上乗せの効果は小さいという説明です。</p><p>preloadを付けたヘッダーは、一覧への登録を求めているとみなされます。登録後の削除は、Chromeの更新で利用者に届くまで数か月かかり、他のブラウザでの反映は保証されません。</p></div>

<h2>CSPの設定例と、Report-Onlyからの段階導入</h2>
<p><a href="https://slt-inc.jp/glossary/csp/">CSP</a>は、まずContent-Security-Policy-Report-Onlyという名前で配信して違反を集め、正当な取得元を許可リストに足します。違反が出なくなったら、ヘッダー名をContent-Security-Policyに変えて強制します。Report-Onlyは読み込みを何も止めないので、本番のサイトで影響だけを測れるのが利点です。</p>
<figure class="slt-figure"><svg role="img" viewBox="0 0 800 360"><title>CSPを段階的に強制へ移す流れ</title><desc>4つの段階が左から右へ並ぶ。1は観察で、Report-Onlyで止めずに違反を記録する。2は修正で、違反を見て許可を足す。3は強制で、ヘッダー名をCSPに変えて止める。4は強化で、nonceやハッシュで絞る。3から1へ戻る赤い破線は、壊れたらヘッダー名を戻すことを示す。下段は、1と2ではReport-Onlyだけを送り、3と4では強制のCSPに加えて次の案をReport-Onlyで送ることを示す。</desc><defs><marker id="f2-arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto"><path d="M0,0 L10,5 L0,10 z" fill="#10265A"/></marker><marker id="f2-back" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto"><path d="M0,0 L10,5 L0,10 z" fill="#D00A0A"/></marker></defs><rect x="0" y="0" width="800" height="360" fill="#FFFFFF"/><path d="M492 95 V58 H102 V89" fill="none" stroke="#D00A0A" stroke-width="3" stroke-dasharray="10 7" marker-end="url(#f2-back)"/><text x="297" y="44" text-anchor="middle" font-size="22" fill="#10265A">壊れたらヘッダー名を戻す</text><rect x="20" y="95" width="165" height="165" rx="10" fill="#EEF2F9" stroke="#10265A" stroke-width="3"/><text x="102" y="136" text-anchor="middle" font-size="24" font-weight="bold" fill="#10265A">①観察</text><text x="102" y="180" text-anchor="middle" font-size="22" fill="#10265A">Report-Only</text><text x="102" y="220" text-anchor="middle" font-size="22" fill="#10265A">止めずに記録</text><line x1="185" y1="178" x2="209" y2="178" stroke="#10265A" stroke-width="4" marker-end="url(#f2-arrow)"/><rect x="215" y="95" width="165" height="165" rx="10" fill="#EEF2F9" stroke="#10265A" stroke-width="3"/><text x="297" y="136" text-anchor="middle" font-size="24" font-weight="bold" fill="#10265A">②修正</text><text x="297" y="180" text-anchor="middle" font-size="22" fill="#10265A">違反を見て</text><text x="297" y="220" text-anchor="middle" font-size="22" fill="#10265A">許可を足す</text><line x1="380" y1="178" x2="404" y2="178" stroke="#10265A" stroke-width="4" marker-end="url(#f2-arrow)"/><rect x="410" y="95" width="165" height="165" rx="10" fill="#EEF2F9" stroke="#10265A" stroke-width="3"/><text x="492" y="136" text-anchor="middle" font-size="24" font-weight="bold" fill="#10265A">③強制</text><text x="492" y="180" text-anchor="middle" font-size="22" fill="#10265A">名前をCSPに</text><text x="492" y="220" text-anchor="middle" font-size="22" fill="#10265A">変えて止める</text><line x1="575" y1="178" x2="599" y2="178" stroke="#10265A" stroke-width="4" marker-end="url(#f2-arrow)"/><rect x="605" y="95" width="165" height="165" rx="10" fill="#EEF2F9" stroke="#10265A" stroke-width="3"/><text x="687" y="136" text-anchor="middle" font-size="24" font-weight="bold" fill="#10265A">④強化</text><text x="687" y="180" text-anchor="middle" font-size="22" fill="#10265A">nonceや</text><text x="687" y="220" text-anchor="middle" font-size="22" fill="#10265A">ハッシュで絞る</text><rect x="20" y="286" width="360" height="56" rx="10" fill="#FFFFFF" stroke="#4A5C82" stroke-width="3"/><text x="200" y="322" text-anchor="middle" font-size="22" fill="#10265A">送るのはReport-Only</text><rect x="410" y="286" width="360" height="56" rx="10" fill="#FFFFFF" stroke="#4A5C82" stroke-width="3"/><text x="590" y="322" text-anchor="middle" font-size="22" fill="#10265A">強制＋次の案はReport-Only</text></svg><figcaption>図2 CSPは、Report-Onlyでの観察、許可リストの修正、強制への切り替え、nonceやハッシュによる強化の順に進めます。下段は、各段階で送るヘッダーです。強制の後に問題が出たら、ヘッダー名をReport-Onlyに戻します。</figcaption></figure>
<ol class="slt-steps">
<li><strong>Report-Onlyで配信する</strong>最初は、自サイト以外の取得元を違反として記録するだけの方針にします（下の設定例）。</li>
<li><strong>全ページを巡回して違反を集める</strong>トップ、記事、フォーム、決済、管理画面まで開き、Consoleの違反を記録します。</li>
<li><strong>許可リストを直す</strong>アクセス解析、フォント、地図、動画などの取得元を、必要なディレクティブにだけ足します。</li>
<li><strong>ヘッダー名を変えて強制する</strong>違反が出なくなったら、Content-Security-Policyに切り替えます。さらに厳しくする案は、Report-Onlyで同時に送って試せます。</li>
<li><strong>nonceかハッシュで厳しくする</strong>インラインスクリプトを許す <code>'unsafe-inline'</code> を外し、web.devが勧める厳格なCSPへ近づけます。</li>
</ol>
<pre class="slt-code"><code># Apache（行末の\は次の行へ続く印。\の後ろに空白を入れない）
Header always set Content-Security-Policy-Report-Only "default-src 'self'; \
    img-src 'self' data: https:; object-src 'none'; base-uri 'self'; \
    form-action 'self'; frame-ancestors 'self'"

# nginx（serverブロックに書く。長い値は変数に分けて組み立てる）
set $csp "default-src 'self'; img-src 'self' data: https:; ";
set $csp "${csp}object-src 'none'; base-uri 'self'; ";
set $csp "${csp}form-action 'self'; frame-ancestors 'self'";
add_header Content-Security-Policy-Report-Only $csp always;</code></pre>
<p>default-srcが代わりを務めるのは、script-srcやimg-srcなどの取得系の指定だけです。base-uri、form-action、frame-ancestorsは個別に書きます。<code>object-src 'none'</code> はプラグインによる埋め込みを止める指定で、web.devの推奨にも含まれる値です。</p>
<p>Chrome 146では、違反はConsoleに情報（Info）として表示され、末尾に『The policy is report-only』で始まる一文が付きます。強制に切り替えると同じ違反がエラーになり、末尾は『The action has been blocked.』に変わります。インラインスクリプトの違反に示される『sha256-…』の値をscript-srcに足すと、そのスクリプトだけを許可できます。</p>
<p>違反をサーバーに集めるには、受け口を <code>Reporting-Endpoints</code> ヘッダーで示し、ポリシーに <code>report-to</code> を足します。設定例は<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Content-Security-Policy-Report-Only">MDNのContent-Security-Policy-Report-Only</a>にあり、古いブラウザ向けに <code>report-uri</code> も併記しています。受け口には、ブラウザが送るJSONを保存する仕組みが別に要ります。</p>
<p>強制に切り替えた後は、web.devが勧める<a href="https://web.dev/articles/strict-csp">厳格なCSP</a>へ近づけます。web.devは、ドメインを並べる許可リスト方式は多くの構成で回避されうるとし、nonce（応答ごとの乱数）かハッシュで許可する方式を勧めています。nonceは暗号学的に安全な乱数（128ビット以上が望ましい）で、応答のたびに作り直します。</p>
<pre class="slt-code"><code># web.devが勧める厳格なCSP（{RANDOM}は応答ごとに作る乱数）
Content-Security-Policy: script-src 'nonce-{RANDOM}' 'strict-dynamic';
    object-src 'none'; base-uri 'none';

# HTML側は、許可するscriptタグに同じ値を付ける
&lt;script nonce="{RANDOM}" src="/js/app.js"&gt;&lt;/script&gt;</code></pre>
<div class="slt-callout is-warn"><p class="slt-callout-title">注意</p><p>script-srcに <code>'unsafe-inline'</code> を残すと、差し込まれたインラインスクリプトも実行できるため、XSSへの効果は大きく下がります。WordPressのように本体やプラグインがインラインスクリプトを出すサイトでは、最初は残すしかない場合もあります。その場合でも、frame-ancestors、form-action、base-uri、object-srcの制限は働きます。</p></div>

<h2>同じヘッダーが2本届いたときに起きること</h2>
<p>同名のヘッダーが2本届いたときの扱いはヘッダーごとに違い、HSTSは最初の1本だけ、CSPは両方が効いて厳しい側が勝ちます。X-Frame-Optionsは値が食い違うと、同じサイトの枠の中でも表示を拒否します。重複はエラーにならず黙って起きるため、確認の段階で本数を数えます。</p>
<div class="slt-table-wrap"><table class="slt-table"><thead><tr><th>ヘッダー</th><th>2本届いたときの扱い</th><th>根拠</th></tr></thead><tbody>
<tr><td>Strict-Transport-Security</td><td>最初の1本だけを処理する</td><td>RFC 6797</td></tr>
<tr><td>Content-Security-Policy</td><td>両方を適用し、より厳しい制限が効く</td><td>MDN、Chrome 146の動作</td></tr>
<tr><td>X-Frame-Options</td><td>同じ値なら1本と同じ。DENYとSAMEORIGINが並ぶと、すべての枠で拒否</td><td>Chrome 146の動作</td></tr>
<tr><td>Referrer-Policy</td><td>カンマで並んだ値のうち、最後の有効な値を使う</td><td>MDN、Chrome 146の動作</td></tr>
<tr><td>Permissions-Policy</td><td>同じ機能の指定は、後に届いた方が有効</td><td>Chrome 146の動作</td></tr>
</tbody></table></div>
<p>根拠をChrome 146の動作とした行は、他のブラウザで扱いが異なる場合があります。重複を残さないことが、どのブラウザでも確実な対策です。</p>
<p>X-Frame-Optionsの値が食い違うと、Chrome 146はConsoleに次の例のように表示し、DENYとして扱います。</p>
<pre class="slt-code"><code>Refused to display 'https://example.com/' in a frame because it set multiple
'X-Frame-Options' headers with conflicting values ('DENY, SAMEORIGIN').
Falling back to 'deny'.</code></pre>
<p>主な原因は、アプリとサーバーによる二重の付与と、Apacheの <code>Header add</code> やCloudflareの「Add」のような追加の操作です。付ける場所を1つに絞り、操作はsetにそろえます。</p>

<h2>設定できたかをcurlと開発者ツールで確かめる</h2>
<p>確認は設定ファイルではなく、外から取った実際の応答で行います。トップページ、存在しないURL、HTTPSのリダイレクト、画像やCSS、ログイン画面の5種類で、各ヘッダーが1本ずつ付いていれば合格です。</p>
<pre class="slt-code"><code># ヘッダーだけを取得する（-IはHEADリクエスト）
curl -sI https://www.example.com/
# GETで取得し、応答ヘッダーだけを表示する
curl -s -D - -o /dev/null https://www.example.com/
# 404の応答にも付いているか
curl -sI https://www.example.com/no-such-page/
# wwwへ転送するリダイレクトに、HSTSが付いているか
curl -sI https://example.com/ | grep -i -E '^(HTTP|location|strict-transport)'
# 重複していないか（1なら合格）
curl -sI https://www.example.com/ | grep -ci '^x-frame-options:'
# Windows PowerShell 5.1は curl.exe と書き、findstrで絞る
curl.exe -sI https://www.example.com/ | findstr /i "x-frame-options"</code></pre>
<p>Windows PowerShell 5.1では <code>curl</code> がInvoke-WebRequestの別名のため、<code>.exe</code> まで書きます。HEADとGETで違う応答を返すサーバーもあるので、GETの結果も見ておくと確実です。</p>
<ul class="slt-check">
<li>トップページ（200）に、入れたヘッダーがそれぞれ1本ずつ付いている</li>
<li>存在しないURL（404）にも、同じヘッダーが付いている</li>
<li>wwwの有無をそろえる転送など、HTTPSのリダイレクトにHSTSが付いている</li>
<li>画像、CSS、JavaScriptにも付き、Content-Typeが種類どおりになっている</li>
<li>ログイン画面や管理画面で、X-Frame-OptionsやCSPの値が食い違っていない</li>
</ul>
<p>ブラウザでは、F12キーで開発者ツールを開き、Network（ネットワーク）タブで再読み込みします。先頭の文書を選んでHeaders（ヘッダー）のResponse Headers（レスポンス ヘッダー）を見て、CSPの違反はConsole（コンソール）タブで確かめます。</p>
<p>主なヘッダーをまとめて確かめるには、無料の<a href="https://slt-inc.jp/service/security-checker/">Webサイトのセキュリティチェック</a>も使えます。URLを入れると、HSTSの有無と有効期間、サブドメインへの適用、CSP、X-Frame-Optionsなど6種類のヘッダーを確認し、AからFの判定と直し方を表示します。ヘッダー以外の確認項目は、<a href="https://slt-inc.jp/article/website-security-check-items/">Webサイトのセキュリティチェック項目の一覧</a>にまとめています。</p>

<h2>表示や機能が壊れたときの戻し方</h2>
<p>CSP、X-Frame-Options、Permissions-Policyは、設定を戻せば次の読み込みから元に戻ります。HSTSだけは、ブラウザが覚えた期間が残るため、すぐには戻せません。</p>
<div class="slt-table-wrap"><table class="slt-table"><thead><tr><th>ヘッダー</th><th>主な症状</th><th>戻し方</th></tr></thead><tbody>
<tr><td>Content-Security-Policy</td><td>アクセス解析、地図、フォームが動かない</td><td>ヘッダー名をReport-Onlyに戻し、許可リストを直す</td></tr>
<tr><td>X-Frame-Options、frame-ancestors</td><td>提携先の枠の中やプレビューが表示されない</td><td>許す親のオリジンだけをframe-ancestorsに足す</td></tr>
<tr><td>Permissions-Policy</td><td>位置情報やカメラが動かない（Consoleに『Permissions policy violation』）</td><td>その機能を <code>(self)</code> などの許可に変える</td></tr>
<tr><td>X-Content-Type-Options</td><td>JavaScriptやCSSが読み込まれない（Consoleに『strict MIME type checking is enabled』）</td><td>nosniffは外さず、Content-Typeを直す</td></tr>
<tr><td>Strict-Transport-Security</td><td>証明書のエラーで、利用者がページに進めない</td><td>証明書を直す（下の注意を参照）</td></tr>
</tbody></table></div>
<div class="slt-callout is-warn"><p class="slt-callout-title">注意</p><p>HSTSを外すだけでは、ブラウザの記憶は期限まで残ります。HTTPSの応答で <code>max-age=0</code> を返すと、そのブラウザが次にHTTPSで接続したときに記憶が消えますが、HTTPでは消せず、再訪しない利用者には届きません。CloudflareのHSTSも同じで、HSTSを無効にして元のmax-ageの期間が過ぎる前にHTTPSをやめると、サイトに接続できなくなると公式文書が警告しています。</p></div>
<div class="slt-callout is-note"><p class="slt-callout-title">補足</p><p>試験で自分のChromeに残った記憶は、<code>chrome://net-internals/#hsts</code> の「Delete domain security policies」にドメインを入れて消せます。消せるのはそのブラウザの記憶だけで、プリロード済みの登録は消せません。CDNやページキャッシュが応答を保存している場合は、キャッシュを消すまで古いヘッダーが届きます。</p></div>
<p>ヘッダーの設定を1つのファイルにまとめて変更の履歴を残すと、1行の変更で戻せます。影響範囲を見極めにくい場合や、原因のヘッダーを切り分けられない場合は、<a href="https://slt-inc.jp/inquiry/">診断や設定についての相談窓口</a>からお問い合わせください。</p>

<h2>よくある質問</h2>
<div class="slt-faq"><h3>セキュリティヘッダーは検索順位に影響しますか？</h3><p>順位への影響を示すGoogleの公式な説明は見当たりません。Googleの検索セントラルは、ページエクスペリエンスの確認項目にHTTPSを挙げていますが、個々のセキュリティヘッダーには触れていません（2026年10月時点）。一方、CSPの誤設定で問い合わせフォームや計測タグが止まると、成果に直接響きます。</p></div>
<div class="slt-faq"><h3>.htaccessに書いたのに反映されません。どこを確かめればよいですか？</h3><p>サーバーの種類、上書きの許可、モジュール、キャッシュの順に確かめます。nginxは.htaccessを読まず、ApacheでもHeaderの指定には、<code>AllowOverride FileInfo</code> の許可とmod_headersの有効化が必要です。設定が正しいのに付かないときは、CDNやページキャッシュを消してから curl で確かめます。</p></div>
<div class="slt-faq"><h3>metaタグでセキュリティヘッダーを設定できますか？</h3><p>一部だけできます。CSPは <code>&lt;meta http-equiv="Content-Security-Policy"&gt;</code> で設定できますが、frame-ancestors、report-uri、sandboxは効かず、metaより前にある内容にも適用されません。Referrer-Policyは <code>&lt;meta name="referrer"&gt;</code> で指定でき、HSTS、X-Frame-Options、Content-Security-Policy-Report-Onlyはmetaに書いても無視されます。</p></div>
<div class="slt-faq"><h3>WordPressでCSPのnonceは使えますか？</h3><p>条件付きで使えます。WordPress 5.7以降は、<code>wp_script_attributes</code> と <code>wp_inline_script_attributes</code> のフィルターで、本体の関数が出力するscriptタグにnonce属性を足せます。ただし、HTMLを丸ごと保存するページキャッシュとは両立せず、プラグインが直接書き出すscriptタグにも付かないため、Report-Onlyで漏れを確かめます。</p></div>
<div class="slt-faq"><h3>ステージング環境や社内システムのサブドメインにHSTSは影響しますか？</h3><p>影響するかどうかは、includeSubDomainsをどのホストが返すかで決まります。RFC 6797では、includeSubDomainsは、ヘッダーを返したホストとその下のドメインに効きます。</p><p>www.example.jpだけが返すなら、dev.example.jpには効きません。example.jpが返すと、HTTPSに対応していない社内向けのサブドメインも、ブラウザで開けなくなります。</p></div>
<div class="slt-faq"><h3>OWASPが挙げるCOOP、COEP、CORPも入れるべきですか？</h3><p>この記事の6種類を整えてから検討します。OWASPが挙げるCross-Origin-Embedder-Policyの <code>require-corp</code> は、他のオリジンが読み込みを許していない画像や埋め込みを、読み込めなくする指定です。外部サービスを多く使うサイトほど影響が大きいため、1つずつ表示を確かめながら入れます。</p></div>
<div class="slt-faq"><h3>Permissions-Policyは、SafariやFirefoxでも効きますか？</h3><p>2026年10月時点では効きません。MDNの互換性データでは、このヘッダーに対応しているのはChromeやEdgeなどのChromium系で、FirefoxとSafariは未対応です。未対応のブラウザでは指定が無視されるだけなので、対応ブラウザでの補助の対策として入れます。</p></div>

<h2>関連記事</h2>
<div class="slt-related">
<a class="slt-related-item" href="https://slt-inc.jp/article/website-security-check-items/"><span class="slt-related-thumb"><img src="https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24854-security-checklist-300x200.png" srcset="https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24854-security-checklist-300x200.png 300w, https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24854-security-checklist-768x512.png 768w" sizes="auto, (max-width: 560px) 78vw, 300px" width="300" height="200" alt="" loading="lazy" decoding="async"></span><span class="slt-related-kind">関連記事</span><span class="slt-related-title">Webサイトのセキュリティチェック項目30選｜確認方法つき一覧表</span></a>
<a class="slt-related-item" href="https://slt-inc.jp/article/ssl-tls-certificate-check/"><span class="slt-related-thumb"><img src="https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24877-ssl-tls-check-300x200.png" srcset="https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24877-ssl-tls-check-300x200.png 300w, https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24877-ssl-tls-check-768x512.png 768w" sizes="auto, (max-width: 560px) 78vw, 300px" width="300" height="200" alt="" loading="lazy" decoding="async"></span><span class="slt-related-kind">関連記事</span><span class="slt-related-title">SSL/TLS証明書のチェック方法｜有効期限・チェーン・通信方式の確認手順</span></a>
<a class="slt-related-item" href="https://slt-inc.jp/article/wordpress-vulnerability-check/"><span class="slt-related-thumb"><img src="https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24880-wordpress-vulnerability-300x200.png" srcset="https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24880-wordpress-vulnerability-300x200.png 300w, https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24880-wordpress-vulnerability-768x512.png 768w" sizes="auto, (max-width: 560px) 78vw, 300px" width="300" height="200" alt="" loading="lazy" decoding="async"></span><span class="slt-related-kind">関連記事</span><span class="slt-related-title">WordPressの脆弱性を確認する方法｜本体・プラグインの更新と対処の手順</span></a>
<a class="slt-related-item" href="https://slt-inc.jp/article/vulnerability-assessment-vs-simple-check/"><span class="slt-related-thumb"><img src="https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24878-assessment-difference-300x200.png" srcset="https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24878-assessment-difference-300x200.png 300w, https://slt-inc.jp/wp-content/uploads/2026/10/slt-thumb-24878-assessment-difference-768x512.png 768w" sizes="auto, (max-width: 560px) 78vw, 300px" width="300" height="200" alt="" loading="lazy" decoding="async"></span><span class="slt-related-kind">関連記事</span><span class="slt-related-title">簡易チェックと脆弱性診断の違い｜無料ツールでできることと、専門業者が必要な場面</span></a>
</div>
<div class="slt-cta"><p class="slt-cta-title">設定したヘッダーを無料で確かめる</p><p>URLを入力すると、HSTS、CSP、X-Frame-Optionsなど6種類のヘッダーの有無に加え、証明書やCookieの属性もまとめて確認できます。メールアドレスの登録は要りません。</p><a class="slt-cta-btn" href="https://slt-inc.jp/service/security-checker/">無料でWebサイトをチェックする</a></div>
</div>
<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "セキュリティヘッダーは検索順位に影響しますか？", "acceptedAnswer": {"@type": "Answer", "text": "順位への影響を示すGoogleの公式な説明は見当たりません。Googleの検索セントラルは、ページエクスペリエンスの確認項目にHTTPSを挙げていますが、個々のセキュリティヘッダーには触れていません（2026年10月時点）。一方、CSPの誤設定で問い合わせフォームや計測タグが止まると、成果に直接響きます。"}}, {"@type": "Question", "name": ".htaccessに書いたのに反映されません。どこを確かめればよいですか？", "acceptedAnswer": {"@type": "Answer", "text": "サーバーの種類、上書きの許可、モジュール、キャッシュの順に確かめます。nginxは.htaccessを読まず、ApacheでもHeaderの指定には、AllowOverride FileInfo の許可とmod_headersの有効化が必要です。設定が正しいのに付かないときは、CDNやページキャッシュを消してから curl で確かめます。"}}, {"@type": "Question", "name": "metaタグでセキュリティヘッダーを設定できますか？", "acceptedAnswer": {"@type": "Answer", "text": "一部だけできます。CSPは <meta http-equiv=\"Content-Security-Policy\"> で設定できますが、frame-ancestors、report-uri、sandboxは効かず、metaより前にある内容にも適用されません。Referrer-Policyは <meta name=\"referrer\"> で指定でき、HSTS、X-Frame-Options、Content-Security-Policy-Report-Onlyはmetaに書いても無視されます。"}}, {"@type": "Question", "name": "WordPressでCSPのnonceは使えますか？", "acceptedAnswer": {"@type": "Answer", "text": "条件付きで使えます。WordPress 5.7以降は、wp_script_attributes と wp_inline_script_attributes のフィルターで、本体の関数が出力するscriptタグにnonce属性を足せます。ただし、HTMLを丸ごと保存するページキャッシュとは両立せず、プラグインが直接書き出すscriptタグにも付かないため、Report-Onlyで漏れを確かめます。"}}, {"@type": "Question", "name": "ステージング環境や社内システムのサブドメインにHSTSは影響しますか？", "acceptedAnswer": {"@type": "Answer", "text": "影響するかどうかは、includeSubDomainsをどのホストが返すかで決まります。RFC 6797では、includeSubDomainsは、ヘッダーを返したホストとその下のドメインに効きます。"}}, {"@type": "Question", "name": "OWASPが挙げるCOOP、COEP、CORPも入れるべきですか？", "acceptedAnswer": {"@type": "Answer", "text": "この記事の6種類を整えてから検討します。OWASPが挙げるCross-Origin-Embedder-Policyの require-corp は、他のオリジンが読み込みを許していない画像や埋め込みを、読み込めなくする指定です。外部サービスを多く使うサイトほど影響が大きいため、1つずつ表示を確かめながら入れます。"}}, {"@type": "Question", "name": "Permissions-Policyは、SafariやFirefoxでも効きますか？", "acceptedAnswer": {"@type": "Answer", "text": "2026年10月時点では効きません。MDNの互換性データでは、このヘッダーに対応しているのはChromeやEdgeなどのChromium系で、FirefoxとSafariは未対応です。未対応のブラウザでは指定が無視されるだけなので、対応ブラウザでの補助の対策として入れます。"}}]}</script><p>The post <a href="https://slt-inc.jp/article/security-headers-setup/">セキュリティヘッダーの設定方法｜HSTS・CSPの設定例つき</a> first appeared on <a href="https://slt-inc.jp">総合デジタルマーケティング企業 エスライン・テクノロジーズ</a>.</p>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
