メールアドレス・テキスト難読化ツール (スパム対策)

本ツールは,メールアドレスや電話番号をHTML実体参照や難読化JavaScriptコードに変換するブラウザツールです.出力されたコードをWebサイトに貼り付けることで,スパムボットによる自動収集対策のひとつの手段として利用できます.

読み込み中...

ZeroToolsのブラウザ内処理とプライバシー

プレーンテキスト表示のため,生成されたHTMLやJavaScriptは実行されません.実際の動作は出力先の環境に依存します.本機能は可逆的な難読化を行うものであり,暗号化や確実なスパム対策を提供するものではありません.

データの取り扱い・プライバシー方針
第1章

メールと一般テキスト

本ツールは,自動収集ボットからメールアドレスや電話番号を隠すための変換コードを生成します.操作パネルでは,「メールリンク作成 (mailto)」と「一般テキスト / 電話番号」の2つのモードを選択できます.メールリンク作成モードを選択し,隠蔽するメールアドレスに「info@example.com」,表示するリンク名に「お問い合わせはこちら」と入力した場合,出力されるのはHTMLの <a> タグを含んだコードです.

このとき,入力されたアドレスには自動的に mailto: が付与されて処理されます.一方,一般テキストモードを選択した場合は,「03-1234-5678」などの入力文字列そのものを変換対象とし,リンクを生成しません.リンク名は設定できず,入力値がそのまま変換対象となります.

フォームに入力されたこれらの変換対象データは,ブラウザ内のJavaScriptを用いて動的に文字列処理にかけられます.サイト全体としての通信内容とは別に,この入力対象の難読化変換自体はブラウザ内で完結する仕組みを用いています.しかし,生成されるコードはあくまで元の文字列を異なる表記にした可逆的な表現にすぎません.

そのため,暗号化としての強度は全くなく,秘密情報の保護やスパムの到着を防止する機能は備えていません.出力された結果が,どのような形式で実行されるかを理解して利用する必要があります.

第2章

文字参照の出力

難読化アルゴリズムの一つとして「HTML数値文字参照」を用意しています.この方式は,入力された文字のUnicodeコードポイントを取得し,それを16進数のHTMLエンティティ(&#x...;)に変換します.実装上では,codePointAt(0) を用いてサロゲートペアを考慮したコードポイント値を取得し,それを文字列として連結しています.

例えば「info@example.com」の場合,「i」は &#x69; となり,以降の文字も順次変換されて出力コードが形成されます.メールリンクモードでは,リンク名として入力した「お問い合わせはこちら」の & や < などの特殊文字が &amp; や &lt; へHTMLエスケープされた上で,<a> タグの href 属性に文字参照が埋め込まれます.

この方式の最大の特徴は,文字の復元にJavaScriptの実行を必要としない点です.ブラウザはHTMLをパースする段階で文字参照を本来の文字として解釈し,画面にレンダリングします.そのため,JavaScriptが無効化された環境でも正しく表示されます.しかし,これは単純な置き換え処理であるため,HTMLを解析する一般的な収集プログラムであっても容易に文字列を復元できる仕様です.

難読化の度合いとしては初歩的なものにとどまります.

第3章

コードポイントとBase64

より複雑な表現として,「JS String.fromCodePoint」と「Base64 デコードスクリプト」の2つのJavaScript方式を提供しています.コードポイント方式では,文字列を1文字ずつ分割し,そのコードポイントをカンマ区切りの数値として出力します.

例えば,String.fromCodePoint(105,110,102,111...) のようなJavaScriptの式が生成され,実行時に再構築されます.Base64方式では,入力文字列を TextEncoder を用いてUTF-8のバイト配列(Uint8Array)に変換し,それを String.fromCharCode でバイナリ文字列化した後に btoa 関数でBase64エンコードします.

実行時には,atob と TextDecoder を組み合わせて元の文字列に動的展開します.これらの方式をメールリンクモードで利用する場合,<a> タグの直後に <script> タグが配置され,document.currentScript.previousElementSibling.href を用いてDOM要素のリンク先プロパティを書き換えます.

一般テキストモードの場合は,document.currentScript.before(document.createTextNode(...)) を用いて,スクリプトタグ自身の直前にテキストノードを挿入します.これにより,出力コード内にHTMLタグが含まれていた場合でも,文字列として扱われ意図しないタグの実行を防ぎます.

第4章

ROT13と可逆性

4つ目の変換方式である「ROT13 文字置換」は,アルファベットのAからZ,およびaからzをそれぞれ13文字分ずらす古典的な換字式の手法です.例えば「A」は「N」に,「i」は「v」に置き換わります.このツールにおけるROT13の実装は,JavaScriptの正規表現 /[a-z]/gi を使用してASCII英字のみを置換対象としています.

日本語の文字や数字,記号(アットマークやハイフンなど)は置換されず,そのまま維持されます.出力されるコードは,置換後の文字列リテラルに対して,再度同じ13文字のローテーション関数 .replace(/[a-z]/gi, ...) を適用して元の文字列に戻す処理を含みます.

また,文字列リテラル内の < や > は \u003c や \u003e のようにエスケープされ,スクリプト終了タグによるパースエラーを防いでいます.重要な点として,ROT13を含む本ツールのすべての変換方式は,元の文字列の復元を目的とする「可逆性」を持っています.

ハッシュ関数のような不可逆な処理ではないため,出力されたコードから元のデータを復元することは容易です.機密性の高い情報を隠蔽する目的には不適切です.

第5章

表示プレビューと実行の差

画面右側の「難読化コード出力」パネルには,「難読化コード」と「ブラウザプレビュー」の2つのタブが存在します.「難読化コード」タブのテキストエリアには,選択した方式に従って生成されたHTMLやJavaScriptのコードがそのまま出力されます.このコードはコピーボタンからクリップボードに取得でき,すぐに利用可能です.

一方の「ブラウザプレビュー」タブは,生成された難読化コードを実際に実行して動作確認を行うサンドボックス環境ではありません.ここには,入力された「隠蔽するメールアドレスに設定したリンク名」または一般テキストの入力値が,単純なテキストとして表示されるだけです.つまり,プレビュー画面内においては,出力されたJavaScriptコードの評価や,リンククリックによるメールアプリの起動などは一切行われません.

これは,入力した内容がユーザーの想定通りであるかを視覚的に確認するための機能です.実際にコードがどのようにブラウザで解釈されDOMに反映されるかは,ユーザーがコードを自身のWebサイトのHTMLに貼り付け,ブラウザで読み込んだ際に初めて確定します.ツール上でのプレビューと実際の実行プロセスには明確な違いがあります.

第6章

貼付け確認と収集対策の限界

生成されたコードを実際のWebサイトに貼り付ける際は,対象サイトの環境やセキュリティ要件に注意が必要です.特にJavaScriptを使用する方式(String.fromCodePoint,Base64,ROT13)を選択した場合,コード内にはインラインスクリプト(<script>...</script>)が含まれます.

貼り付け先のWebサイトにおいて,コンテンツセキュリティポリシー(CSP)がインラインスクリプトの実行を制限している場合,復元コードの実行はブロックされ,画面に何も表示されないかエラーが発生します.また,一部のブログサービスやCMSのテキストエディタでは,セキュリティ上の理由から入力された <script> タグを自動的に削除,またはエスケープして無効化することがあります.

その場合,ブラウザの開発者ツールでDOMツリーを確認し,テキストノードが正しく追加されているか検証する必要があります.さらに,スパムボット対策としての限界も認識しなければなりません.近年の高度な収集プログラムは,ヘッドレスブラウザを用いてJavaScriptを実行し,DOMが完成した後のページ内容を読み取ります.

このようなプログラムに対しては難読化を解除されてしまうため,自動収集の対策として機能しないケースが存在します.

よくある質問(FAQ)

A.
できません.Base64や文字コード表現は元に戻せます.パスワードやAPIキーの保護には使わないでください.
A.
実行しません.復元される文字列を表示します.コピーしたコードは貼り付け先のHTML・JavaScriptの設定に従って動作します.
A.
できません.可逆的な変換を用いており,高度な収集ボットはJavaScriptを実行して復元可能です.スパム対策を確約するものではありません.
A.
入力対象の変換はすべて利用者のブラウザ内で行われます.ただし,これによってサイト全体の通信や他の機能における安全性を断定するものではありません.