結論(フォーム送信先がHTTPS)
フォーム送信先がHTTPSとは、form要素のaction属性と、送信ボタン側で送信先を上書きするformaction属性が、http:// ではなくHTTPS(または相対URL)になっている状態です。ページがHTTPSでも送信先がHTTPなら、氏名・住所・問い合わせ内容・検索語などは暗号化されずに送られます。Chromeはこれを「混在フォーム」として警告し、自動入力も無効にします。送信先をHTTPSに変え、CSPのform-actionで保険をかけるのが対策です。
この記事のポイント
- ページの鍵マークは取得経路を示すだけで、フォームの送信先は別に確認が必要です。
- formの action がHTTPSでも、ボタンの formaction がHTTPなら実際の送信は平文になります。
- 送信先のHTTP→HTTPSリダイレクトでは保護できません。最初の送信リクエストがすでに平文で送られています。
- セキュリティAIチェッカーはHTTPのactionまたはformactionが1件でもあれば×(重み5、最大)と判定します。
- CSPの form-action はまずReport-Onlyで確認し、upgrade-insecure-requests は強制ヘッダーにだけ書きます。
| 診断項目名 | フォーム送信先がHTTPS |
|---|---|
| 項目ID | forms.https-action |
| 分類 | フォーム・パスワード入力 |
| 重大度・配点の重み | 最重要(critical) 重み 5 |
| 関連する標準・ガイドライン | OWASP ASVS 5.0.0 12.2.1(L1:外部向けHTTPサービスとの通信はすべてTLSを使い、非暗号化通信へフォールバックしない)、OWASP WSTG v4.2 WSTG-CRYP-03(非暗号化チャネルで送信される機微情報のテスト)・WSTG-ATHN-01(暗号化チャネルでの認証情報送信のテスト)、CWE-319(機密情報の平文送信) |
フォーム送信先がHTTPSとは
フォーム送信先がHTTPSとは、<form> の action 属性と、送信ボタン側で送信先を上書きする formaction 属性が、http:// ではなく HTTPS(または相対URL)になっている状態のことです。
<form action="https://www.city.example.lg.jp/search/" method="get">
ページ自体が HTTPS で配信されていても、<form action="http://..."> のように送信先が HTTP になっていると、入力された氏名・住所・電話番号・問い合わせ内容・検索語などは暗号化されずにネットワークを流れます。この状態を Chrome などのブラウザは「混在フォーム(mixed form)」と呼び、警告の対象にしています。
この診断項目は、トップページの HTML に含まれるフォームの送信先(action 属性と formaction 属性)に http:// が使われていないかを確認します。
action と formaction の関係
MDN によると、<form> の action は「フォーム送信を処理するURL」で、この値は <button>、<input type="submit">、<input type="image"> の formaction 属性で上書きできます。したがって、form タグの action が HTTPS でも、送信ボタンの formaction が HTTP なら実際の送信は平文になります。
action を省略した場合や相対URL(/search など)の場合は、ページ自身のURLを基準に解決されるため、HTTPS ページ上では HTTPS で送信されます。
method と送信内容
method の既定値は GET で、入力値はURLのクエリ文字列として付加されます。POST では本文として送られます。どちらも HTTP であれば平文で、経路上の第三者が読み取り・改ざんできます。GET の場合はさらにアクセスログやブラウザ履歴、Referer にも残ります。
フォーム送信先がHTTPでなぜ危険なのか(混在フォームとブラウザの警告)
Chrome の混在フォーム警告
Chromium ブログ(2020年8月「Protecting Google Chrome users from insecure forms」)は、HTTPS ページ上の HTTP 送信フォームを混在フォームとして扱い、次の対応を行う方針を公表しました。
| Chrome の対応 | 内容 |
|---|---|
| 入力時の警告 | 「このフォームは安全ではありません」という警告を表示 |
| 自動入力 | 自動入力を無効化 |
| 送信時の警告 | 送信時に全画面の警告を表示 |
当初は M86 で導入予定とされ、同記事の2020年10月7日付の追記で M87 への延期が告知されています。なお、ログインフォームではパスワードマネージャーは引き続き動作するとされています。住民から見ると、自治体サイトで送信のたびに警告が出ることになり、信頼性を大きく損ないます。
標準・要件での位置付け
OWASP ASVS 5.0.0 12.2.1(L1)は、外部向けHTTPサービスとの通信はすべてTLSを使い、非暗号化通信へフォールバックしないことを求めています。OWASP WSTG v4.2 では WSTG-CRYP-03(非暗号化チャネルで送信される機微情報のテスト)と WSTG-ATHN-01(暗号化チャネルでの認証情報送信のテスト)が、この問題を確認するテストです。弱点としては CWE-319(機密情報の平文送信)に当たります。
フォーム送信先についてよくある誤解
- 「ページに鍵マークが付いているから送信も安全」:鍵マークはページの取得経路を示すもので、送信先は別です。
- 「送信先サーバーが HTTP→HTTPS リダイレクトしているから大丈夫」:最初の送信リクエスト(入力値を含む)はすでに平文で送られています。リダイレクトでは保護できません。また POST は 301/302 で GET に変わり、入力が失われることもあります。
- 「検索フォームだけだから問題ない」:検索語には相談内容(DV、生活保護、病名など)が含まれることがあり、自治体サイトでは要配慮情報になり得ます。
ページ自体の HTTPS 化は「HTTPSで配信されている」、ログインフォームの送信先を同一オリジンに限定できているかは「認証情報の送信先をHTTPS・同一オリジンへ限定」の項目で別に確認します。このページは、すべてのフォームの送信先が HTTP でないかに絞って解説します。
フォーム送信先がHTTPSの診断基準(セキュリティAIチェッカー)
取得対象と方法
- 最終到達ページ(トップページ)の HTML 本文(最大2MB)を解析します。
<form ...>開始タグをすべて抽出し、action属性の値がhttp://で始まるもの(引用符あり・なし、値先頭の空白を許容)を数えます。- あわせて HTML 全体から、
<button>または<input>のformaction属性がhttp://で始まるものを数えます。 - 相対URL・action 省略・
https://は安全側として扱います(ページ自体の HTTPS 化は別項目transport.httpsで評価)。
判定条件
| 判定 | 条件 | 得点への影響 |
|---|---|---|
| ○ 問題なし(pass) | フォームがあり、HTTP の action / formaction が0件 | 重み5 × 1.00 |
| × 要改善(fail) | HTTP の action または formaction が1件以上 | 重み5 × 0 |
| 対象外(na) | form 要素がない | 採点から除外 |
- 根拠欄には「HTTP送信先: 件数/フォーム総数」と、該当があれば「HTTPのformaction: 件数」が表示されます。
- 重み5のため、1件の fail で総合スコアは大きく下がります。この項目に「△ 要確認(warn)」はありません。
自治体サイトでの判定例
| HTML | 判定 |
|---|---|
<form action="/search/result.html" method="get"> | ○ 問題なし |
<form action="https://search.example-cms.jp/city/"> | ○ 問題なし(外部でもHTTPS) |
<form action="http://search.example-cms.jp/city/"> | × 要改善 |
<form action="https://..."><button formaction="http://old.example.jp/send"> | × 要改善 |
| フォームのないトップページ | 対象外 |
自治体トップページでは「サイト内検索」の form がよく該当します。外部のサイト内検索サービスや、旧来の Google カスタム検索の設置コードが http:// のまま残っている例が典型です。
診断の限界
- JavaScript(fetch や XMLHttpRequest、
form.action = ...の動的変更)による送信先は評価しません。 - トップページ以外のフォーム(問い合わせ、申請、アンケート)は対象外です。主要フォームのページは個別に診断してください。
//example.jp/のようなプロトコル相対URLはページのスキームを継承するため、HTTPS ページ上では安全として扱います。
フォーム送信先がHTTPだとどんなリスクがあるか
- 盗聴:公衆無線LANや侵害されたルーター上で、問い合わせ内容・氏名・連絡先・検索語が第三者に読まれます。
- 改ざん:応答側も HTTP のため、送信後に表示される結果ページを書き換えられ、偽の案内や偽の振込先、マルウェア配布サイトへの誘導を差し込まれる可能性があります。
- ブラウザ警告による業務影響:混在フォームとして警告が表示されると、住民が送信をためらい、問い合わせが電話に回るなど窓口負担が増えます。自動入力も無効化されます。
- 個人情報保護上の問題:個人情報の保護に関する法律に基づく安全管理措置の観点から、平文送信は説明が困難です。
フォーム送信先をHTTPSにする方法(HTML・CSP:Apache・nginx・IIS・Next.js)
1. 送信先を HTTPS に変える
<!-- 修正前 -->
<form action="http://search.example-cms.jp/city/" method="get">
<!-- 修正後(同一サイトなら相対URLでもよい) -->
<form action="https://search.example-cms.jp/city/" method="get">
送信先のサーバーが HTTPS に対応していない場合は、委託先に HTTPS 化を依頼するか、HTTPS 対応のサービスへ切り替えます。
2. 一括で洗い出す
# 公開ディレクトリ内の HTTP 送信先を検索
grep -rniE '(action|formaction)\s*=\s*["'\'']?\s*http://' /var/www/html --include=*.htm* --include=*.php
CMS の場合はテンプレート(ヘッダー・フッター部品)と、記事本文に貼り付けられた埋め込みコードの両方を確認します。
3. ブラウザ側の保険:CSP の form-action と upgrade-insecure-requests
Content-Security-Policy の form-action で送信先を HTTPS に限定できます。また upgrade-insecure-requests は、HTTP のサブリソース参照とフォーム送信(別オリジン宛てを含む)を自動的に HTTPS へ置き換えます。
form-action はまず Report-Only で影響を確認します。upgrade-insecure-requests は Report-Only ヘッダーでは無視される(W3C 仕様)ため、強制ヘッダーにだけ書きます。
Apache(.htaccess)
<IfModule mod_headers.c>
Header always set Content-Security-Policy-Report-Only "form-action 'self' https:"
</IfModule>
nginx
add_header Content-Security-Policy-Report-Only "form-action 'self' https:" always;
IIS(web.config)
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Content-Security-Policy-Report-Only" value="form-action 'self' https:" />
</customHeaders>
</httpProtocol>
</system.webServer>
Next.js(next.config.ts、確認後の強制ヘッダーの例)
const nextConfig = {
async headers() {
return [{ source: "/:path*", headers: [
{ key: "Content-Security-Policy", value: "form-action 'self' https:; upgrade-insecure-requests" },
] }];
},
};
export default nextConfig;
Report-Only の違反は、report-to / report-uri を指定しない場合ブラウザの開発者ツールのコンソールでしか確認できません。問題がないことを確認してから Content-Security-Policy へ切り替え、upgrade-insecure-requests を加えます。既存の CSP がある場合は、ヘッダーを二重に送らず既存ポリシーにディレクティブを追記してください。CSP 全体の評価は「Content Security Policy」の項目で行います。
4. 設定後の確認方法
curl -s https://www.city.example.lg.jp/ | grep -ioE '<(form|button|input)[^>]*(action|formaction)[^>]*>'
Chrome でフォームに入力し、「このフォームは安全ではありません」の表示が出ないこと、開発者ツールの Network で送信リクエストが https:// であることを確認します。修正後はセキュリティAIチェッカーで再診断し、根拠欄の「HTTP送信先」が0件になっていることを確かめてください。
サイトを壊さないための注意点
form-actionは送信後のリダイレクト先にも適用されるブラウザがあります。外部決済・外部認証へ遷移するフォームがある場合は、その遷移先も許可に含めてください。upgrade-insecure-requestsは HTTPS 非対応の外部資産や送信先を利用できなくします。Report-Only では試せないため、事前にContent-Security-Policy-Report-Only: default-src https:で HTTP 参照を洗い出すか、テスト環境で確認します。- 送信先を変える場合、受け側の CGI・PHP が HTTPS でも同じパスで動くこと、POST がリダイレクトで失われないことを確認します。
よくある質問(FAQ)
ページがHTTPSならフォームの送信も安全ですか?
安全とは限りません。鍵マークはページの取得経路を示すもので、送信先は別です。action や formaction が http:// なら、入力内容は暗号化されずに送られます。
送信先サーバーがHTTPSへリダイレクトしていれば問題ありませんか?
問題があります。入力値を含む最初の送信リクエストはすでに平文で送られており、リダイレクトでは保護できません。またPOSTは301/302でGETに変わり、入力が失われることもあります。
検索フォームだけでもHTTPSにする必要がありますか?
必要です。検索語にはDV、生活保護、病名など相談内容が含まれることがあり、自治体サイトでは要配慮情報になり得ます。GETの場合は入力値がURLに付くため、アクセスログやブラウザ履歴、Refererにも残ります。
action を省略したり相対URLにしたりした場合はどうなりますか?
ページ自身のURLを基準に解決されるため、HTTPSページ上ではHTTPSで送信されます。セキュリティAIチェッカーも、相対URL・action省略・//で始まるプロトコル相対URLは安全側として扱います。
Chromeの「このフォームは安全ではありません」とは何ですか?
HTTPSページ上のHTTP送信フォーム(混在フォーム)に対するChromeの警告です。Chromiumブログは2020年8月、入力時の警告、自動入力の無効化、送信時の全画面警告を行う方針を公表しました(当初M86予定、M87へ延期)。
CSPの upgrade-insecure-requests はReport-Onlyで試せますか?
試せません。W3C仕様上、upgrade-insecure-requests はContent-Security-Policy-Report-Onlyヘッダーでは無視されるため、強制ヘッダーにだけ書きます。事前に default-src https: のReport-OnlyでHTTP参照を洗い出すか、テスト環境で確認します。
この項目を含む127項目を、URLを入れるだけで無料診断します。
参考資料
- MDN
<form>要素(action / formaction / method) - MDN
<input type="password">(HTTPS で配信すべき旨の注意) - Chromium Blog「Protecting Google Chrome users from insecure forms」
- Help Net Security「Chrome 86 will prominently warn about insecure forms on secure pages」
- OWASP ASVS 5.0.0 V12 Secure Communication
- W3C Upgrade Insecure Requests
- CWE-319