First CH Appsサーバー処理を伴う小さなアプリ置き場

EN

First CH Apps / 混在コンテンツチェッカー

混在コンテンツチェッカー

URLを入れると、そのページのHTMLから http:// を指している参照を抜き出し、行番号・該当タグ・直し方を一覧します。ブラウザがブロックするもの(script・スタイルシート・iframe)と、自動で https へ書き換えるもの(画像・音声・動画)を分けて表示します。見つかったリソースへは1本もリクエストしません(HTMLの静的解析だけです)。

CSP・HSTS の採点は「セキュリティヘッダー採点」、リンク切れは「リンク切れ・alt属性チェック」、証明書そのものは「SSL証明書チェッカー」が担当します。ここは「httpsのページに残った http:// 参照」だけに絞っています。

http:// のURLを入れても構いません(https化したときに混在コンテンツになる参照を先に洗い出せます)。

直し方

同じサイト内のリソースは、ルート相対パス(例: /img/logo.png)へ書き換えるのが確実です。スキームもホスト名も書かなければ、次にドメインやプロトコルが変わったときに直す必要がありません。

別サイトのリソースは https:// へ書き換えます。相手が https に対応していない場合は、自社サーバーへ複製して配信するか、その参照自体をやめる以外に手はありません(http のままでは読み込まれません)。

WordPress などのCMSは、投稿本文・カスタムフィールド・オプションに古い http:// のURLがデータベースごと残ります。管理画面のテーマ設定だけを直しても消えないので、DBの一括置換(wp search-replace 等)まで行ってください。シリアライズされた値を壊さないツールを使うのが重要です。

すぐにHTMLを直せない場合は、応急処置として Content-Security-Policy: upgrade-insecure-requests を返すとブラウザ側で https へ書き換わります。ただし相手が https に対応していなければ読み込めないままなので、恒久対策にはなりません。

プロトコル相対(//example.com/x.js)は今も動きますが、現在は非推奨です。https:// を明記してください。

直したあとは、ブラウザの開発者ツール(Console と Network)で「Mixed Content」の警告が消えていることを確認してください。JavaScript が後から差し込む参照は、このページのようなサーバー側の解析では見えません。

判定の基準

対象は入力された1ページのHTMLだけです。見つかった http:// のURLへはリクエストしません(実在するか・https で応答するかは確認していません)。

ブロック(能動的混在コンテンツ): script・スタイルシート・iframe・object/embed・Webアプリマニフェスト・字幕トラック・CSS の @import とWebフォント。W3C の Mixed Content 仕様で blocking に分類され、httpsのページでは読み込まれません。

自動https化(受動的混在コンテンツ): 画像・音声・動画とそのポスター画像・ファビコン・CSS の背景画像。仕様上は optionally-blockable で、主要ブラウザは https へ書き換えて取得し、失敗した場合に限りブロックします。

CSS の url() は中身を取りに行かないため、拡張子が woff / woff2 / ttf / otf / eot のものだけ Webフォント(ブロック)として扱い、それ以外は画像(自動https化)として扱います。

要確認: form の送信先・canonical・alternate・a href は混在コンテンツではありません(ブラウザはブロックしません)。ただし常時SSL化の直し漏れなので、a href は件数だけ、それ以外は一覧に挙げています。

相対URL(/img/a.png・a.png)はページと同じスキームで読み込まれるため、混在コンテンツにはなりません。入力が http のURLでも「https 化した後」を前提に判定します。ただし <base href="http://…"> がある場合は相対URLが実際に http へ解決されるので、そのまま挙げます。

走査するのはHTMLの先頭512KBまでです(無料枠のCPU上限に収めるため)。一覧は100件までで、超過分は件数のみ表示します。

JavaScript が実行後に差し込む参照(document.createElement など)はサーバー側では見えません。ブラウザの開発者ツールと併用してください。

SERVER PROCESSING — サーバーへ送るもの・保存するもの

送るもの: 入力されたURLだけ。当社サーバー(Cloudflare Workers)がそのURLを公開GETで1回取得します。Cookieもログイン情報も送りません。ページ内で見つかった http:// のURLへは一切アクセスしません。

保存するもの: ありません。検査はリクエストの中だけで完結し、URL・結果ともデータベース(KV/D1)へ書き込みません。処理が終わった時点でメモリから消えます。

返すもの: 抽出したURL・行番号・該当タグの抜粋・判定だけです。取得したページの原文は再配信しません(このアプリは他サイトを閲覧するための中継として使えません)。該当タグの抜粋は1件200文字までに切り詰めています。

注意: 取得は公開GETのみで、社内ネットワーク・localhost・プライベートIP宛のURLは受け付けません。

APIとして使う

POST /mixed-content/api/check に JSON({"url": "https://example.com/"})またはフォームを送ると、同じ検査結果が JSON で返ります。