Cloudflareがメールアドレス難読化スクリプトを修正(私がきっかけだったかもしれません)

Cloudflareのメールアドレス難読化スクリプトは、かつてレンダリングをブロックしていました。Cloudflareのプロダクトマネージャーがこの記事を読み、修正をリリースしました。SEOやセキュリティの問題は、依然として回避する価値があります。

Arjen Karel Core Web Vitals Consultant
Arjen Karel - linkedin
Last update: 2026-10-15

Cloudflareのメールアドレス難読化とは

CloudflareのEmail Address Obfuscationは、人間の訪問者には通常どおり表示しながら、収集ボットからページ上のメールアドレスを隠すScrape Shieldの機能です。すべてのCloudflareゾーンでデフォルトで有効になっています。

Arjen Karel による最終確認: 2026年4月

2026年4月追記: Cloudflareが修正しました。 CloudflareのプロダクトマネージャーからLinkedInで連絡がありました。この記事を読み、email-decode.min.js に defer 属性を追加したとのことです。Cloudflareの公式ドキュメントでも明記されています。このスクリプトはもはやレンダリングをブロックしません。

cloudflare email obfuscatino defer fix

defer の追加はわずか1行の変更です。当初適用されていなかったのは、DOMContentLoaded の前にアドレスがデコードされる前提のサイトを壊さないか、Cloudflare側で確認したかったからでしょう。チームの担当者がしっかりと対応しました。評価すべき仕事です。

仕組みはシンプルです。CloudflareのエッジプロキシがHTMLをスキャンし、メールアドレスとおぼしき文字列を探します。そして各アドレスをXORエンコードされた16進数文字列に置き換え、ブラウザ上でアドレスをデコードする email-decode.min.js という軽量スクリプトを挿入します。スクリプトのサイズは約1.2 KBで、現在は defer 付きで読み込まれ、実行後に自身をDOMから削除します。

少し前まで、このスクリプトには async も defer も指定されていませんでした。レンダリングをブロックしていたのです。大半の訪問者が気づきもしない、必要ともしていない機能のために。これが、この記事で当初指摘していた状況であり、Cloudflareが修正を行った理由です。

cloudflare email obfuscation settings.

Cloudflareのメールアドレス難読化がかつてCore Web Vitalsに与えていた影響

email obfuscation network.

defer による修正前、email-decode.min.js は render-blocking リソースとして挿入されていました。ブラウザはページのレンダリングを続行する前に、このスクリプトをダウンロードし、パースして実行しなければなりませんでした。これによって、次の3つの影響が生じていました:

1. クリティカルなレンダリング期間中にネットワーク帯域を奪い合い、Largest Contentful Paint を遅延させていました。
2. main thread をブロックし、Interaction to Next Paint を「改善が必要」の領域へと悪化させる要因になっていました。
3. Lighthouseの監査で最大5つの警告(render-blocking リソースの排除、main thread の long task の回避、JavaScript 実行時間の短縮、クリティカルなリクエストチェーンの回避、効率的なキャッシュポリシーによる静的アセットの配信)を引き起こしていました。

defer が適用された現在、スクリプトはHTMLのパースと並行してダウンロードされ、ドキュメントのパース完了後に実行されます。render-blocking の警告は解消されました。

修正後も残る課題

修正後も、main thread は1.2 KBの JavaScript をパースして実行する必要があります。デスクトップなら何の影響もありません。しかし、CPUに余裕がないローエンドのAndroid端末では、どんな些細な main thread タスクであっても INP バジェットを削り取ります。すでに残り50 msの INP ヘッドルームを確保するのに苦労しているなら、このスクリプトはキューに並ぶ余計なタスクの1つになります。

より深刻な問題、つまりCloudflareが修正しなかった問題は以下のとおりです。

SEOへの副作用

Cloudflareはメールアドレスを、/cdn-cgi/l/email-protection#[hex] を指すリンクに置き換えます。これらのURLは、Googlebotを含むクローラーに対して404を返します。その結果、Google Search Consoleで「ソフト 404」エラーが発生します。AhrefsやScreaming FrogなどのSEO監査ツールはこれを内部リンク切れとして報告するため、本来対処すべきクロール問題を覆い隠すノイズになります。Cloudflareでメールアドレス難読化を有効にしている場合は、Search Consoleのカバレッジレポートでこうした架空のエラーが発生していないか確認してください。

そもそもCloudflareのメールアドレス難読化は安全なのか?

実のところ、安全とは言えません。Cloudflareが使用しているのは、エンコードされた文字列自体にキーが埋め込まれた1バイトのXOR暗号です。Cloudflareで保護されたサイトはすべて同じデコードの仕組みを使っています。スパマーはデコーダーを1つ実装するだけで、そのすべてのサイトからメールアドレスを抽出できてしまいます。

セキュリティ研究者が実証しているとおり、このエンコードはいとも簡単に復元できます。Spencer Mortensenによる2026年の難読化調査では、ハニーポットのメールアドレスを使い、300以上の異なるスパマーを相手に25種類の手法をテストしました。シンプルなCSSの display:none を使った手法でさえ、収集ボットを100%遮断できています。ボットからメールアドレスを隠すのに、defer した JavaScript など不要です。

それでも無効化すべきか?

メールアドレス難読化が必要ないなら(大半のサイトでは不要です)、オフにすることでソフト 404 のクロールエラーを解消し、main thread のわずかな処理時間も削ることができます。設定手順は以下のとおりです:

1. Cloudflareのダッシュボードにログインします。
2. Security > Settings(古いダッシュボード構成の場合は Scrape Shield)を開きます。
3. Email Address Obfuscation をOFFに切り替えます。

これだけです。スクリプトは即座に消えます。完全なCloudflareパフォーマンス設定については、Core Web Vitalsに合格するための最適なCloudflare設定を参照してください。

Configuration Rulesを使ってページ単位で無効化する

問い合わせページではメールアドレス難読化を維持しつつ、トラフィックの多いランディングページでは無効にしたい場合は、Configuration Ruleを使用します:

1. Rules > Configuration Rules を開きます。
2. 新しいルールを作成し、名前を付けます(例: 「Disable email obfuscation on landing pages」)。
3. 一致条件を設定します(ホスト名、URLパス、またはその両方)。
4. Email Obfuscation の設定を追加し、Off に指定します。
5. デプロイします。

HTML内の特定のメールアドレスだけを除外したい場合は、次のようにコメントで囲むことも可能です: <!--email_off-->email@example.com<!--/email_off-->

難読化が必要なら自前で実装する

ボットからメールアドレスを隠したい場合でも、ユーザーが関心を示す前にスクリプトを読み込ませずに済む、はるかに優れた方法があります。最善のアプローチは、IntersectionObserverを使い、メールアドレスが画面内にスクロールされた瞬間にジャストインタイムでデコードすることです。これは、YouTubeの埋め込みからGoogle Mapsに至るまで、あらゆる対象に私が使っている「必要になるまで遅延させる(defer until needed)」パターンと同じです。

難読化したメールアドレスを作成する

ここではシンプルなBase64エンコードを使用しました。Base64はあくまで一例です。エンコードやデコードのための無料ライブラリは世の中に無数に存在します。
<a
 class="email-hidden"
 href="#"
 data-email="aW5mb0BleGFtcGxlLmNvbQ==">
 [email-hidden]
</a>

IntersectionObserverを設定します。この JavaScript コードをページの末尾に配置してください。

<script>
const emailtag = document.querySelector('.email-hidden');
let observer = new IntersectionObserver((entries) => {
  entries.map((entry) => {
    if (entry.isIntersecting) {
      let script = document.createElement('script');
      script.onload = function () {
        emaildecode(entry.target)
      };
      script.src = 'decode-email.js';
      document.head.appendChild(script);
    }
  });
}).observe(emailtag);
</script>

メールデコード用スクリプト decode-email.js をアップロードし、デコード処理をお好みのライブラリに置き換えてください。

const emaildecode = (e) => {
	let email = atob(e.dataset.email);
	e.href = 'mailto:'+email;
	e.innerHTML = email;
}

結果を確認する

<a href="mailto:info@example.com">info@example.com</a>

メールアドレスは、訪問者がスクロールして画面に表示させたときにのみデコードされます。INP への影響はゼロ、Googlebot に対するソフト 404 エラーも発生せず、Base64エンコードの安全性もCloudflareのXOR暗号と何ら変わりません。実際の訪問者における改善効果を検証するには、Real User Monitoring を設定してください。Lighthouse のスコアはデバッグに役立ちますが、Googleがランキング評価に使用するのは実ユーザーの field data です。

About the author

Arjen Karel is a web performance consultant and the creator of CoreDash, a Real User Monitoring platform that tracks Core Web Vitals data across hundreds of sites. He also built the Core Web Vitals Visualizer Chrome extension. He has helped clients achieve passing Core Web Vitals scores on over 925,000 mobile URLs.

Lighthouseのスコアは全体像ではありません。

実ユーザーはAndroid端末で4Gを使っています。その人たちが実際に何を体験しているかを分析します。

フィールドデータを分析
Cloudflareがメールアドレス難読化スクリプトを修正(私がきっかけだったかもしれません) Core Web Vitals Cloudflareがメールアドレス難読化スクリプトを修正(私がきっかけだったかもしれません)