Web ページ上の電子メール アドレスをボットから保護するには?
-
03-07-2019 - |
質問
Web ページに電子メール アドレスを配置する場合、次のようにテキストとして配置しますか?
joe.somebody@company.com
それとも巧妙なトリックを使ってメール アドレス収集ボットを騙そうとするのでしょうか?例えば:
HTML エスケープ文字:
joe.somebody@company.com
JavaScript 復号化ツール:
function XOR_Crypt(EmailAddress)
{
Result = new String();
for (var i = 0; i < EmailAddress.length; i++)
{
Result += String.fromCharCode(EmailAddress.charCodeAt(i) ^ 128);
}
document.write(Result);
}
XOR_Crypt("êïå®óïíåâïäùÀãïíðáîù®ãïí");
人間によるデコード:
joe.somebodyNOSPAM@company.com
joe.somebody AT company.com
何を使っていますか?それとも気にしていますか?
解決
私は一般的に気にしません。私は、毎日数千のスパムを受け取ったメーリングリストに登録していました。スパムフィルター(spamassassin)では、1日に1〜2通します。フィルターがこれほど優れているのに、なぜ正当な人があなたに連絡するのを難しくするのですか?
他のヒント
独自のクレイジーな電子メールアドレス難読化スキームを作成します。よく知られている方法のいずれかにあまり似ていない限り、それが何であるかは実際には関係ありません。
問題は、これに対する良い解決策が実際にないことです。それらはすべて、比較的簡単にバイパスするか、むしろユーザーをいらいらさせます。いずれかの方法が普及した場合、誰かがその方法を 見つけるでしょう。
そのため、One Trueの電子メールアドレスの難読化手法を探すのではなく、独自の電子メールアドレスを難読化します。これらのボットの作成者は、あなたのサイトを気にせずに、CSSと要素の境界線を含むややクレイジーなレンダリングテキストや、完全に奇妙な、簡単にクラックされるJavaScript暗号化をバイパスすることを考えないという事実を期待してください。些細なことでも構いません。迷惑メールを送信するために迷惑メールをバイパスしようとする人はいません。
エンコーダ(ソース)は、考えられるあらゆる種類の解析トリックを使用しています(さまざまな種類のHTMLエンティティ、URLエンコーディング、コメント、複数行の属性、ソフトハイフン、mailtoの非自明な構造:URLなど)
すべてのハーベスターを停止するわけではありませんが、OTOHは完全に標準に準拠しており、ユーザーに対して透過的です。
別のIMHOの優れたアプローチ(トリッキーなエンコーディングに加えて使用できます)は、次の行に沿っています:
<a href="mailto:userhatestogetspam@example.com"
onclick="this.href=this.href.replace(/hatestogetspam/,'')">
reCAPTCHAでメールアドレスを保護できます。無料サービスを提供しているので、人々はCAPTCHA(Computers and Humans Apartに伝えるための完全に自動化された公開チューリングテスト)を入力してメールを見る必要があります: /www.google.com/recaptcha/admin#mailhide "rel =" noreferrer "> https://www.google.com/recaptcha/admin#mailhide
私は気にしません-それは間違ったレベルでスパム戦争と戦っています。特に会社のWebサイトでは、ページにmailtoハイパーリンクがあるストレートテキスト以外のものがあると、物事が非常に専門的でないように見えると思います。
非常に多くのスパムが飛び交っているので、とにかく優れたフィルタリングが必要であり、ボットはいずれにせよすべての一般的なトリックを理解することになります。
HTML:
<a href="#" class="--mailto--john--domain--com-- other classes goes here" />
JavaScript、 jQuery を使用:
// match all a-elements with "--mailto--" somehere in the class property
$("a[class*='--mailto--']").each(function ()
{
/*
for each of those elements use a regular expression to pull
out the data you need to construct a valid e-mail adress
*/
var validEmailAdress = this.className.match();
$(this).click(function ()
{
window.location = validEmailAdress;
});
});
気にしません。洗練されたユーザーだけを悩ませ、洗練されていないユーザーを混乱させます。他の人が言ったように、Gmailは個人/中小企業のドメインに対して非常に効果的なスパムフィルターを提供し、企業フィルターも一般的に非常に優れています。
同様の質問に対する私の回答:
CSSとjQueryの非常に単純な組み合わせを使用して、 ユーザーへのメールアドレスが正しく、アンカーが クリック:
HTML:
<a href="mailto:me@example.spam" id="lnkMail">moc.elpmaxe@em</a>
CSS:
#lnkMail { unicode-bidi: bidi-override; direction: rtl; }
jQuery:
$('#lnkMail').hover(function(){ // here you can use whatever replace you want var newHref = $(this).attr('href').replace('spam', 'com'); $(this).attr('href', newHref); });
こちらは実用例です。
最も安全な唯一の方法は、当然のことながら、そもそもウェブページにメールアドレスを載せないことです。
代わりに連絡先フォームを使用してください。すべての電子メールアドレスをデータベースに入れ、ユーザーがフォームに記入する電子メールの内容を送信するHTMLフォーム(件名、本文、送信元...)を作成します(使用するIDまたは名前とともに)データベース内のその人のメールアドレスを検索して、サーバー側のスクリプトを参照して、指定された人にメールを送信します。電子メールアドレスは決して公開されません。おそらく、スパムボットを阻止するために何らかの形のCAPTCHAを実装する必要があります。
メールアイコンジェネレーターをお試しください。 http://services.nexodyne.com/email/
もちろん、これを取得する可能性のあるOCRボットがいくつかあります。
whateverDOC@whatever.comを作成し、その横に「大文字を削除」と書きます
無料のGmailには素晴らしいスパムフィルターが備わっています。
Gmail を直接使用したくない場合は、電子メールを Gmail に送信し、スパム フィルターを通過した後で Gmail 転送を使用して返送することができます。
より複雑な状況では、@business.com アドレスを表示する必要がある場合、public@business.com を表示して、このすべてのメールを Gmail アカウントに転送し、その後、そのメールが real@business.com に返送されるようにすることができます。
あなたの質問に対する直接の解決策ではないと思いますが、役立つかもしれません。Gmail は無料であり、非常に優れたスパム フィルターを備えているため、Gmail を使用するのは非常に賢明な選択だと思います。
私の Gmail アカウントには 1 日に約 100 件のスパムが届きますが、そのうちの 1 つが最後に受信箱に届いたのがいつだったか思い出せません。
要約すると、Gmail であろうと他のものであろうと、適切なスパム フィルターを使用してください。表示された電子メール アドレスをユーザーに再入力または変更させることは、著作権侵害から保護するために DRM を使用するようなものです。「善良な」人に負担を押し付けることは、何をするにも間違ったやり方であるべきではありません。:)
自分のメールアドレスについては、あまり気にしないことをお勧めします。メールアドレスを何千人ものユーザーが利用できるようにする必要がある場合は、Gmailアドレス(バニラまたはGoogleアプリ経由)を使用するか、高品質のスパムフィルターを使用することをお勧めします。
しかし、あなたのウェブサイトに他のユーザーのメールアドレスを表示するときには、ある程度のデューデリジェンスが必要だと思います。幸いなことに、Silvan M&#252; hlemannという名前のブロガーはあなたのためにすべての困難な作業を行いました。彼は1.5年にわたってさまざまな難読化方法をテストし、最良の方法を決定しました。そのほとんどは、ブラウザーでアドレスを正しく表示できるが自動スクレーパーを混乱させるCSSまたはJavaScriptトリックを含んでいます。
別の、おそらくユニークな手法は、複数の画像といくつかのプレーンテキスト文字を使用して住所を表示することです。それはボットを混乱させる可能性があります。
電子メールアドレスをpngファイルに保存するスクリプトは、安全なソリューションです(十分なスペースがあり、ページに画像を埋め込むことが許可されている場合)
これは私たちが使用するものです(VB.NET):
Dim rxEmailLink As New Regex("<a\b[^>]*mailto:\b[^>]*>(.*?)</a>")
Dim m As Match = rxEmailLink.Match(Html)
While m.Success
Dim strEntireLinkOrig As String = m.Value
Dim strEntireLink As String = strEntireLinkOrig
strEntireLink = strEntireLink.Replace("'", """") ' replace any single quotes with double quotes to make sure the javascript is well formed
Dim rxLink As New Regex("(<a\b[^>]*mailto:)([\w.\-_^@]*@[\w.\-_^@]*)(\b[^>]*?)>(.*?)</a>")
Dim rxLinkMatch As Match = rxLink.Match(strEntireLink)
Dim strReplace As String = String.Format("<script language=""JavaScript"">document.write('{0}{1}{2}>{3}</a>');</script>", _
RandomlyChopStringJS(rxLinkMatch.Groups(1).ToString), _
ConvertToAsciiHex(rxLinkMatch.Groups(2).ToString), _
rxLinkMatch.Groups(3), _
ConvertToHtmlEntites(rxLinkMatch.Groups(4).ToString))
Result = Result.Replace(strEntireLinkOrig, strReplace)
m = m.NextMatch()
End While
and
Public Function RandomlyChopStringJS(ByVal s As String) As String
Dim intChop As Integer = Int(6 * Rnd()) + 1
Dim intCount As Integer = 0
RandomlyChopStringJS = ""
If Not s Is Nothing AndAlso Len(s) > 0 Then
For Each c As Char In s.ToCharArray()
If intCount = intChop Then
RandomlyChopStringJS &= "'+'"
intChop = Int(6 * Rnd()) + 1
intCount = 0
End If
RandomlyChopStringJS &= c
intCount += 1
Next
End If
End Function
Renderをオーバーライドし、出て行く前にこれを介して発信HTMLを実行します。これにより、通常ブラウザに表示されるメールアドレスが表示されますが、ソースでは次のようになります。
<script language="JavaScript">document.write('<a '+'clas'+'s='+'"Mail'+'Link'+'" hr'+'ef'+'="ma'+'ilto:%69%6E%66%6F%40%62%69%63%75%73%61%2E%6F%72%67">info@bicusa.org</a>');</script>
明らかに確実な方法ではありませんが、訪問者にとって物事を難しくすることなく、ある程度の収穫を減らすことを願っています。
それはまさにあなたのニーズが何であるかに依存します。私が仕事をしているほとんどのサイトでは、「私に連絡してください」と入力する方がはるかに便利であることがわかりました。システムから連絡が必要な人にメールを送信するフォーム。これはまさにあなたが求めている解決策ではないことを知っていますが、それは収穫から完全に保護します。それは起こりますが、それは非常にまれであり、収穫されることはありません。
これにより、メッセージを送信する前にログに記録する機会が得られ、必要に応じて、連絡先の損失に対する保護をさらに強化できます。
スパムボットには、独自のJavascriptおよびCSSエンジンが今後搭載されるため、この方向に目を向けるべきではないと思います。
オプション1:電子メールアドレスを複数の部分に分割し、これらの部分からJavaScriptで配列を作成します。 次に、これらのパーツを正しい順序で結合し、.innerHTMLプロパティを使用してWebページにメールアドレスを追加します。
<span id="email"> </span> // blank tag
<script>
var parts = ["info", "XXXXabc", "com", ".", "@"];
var email = parts[0] + parts[4] + parts[1] + parts[3] + parts[2];
document.getElementById("email").innerHTML=email;
</script>
オプション2:メールテキストの代わりに画像を使用する
テキストからの画像作成者のウェブサイト: http://www.chxo.com/labelgen/
オプション3:&quot; @&quot;の代わりにATを使用できます。 &quot;の代わりにDOT 。 &quot;
i.e:
info(AT)XXXabc(DOT)com
次のコードをコーディングしました。良いかどうかはわかりませんが、プレーンテキストでメールを書くよりはましです。多くのロボットはだまされますが、すべてではありません。
<script type="text/javascript">
$(function () {
setTimeout(function () {
var m = ['com', '.', 'domain', '@', 'info', ':', 'mailto'].reverse().join('');
/* Set the contact email url for each "contact us" links.*/
$('.contactUsLink').prop("href", m);
}, 200);
});
</script>
ロボットがこれを解決する場合、「単純なロジック」を追加する必要はありません。 &quot; if(1 == 1? '@': '')&quot;のようなコードまたは、とにかくロボットがコードを評価するだけなので、配列要素を別の順序で追加します。
Font-awesome works!
<link rel="stylesheet" href="path/to/font-awesome/css/font-awesome.min.css">
<p>myemail<i class="fa fa-at" aria-hidden="true"></i>mydomain.com</p>