web-dev-qa-db-ja.com

Webサイトの電子メールアドレスを難読化する最良の方法は?

過去数日間、個人のWebサイトの更新に取り組んできました。私の個人的なWebサイトのURLは(私の名)。(私の姓).comです。これは私の姓がかなり珍しいため、幸運にもドメイン名を取得できたからです。私の電子メールアドレスは(私の名)@(私の姓).comです。それで、本当に、それが推測することになったとき、それはそれほど難しくありません。

とにかく、mailto:リンクをWebサイトに統合して、人々が私に連絡できるようにします。そして、私の電子メールアドレスを推測するのはそれほど難しくありませんが、電子メールアドレスパターンを求めてWebサイトをクロールし、それらをデータベースに追加するだけのスパムボットによって収集されるのは避けたいです。

電子メールアドレスを、できればリンク形式で難読化する最良の方法は何ですか?私が知っている方法は次のとおりです。

<a href="mailto:[email protected]">e-mail me</a>

動作しますが、ウェブサイトがGoogleにアクセスするとすぐに、スパムボットが簡単に電子メールアドレスを選択するため、スパムを回避することを意味します。

<img src="images/e-mail.png" />

訪問者がクリックして電子メールを送信できないだけでなく、より賢いスパムボットが画像に含まれる文字を検出できる可能性があるため、これはあまり望ましくありません。

おそらく完璧な解決策はないことは知っていますが、誰もが最高だと思うことをただ考えていました。私のウェブサイトは既に大量のJavaScriptを使用しているため、必要に応じてJavaScriptを使用することは間違いありません。

127
Adam Rezich

文字をHTMLエンティティとしてエンコードします( このようなもの )。 JSを有効にする必要はなく、ほとんどのスパムを阻止したようです。スマートボットはまだそれを収穫する可能性があると思いますが、問題はありませんでした。

99
chroder

個人的に、私は自分のメールアドレスを隠すことをあきらめました。難読化を心配するよりも、優れたスパムフィルタリングソリューションを調べる方が簡単です。住所を難読化する最良の方法を見つけるために何日も費やすことができます。その後、1人のユーザーが住所をスパマーに販売するだけで、その作業はすべて無駄になります。

81
Chad Birch

現在受け入れられている解決策は、ユーザーがメールを送信できる連絡先フォームを作成することです。そのサイトから大量のスパムを受け取った場合(私は自分のサイトにはありません)、適切な方法でキャプチャを追加することができます。

問題の事実は、ユーザーがクリックしてリンクを提供し、To:フィールドに自分のアドレスが表示された電子メールクライアントを開くことができる場合、コンピューターはページから電子メールアドレスを解読できるためです。スパムボット。

67
JoshJordan

これはあなたの個人的なウェブサイトのためだと述べました。私の個人サイト(たとえば、bobsomers.com)には、次のような段落があります。

新しいサイトが立ち上がる前に私と連絡を取るための最良の方法は、私にメールを送ることです。私のメールアドレスはこのウェブサイトでの私の名前です。そのヒントからそれを理解できない場合は、よく、あなたは私のアドレスを理解するよりも挑戦の多くの電子メールを見つけるかもしれません。

私は常に正当なメールを受け取っているので、人々はそれをうまく理解できるようです。最良のソリューションでは、コードを書く必要がない場合があります。 :)

43
Bob Somers

reCAPTCHA はシンプルな メール難読化サービス を提供します。アカウントを設定する必要はなく、すぐに使用を開始できます。このサービスは、リンクまたはポップアップとして使用できます。

キャプチャが解決されると、メールアドレスはhref/mailtoとして表示されるため、ブラウザで動作するようにメールクライアントを設定したユーザーがクリック/フォローすることができます。

36
Rich Apodaca

どうやら CSSを使用してテキストの方向を変更する は非常にうまく機能しています。このリンクには、他の難読化方法のテストもあります。

使用するものはすべて、必然的に打ち負かされます。主な目的は、ユーザーの煩わしさを回避することです。

14
Brian Carper

アンカーのhrefを難読化する簡単な方法は、base64エンコードすることです。

> btoa('mailto:[email protected]')
< "bWFpbHRvOmVtYWlsQGV4YW1wbGUuY29t"

そして、ハードコードされたものを含めます:

<a href="javascript:window.location.href=atob('bWFpbHRvOmVtYWlsQGV4YW1wbGUuY29t')">E-Mail</a>

または動的にサーバー側PHPの場合:

<a href="javascript:window.location.href=atob('<?= base64_encode("mailto:[email protected]") ?>')">E-Mail</a>

文字列復帰との組み合わせでは、かなりスパムを保存する可能性があります。

<a href="javascript:window.location.href=atob('<?= base64_encode("mailto:[email protected]") ?>')" style="unicode-bidi: bidi-override; direction: rtl;"><?= strrev("[email protected]") ?></a>
13
Fabio Poloni

ここでは難読化手法を使用しないでください。これはおそらく、電子メールハーベスターが人々がどのように電子メールを難読化しているかを調べるための最初の場所だからです。サイトで自分のメールアドレスを表示する必要がある場合は、他人の方法をそのままコピーするだけではいけません。他のサイトでは使用されていない独自の方法で難読化して、サイトを訪れる前に収穫者がメソッドを知らないようにします。

13
Sam Hasler

GoogleがGoogleコード(およびグループ)で行うようにできます。メールの一部とクリック可能な部分( "...")を表示します。クリックすると、メールを知りたいことを示し、キャプチャを入力するように求められます。その後、電子メール(および他のユーザー)が表示されます。

8
Ross

私のものは実際には簡単です:

<h3 id="email">[email protected]</h3><!-- add a fake email -->


    $(document).ready(function(){
//my email in reverse :)
            var s = '[email protected]';
            var e = s.split("").reverse().join("");
            $('#email').html('<a href="mailto:'+e+'">'+e+'</a>');
    });
7
keithics

私が管理しているWebサイトの1つでは、スパムロボットを(できれば)排除するために、やや単純なJavaScriptを使用しています。

電子メールリンクはJS関数を呼び出します。

 function sendEmail(name、domain){
 location.href = 'mailto:' + name + '@' + domain; 
} 

JSが有効になっているユーザーのみがリンクを表示できるようにするには、次のように記述します。

 function writeEmailLink(realName、name、domain){
 document.write( '<a href = "javascript:sendEmail(\' '
 + name +'\'、\ '' +ドメイン+ '\') "> '); 
 document.write(realName); 
 document.write(' </a> '); 
} 

1つのJS関数を使用して別のJS関数を呼び出すリンクを書き出すということは、2つの保護層があることを意味します。

6
Stewart

私はJavaScriptの難読化を使用しています。たとえば、これを見てみましょう。

http://www.jottings.com/obfuscator/

6
Codebrain

上記のポスターが言ったように、私は jottings website からのJavaScript難読化も使用しています。

Webページは、改善可能なJavaScriptを生成します。 mailto:テキスト文字列は明確であり、ロボットによって識別可能です(この文字列を見つけてこの文字列を不明瞭化しない可能性があります)が、jottings.com Webページに入ると、mailto:[email protected]の代わりに[email protected]という形式のメールアドレスが入力され、テキストmailto:が削除されます生成されたJavaScriptには、電子メールとはまったく関係がないように見えるJavaScriptが突然あります。WebがいっぱいのJavaScriptだけです。リンクテキストを削除することで、これをさらに改善することができます-私はかなりあいまいなフォントのメールアドレスの画像に置き換えました。次に、jottings.comでこのメソッドが一般的になった場合に備えて、出力JavaScriptの変数名をランダム化して、ロボットがJavaScriptコードを生成したjottingsのインスタンスを見つけにくくしました。

明らかに、これらの改善のいくつかは、メモ自体のメカニズムに組み込むことができ、コードは公開されているため、これは比較的簡単です。

例は、これをもう少し明確にするかもしれません。上記のリンクでJottings Obfuscatorを使用してmailto:[email protected]をあいまいにしています(mailto:[email protected]の代わりに文字列[email protected]を入力することで、Jotts Webサイトの本来の意図を欺いています)。

<script type="text/javascript" language="javascript">
<!--
// Email obfuscator script 2.1 by Tim Williams, University of Arizona
// Random encryption key feature by Andrew Moulden, Site Engineering Ltd
// This code is freeware provided these four comment lines remain intact
// A wizard to generate this code is at http://www.jottings.com/obfuscator/
{ coded = "3A1OTJ:[email protected]"
  key = "J0K94NR2SXLupIGqVwt8EZlhznemfaPjs7QvTB6iOyWYo3rAk5FHMdxCg1cDbU"
  shift=coded.length
  link=""
  for (i=0; i<coded.length; i++) {
    if (key.indexOf(coded.charAt(i))==-1) {
      ltr = coded.charAt(i)
      link += (ltr)
    }
    else { 
      ltr = (key.indexOf(coded.charAt(i))-shift+key.length) % key.length
      link += (key.charAt(ltr))
    }
  }
document.write("<a href='mailto:"+link+"'>Send Me Email</a>")
}
//-->
</script><noscript>Sorry, you need Javascript on to email me.</noscript>

それを取り戻したら、エディターに貼り付けて、次のようにします。

  1. mailto:を削除します
  2. リンクテキストをメールアドレスの画像へのポインターに置き換えます
  3. すべての変数の名前を変更します
  4. 「noscript」セクションをメールアドレス画像への別のリンクに置き換えます

私はこれで終わります:

<script type="text/javascript" language="javascript">
<!--
// Email obfuscator script 2.1 by Tim Williams, University of Arizona
// Random encryption kkeoy feature by Andrew Moulden, Site Engineering Ltd
// This kudzu is freeware provided these four comment lines remain intact
// A wizard to generate this kudzu is at http://www.jottings.com/obfuscator/
{ kudzu = "3A1OTJ:[email protected]"
  kkeoy = "J0K94NR2SXLupIGqVwt8EZlhznemfaPjs7QvTB6iOyWYo3rAk5FHMdxCg1cDbU"
  shift=kudzu.length
  klonk=""
  for (variter=0; variter<kudzu.length; variter++) {
    if (kkeoy.indexOf(kudzu.charAt(variter))==-1) {
      lutu = kudzu.charAt(variter)
      klonk += (lutu)
    }
    else {
      lutu = (kkeoy.indexOf(kudzu.charAt(variter))-shift+kkeoy.length) % kkeoy.length
      klonk += (kkeoy.charAt(lutu))
    }
  }
document.write("<a href='"+klonk+"'><img src='contactaddressimage.png' alt='Send Me Email' border='0' height='62' width='240'></a>")
}
//-->
</script>
<noscript>
    <img src="contactaddressimage.png" border="0" height="62" width="240">
    <font face="Arial" size="3"><br>&nbsp;</font></p>
</noscript>
4
Al Whaley

私はこれがどれほどうまくいくかわかりません。メールアドレスを除外せず、ページの読み込みが完了したらAJAX呼び出しを使用して読み込むようにしてください。スパムボットが変更されたHTMLを取得できるかどうか、または他のHTTPトラフィックをリッスンして、電子メールアドレスを選択しようとするか、最初に受信したときにページをスキャンするだけの場合。

3
uriDium

ある男は、ページにメールアドレスを表示する9つの方法をテストし、ブログで 公開結果 をテストしました。

彼の3つの最良の方法は次のとおりです。

  1. CSSでコードの方向を変更する
  2. CSS display:noneの使用
  3. ROT13暗号化

警告-これは2年前に投稿されました。スパムボットはより賢くなったかもしれません。

2
Doug Harris

別のアプローチとして、JavaScriptフレームワークを使用し、データ/モデルをHTML要素にバインドする方法があります。 AngularJSの場合、HTML要素は次のように記述されます。

<a href="mailto:{{contactEmail}}"><span>{{contactEmail}}</span></a>

補間{{data}}バインディングは、実際の電子メール値を含むスコープ変数を使用します。さらに、次のようにメールのデコードを処理するフィルターを使用することもできます。

<a href="mailto:{{contactEmail | decode}}"><span>{{contactEmail | decode}}</span></a>

利点は、HTMLの記述方法にあります。欠点は、スクリプトのサポートが必要なことです。

ちょうど別のアプローチ。

1
ozkary

PHPを使用している場合は、それを自動的に行う無料のスクリプトを入手できます。 「プライベートパパ」と呼ばれ、独自のオンラインオーディオストリーミングサービスに使用します。 1行のコードで、そのまま使用できます...取得できます here

1
Reuven

Ajax呼び出しソリューション

すべてのロボットは毎日よりインテリジェントであるため、ウェブサイトにフォームを作成し、メールアドレスを表示しないのが最善ですが、ウェブサイトにメールアドレスを表示する必要がある場合は、ajax呼び出しで作成できますサーバー、クリックで表示します。

[〜#〜] html [〜#〜]

_<a class="obfmail" href="#" rel="info">click here to show email address</a>
_

または

_<a class="obfmail" href="#" rel="info">
    <img src="img/click-to-show-email.jpg">
</a>
_

jQuery

_$(document).one'click', '.obfmail', function(e) {
    e.preventDefault();
    a = $(this);
    addr = a.attr('rel');
    $.ajax({
        data: { 
            email: addr
        },
        url : "/a/getemail",
        type: "POST",
        dataType: 'json',
        success: function(data) {
            a.html(data.addr);
            a.attr('href', 'mailto:' + data.addr);
        }
    });
});
_

[〜#〜] php [〜#〜]

_if($_POST['email']) {
    ...
    return json_encode(array(
        code     => '200',
        response => 'success',
        addr     => '[email protected]'
    ));
}
_

セキュリティを強化するために、この$(document).one('click', '.obfmail', function(e) {のように_.on_で_.one_を変更するか、またはajax呼び出しでデータに渡すPHP生成されたトークンを使用して、このようなajax関数の呼び出し:

html:_<a class="obfmail" href="#" rel="info" token="w3487ghdr6rc">_

jquery:

_...
addr = a.attr('rel');
tkn  = a.attr('token');
$.ajax({
    data: { 
        email: addr,
        token: tkn
    }, ...
_

返されたメールアドレスをエンコードしたり、逆にしたりすることもできます。

電話番号でも問題ありません!

1
Meloman

正直なところ、mailtoが本当にあなたが使いたいものであるかどうかの質問をした場合、あなたの問題は無意味かもしれません。たとえば、Webメールを使用する人や、ブラウザに適切なメールクライアントが設定されていない人の多くは、mailtoの恩恵を受けられません。ユーザーの大部分が機能しない機能のメールアドレスを公開しています。

代わりにできることは、フォームを使用して電子メールをバックグラウンドで送信することです。これにより、電子メールアドレスが非表示になり、mailtoの恩恵を受けない貧しい人々を心配する必要がなくなります。

0
Brad Barker

JQueryを使用しますが、必要に応じてプレーンJSに簡単に移植できます。次のHTMLブロックを使用します。私が提供したこの例は、tel:電話のリンク。

<a class="obfuscate" 
 href="mailto:archie...trajano...net">
 archie...trajano...net
</a>
<a class="obfuscate"
 href="tel:+One FourOneSix-EightFiveSix-SixSixFiveFive">
 FourOneSix-EightFiveSix-SixSixFiveFive
</a>

javaScriptを使用して適切なリンクに変換します。

 $( "。obfuscate")。each(function(){
 
 $(this).html($(this).html()
。 replace( "..."、 "@")。replace(/\.\.\./ g、 "。")
。replace(/ One/g、 "1")
 .replace(/ Two/g、 "2")
。replace(/ Three/g、 "3")
。replace(/ Four/g、 "4")
。replace(/ Five/g、 "5")
。replace(/ Six/g、 "6")
。replace(/ Seven/g、 "7")
。replace(/ Eight/g、 "8")
。replace(/ Nine/g、 "9")
。replace(/ Zero/g、 "0")) 
 
 $(this).attr( "href"、$(this).attr( "href")
。replace( "..."、 "@") .replace(/\.\.\./ g、 "。")
。replace(/ One/g、 "1")
。replace(/ Two/g、 "2" )
。replace(/ Three/g、 "3")
。replace(/ Four/g、 "4")
。replace(/ Five/g、 "5 ")
。replace(/ Six/g、" 6 ")
。replace(/ Seven/g、" 7 ")
。replace(/ Eight/g、" 8 ")
。replace(/ Nine/g、" 9 ")
。replace(/ Zero/g、" 0 "))
 
}) 

ここで詳細に文書化しました https://trajano.net/2017/01/obfuscating-mailto-links/

難読化/難読化アルゴリズムは非常に単純なので、どちらを書くのにも負担がかかりすぎません(base64解析の必要はありません)

0
<!-- Multi-Email Obfuscator  -->
<!-- step 1: &#064; = @  -->
<!-- step 2: a scrap element  -->
<!-- step 3: ROT13 encode for .com  -->
info<!-- step 1 -->&#064;<!-- step 2 --><b style="display:none">my</b>domain<!-- step 3 --><script>document.write(".pbz".replace(/[a-zA-Z]/g,function(c){return String.fromCharCode((c<="Z"?90:122)>=(c=c.charCodeAt(0)+13)?c:c-26);}));</script>
0
PHC

この解決策はどこにも言及されていませんが、私にとってはうまくいきます:

私はこれをします:

  • 偽のメールを含むmailtoリンクを作成します。明らかな理由で[email protected]が好きです。このアドレスを使用しない場合、スパマーは自分のボットネットをスパムする可能性があります。

  • 実際のメールアドレスを暗号化し、無関係だが見つけやすい隠されたスパンまたはあなたが好きな要素に入れてください。明らかに、電子メールを難読化し、ハーベスターから隠します。プロジェクト構造に応じて、JSまたはSession変数に配置することもできます。

  • 1秒後にこれらのリンクのクリックハンドラーを作成して解読し、デフォルトを妨げないように偽のmailtoリンクに正しいメールアドレスを書き込みます。クローラーがmailtoリンクをクリックすることはないと思いますが、もしそうなら、彼らは1秒も待つことはありません。

これで、完全に機能するが、難読化された、ハニーポットで、時間で保護されたmailtoリンクができました。

作業例のphpファイル:

<html>
<head>
<title>E-Mail Obfuscating</title>
</head>
<body>
<?php
$email = "[email protected]";
echo "<a class='emailLink' href='mailto:[email protected]' >Send me an e-mail!</a>"
    ."<span style='display:none' data-hash='" . base64_encode($email) . "' />";
?>
<script>
<!--
var emailLinks = document.getElementsByClassName("emailLink");
setTimeout(function() {
    for(var i=0; i <emailLinks.length; ++i){
        emailLinks[i].addEventListener("click", function(){
            let encodedEmail = this.nextSibling.getAttribute('data-hash');
            let decodedEmail = atob(encodedEmail);
            this.href = "mailto:" + decodedEmail;
            this.text = decodedEmail;
        });
    }
}, 1000);

-->
</script>
</body>
</html>

コードがあなたと共にありますように。

0
mondjunge

サイトで「私の電子メールアドレスは(私の名)@(私の姓).com。」と言い、あなたの名と姓がかなり明白な場合、それが最高のスパム保護のようですあなたが得るつもりです。

0
Dean J

Cloudflareは現在、無料で提供しています メール難読化サービス 。これは、Cloudlfareを使用する場合のオプションです。

0
alljamin

誰かがRailsを使用している場合、actionview-encoded_mail_to gem。 ( https://github.com/reed/actionview-encoded_mail_to

いくつかのオプションがあります。

:encode-このキーは、文字列「javascript」または「hex」を受け入れます。 「javascript」を渡すと、mailtoリンクが動的に作成およびエンコードされ、ページのDOMに評価されます。ユーザーがJavaScriptを無効にしている場合、このメソッドはページにリンクを表示しません。 「hex」を渡すと、mailtoリンクを出力する前にemail_addressが16進エンコードされます。

:replace_at-リンク名が指定されていない場合、リンクラベルにemail_addressが使用されます。このオプションを使用して、値として指定された文字列で@記号を置き換えることにより、email_addressを難読化できます。

:replace_dot-リンク名が指定されていない場合、リンクラベルにemail_addressが使用されます。このオプションを使用して、を置き換えることでemail_addressを難読化できます。値として指定された文字列を含む電子メール。

0
chug2k