[英]Best way to obfuscate an e-mail address on a website?
過去幾天我一直在更新我的個人網站。 我個人網站的網址是(我的名字)。(我的姓氏).com,因為我的姓氏比較不尋常,我有幸拿到了域名。 我的電子郵件地址是(我的名字)@(我的姓氏).com。 所以說真的,當它歸結為猜測時,這並不難。
無論如何,我想將 mailto: 鏈接集成到我的網站中,以便人們可以與我聯系。 而且,盡管我的電子郵件地址不是很難猜到,但我寧願它不會被垃圾郵件機器人收集,垃圾郵件機器人只是抓取網站以獲取電子郵件地址模式並將它們添加到他們的數據庫中。
混淆我的電子郵件地址的最佳方法是什么,最好是鏈接形式? 我知道的方法有:
<a href="mailto:x@y.com">e-mail me</a>
它有效,但這也意味着一旦我的網站訪問 Google,我就會在垃圾郵件中涉水,因為垃圾郵件機器人很容易找出我的電子郵件地址。
<img src="images/e-mail.png" />
這不太理想,因為訪問者不僅無法點擊它向我發送電子郵件,而且更智能的垃圾郵件機器人可能能夠檢測到圖像包含的字符。
我知道可能沒有完美的解決方案,但我只是想知道每個人都認為什么是最好的。 如有必要,我絕對願意使用 JavaScript,因為我的網站已經使用了大量的 JavaScript。
我將字符編碼為 HTML 實體(類似這樣)。 它不需要啟用 JS 並且似乎已經阻止了大部分垃圾郵件。 我想智能機器人可能仍然會收獲它,但我沒有遇到任何問題。
就個人而言,我已經放棄隱藏我的電子郵件地址。 我發現尋找更好的垃圾郵件過濾解決方案比擔心混淆更容易。 您可能會花費數天時間試圖找到混淆地址的最佳方法,然后只需一個人將您的地址出售給垃圾郵件發送者,所有這些工作都毫無用處。
當前接受的解決方案是創建一個聯系表單,允許用戶向您發送電子郵件。 如果您從中收到大量垃圾郵件(我沒有在我的網站上),那么您可以添加一個驗證碼以進行良好的衡量,此時您將遠離“低垂的果實”。
事實是,如果您提供一個鏈接,用戶可以單擊該鏈接以在收件人:字段中使用您的地址彈出打開他們的電子郵件客戶端,那么計算機能夠從頁面上破譯電子郵件地址,因此可以垃圾郵件機器人。
您提到這是用於您的個人網站。 在我的個人網站(例如 bobsomers.com)上,我只有一段這樣說:
在新網站上線之前與我取得聯系的最佳方式是給我發送電子郵件。 我的電子郵件地址是我在本網站上的名字。 如果你不能從那個提示中弄清楚,那么,你可能會發現電子郵件比找出我的地址更具挑戰性。
人們似乎能夠很好地解決這個問題,因為我一直收到合法的電子郵件。 有時最好的解決方案不需要編寫任何代碼。 :)
混淆錨點的href
的一種輕量級方法是對其進行 base64 編碼:
> btoa('mailto:email@example.com')
< "bWFpbHRvOmVtYWlsQGV4YW1wbGUuY29t"
然后將其硬編碼:
<a href="javascript:window.location.href=atob('bWFpbHRvOmVtYWlsQGV4YW1wbGUuY29t')">E-Mail</a>
或動態服務器端,例如在 PHP 中:
<a href="javascript:window.location.href=atob('<?= base64_encode("mailto:email@example.com") ?>')">E-Mail</a>
與字符串還原相結合,它可能是非常垃圾郵件保存:
<a href="javascript:window.location.href=atob('<?= base64_encode("mailto:email@example.com") ?>')" style="unicode-bidi: bidi-override; direction: rtl;"><?= strrev("email@example.com") ?></a>
顯然, 使用 CSS 來改變文本的方向效果很好。 該鏈接還測試了一系列其他混淆方法。
無論您使用什么,都不可避免地會被擊敗。 您的主要目標應該是避免惹惱用戶。
我的其實很簡單:
<h3 id="email">hello@gmail.com</h3><!-- add a fake email -->
$(document).ready(function(){
//my email in reverse :)
var s = 'moc.elibomajninbew@htiek';
var e = s.split("").reverse().join("");
$('#email').html('<a href="mailto:'+e+'">'+e+'</a>');
});
請勿在此處使用任何混淆技術,因為這可能是電子郵件收集者首先要找出人們如何混淆電子郵件的地方。 如果您必須在網站上顯示您的電子郵件地址,請不要只是逐字復制其他人的方法; 以某種其他網站沒有使用過的獨特方式對其進行混淆,以便收割者在訪問您的網站之前不會知道您的方法。
你可以像谷歌在谷歌代碼(和組)上做的那樣。 顯示電子郵件的一部分,以及可點擊的部分(“...”)。 單擊表示您想知道電子郵件,並要求您填寫驗證碼。 之后電子郵件(和其他人?)對您可見。
我使用 JavaScript 混淆,例如看看這個:
我維護的一個網站使用了一種有點簡單的 JavaScript 方法來(希望)將垃圾郵件機器人拒之門外。
電子郵件鏈接調用一個 JS 函數:
function sendEmail(name, domain) { location.href = 'mailto:' + name + '@' + domain; }
為了確保只有啟用了 JS 的用戶才能看到鏈接,請使用以下內容寫出它們:
function writeEmailLink(realName, name, domain) { document.write('<a href="javascript:sendEmail(\'' + name + '\', \'' + domain + '\')">'); document.write(realName); document.write('</a>'); }
使用一個JS函數寫出一個調用另一個的鏈接意味着有兩層保護。
正如上面的海報所說,我還使用了來自jottings 網站的JavaScript 混淆。
該網頁會生成一些可以改進的 JavaScript。 mailto:
文本字符串是清晰的並且可以被機器人識別(它可以發現這個並mailto:addr@site.tld
這個字符串),但是如果一個人進入mailto:addr@site.tld
網頁,一個格式為mailto:addr@site.tld
而不是addr@site.tld
的電子郵件地址addr@site.tld
然后刪除文本mailto:
從生成的 JavaScript 中,突然有一些 JavaScript 看起來似乎與電子郵件根本沒有任何關系 - 只是網絡已滿的隨機 JavaScript。 可以通過刪除鏈接文本來進一步改進這一點 - 我用我的電子郵件地址的圖像替換了我的圖像,該圖像采用了一種相當晦澀的字體。 然后,為了防止 jottings.com 上的這種方法變得流行,我將輸出 JavaScript 中的變量名稱隨機化,以使機器人難以發現 jottings.com 生成的 JavaScript 代碼實例。
顯然,其中一些改進可以內置到記事本本身的機制中,而且由於代碼是公開可用的,這將相對容易。
一個例子可能會使這更清楚一點。 我用隨筆混淆在上面的鏈接,以掩蓋mailto:foo@bar.com
(注意,我通過輸入字符串的札記網站的初衷作弊mailto:foo@bar.com
代替foo@bar.com
)帶有文本“給我發送電子郵件”,其中的筆記變成了這個 Javascript:
<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:rJJ@VAK.GJ3"
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>
找回后,我將其粘貼到編輯器中,然后:
mailto:
我最終得到了這個:
<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:rJJ@VAK.GJ3"
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> </font></p>
</noscript>
我不知道這會有多好。 你能不能不留下你的電子郵件地址,並在頁面加載完成后使用 AJAX 調用加載它。 不確定垃圾郵件機器人是否可以獲取更改后的 HTML,或者他們是否足夠聰明來偵聽其他 HTTP 流量以嘗試選擇電子郵件地址,或者他們是否只是在第一次收到頁面時掃描頁面。
一個人測試了在頁面上顯示電子郵件地址的九種不同方式,然后在他的博客上發布了結果。
他最好的三種方式是:
警告 - 這是兩年前發布的。 垃圾郵件機器人可能變得更聰明了。
如果您使用 PHP,您可以獲取自動執行此操作的免費腳本。 它被稱為“私人爸爸”,我們將它用於我們自己的在線音頻流服務。 只需一行代碼,即可開箱即用……您可以在此處獲取
另一種方法是使用 JavaScript 框架並將數據/模型綁定到 HTML 元素。 在 AngularJS 的情況下,HTML 元素將被編寫為:
<a href="mailto:{{contactEmail}}"><span>{{contactEmail}}</span></a>
插值 {{data}} 綁定使用包含實際電子郵件值的范圍變量。 此外,還可以使用過濾器來處理電子郵件的解碼,如下所示:
<a href="mailto:{{contactEmail | decode}}"><span>{{contactEmail | decode}}</span></a>
好處在於 HTML 的編寫方式。 缺點是它需要腳本支持,有些人可能不同意。
只是另一種方法。
使用 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 解析)
最好是在網站上有表格,不要顯示郵箱地址,因為所有的機器人一天比一天聰明,但是如果你需要在網站上顯示郵箱地址,那么你可以在你的服務器,並在單擊時顯示它。
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 => 'info@domain.ltd'
));
}
為了更安全,您可以像這樣$(document).one('click', '.obfmail', function(e) {
甚至使用 PHP 生成的令牌來更改.on
為.one
調用,只接受一次這樣的 ajax 函數調用:
html: <a class="obfmail" href="#" rel="info" token="w3487ghdr6rc">
查詢:
...
addr = a.attr('rel');
tkn = a.attr('token');
$.ajax({
data: {
email: addr,
token: tkn
}, ...
.
也可以對返回的電子郵件地址進行編碼或反轉它。
.
電話號碼也可以正常工作!
Cloudflare 現在提供免費的電子郵件混淆服務。 如果您使用 Cloudlfare,這可能是一個選項。
如果您在您的網站上說“我的電子郵件地址是(我的名字)@(我的姓氏)。com。”,並且您的名字和姓氏非常明顯,這似乎是最好的垃圾郵件防護你會得到。
如果有人使用 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 進行十六進制編碼。
:replace_at - 當未提供鏈接名稱時,電子郵件地址用於鏈接標簽。 您可以使用此選項通過將 @ 符號替換為作為值給出的字符串來混淆 email_address。
:replace_dot - 當未提供鏈接名稱時,電子郵件地址用於鏈接標簽。 您可以使用此選項通過替換 . 在電子郵件中,將字符串作為值。
<!-- Multi-Email Obfuscator -->
<!-- step 1: @ = @ -->
<!-- step 2: a scrap element -->
<!-- step 3: ROT13 encode for .com -->
info<!-- step 1 -->@<!-- 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>
由於此解決方案未在任何地方提及,但對我來說效果很好:
我這樣做:
創建一個帶有假電子郵件的mailto鏈接。 我喜歡 admin@localhost.localdomain 的原因很明顯:垃圾郵件發送者可能會在未選中使用此地址時向他自己的僵屍網絡發送垃圾郵件。
密碼真實的電子郵件地址,並將其放在不相關但可找到的隱藏跨度或您喜歡的任何元素中。 顯然是為了混淆電子郵件並將其隱藏在收割機中。 根據你的項目結構,你甚至可能想把它放在一個 JS 或 Session 變量中。
一秒鍾后為這些鏈接創建一個單擊處理程序,該處理程序會解密並將正確的電子郵件地址寫入虛假的 mailto 鏈接,但不會阻止默認設置。 我不認為爬蟲會點擊 mailto 鏈接,但如果他們願意,他們可能不會等一秒鍾,而人類在頁面加載后的第一秒內必須非常快地點擊鏈接。
現在您有一個功能齊全但經過混淆的蜜罐和時間安全的 mailto 鏈接。
工作示例php文件:
<html>
<head>
<title>E-Mail Obfuscating</title>
</head>
<body>
<?php
$email = "example@email.org";
echo "<a class='emailLink' href='mailto:admin@localhost.localdomain' >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>
願代碼與你同在。
如果創建指向受密碼保護的目錄的“聯系我”鏈接怎么辦? 當然,您必須提供通行證才能訪問。
“聯系我” > ••••••••••• > contact/index.html
訪問后,contact/index.html 頁面會顯示電子郵件,例如 mailto。
我的解決方案是使用 css 重新排列字符並在懸停時替換元素。 用戶看不到任何變化。
const obscureHoverReverseMailTo = input => `<span style="display: inline-flex; color: rgb(0, 0, 238); cursor: pointer; text-decoration: underline;" onmouseover="const newContent = [...this.children].sort((a, b) => a.style.order - b.style.order).map(el => el.innerText).join('');this.outerHTML = \`<a href='mailto: \${newContent}'>\${newContent}</a>\`">${input.split("").map((char, index) => `<span style="order: ${index}">${char}</span>`).sort(() => 0.5 - Math.random()).join("")}</span>`;
const obscureHoverReverseMailTo = input => `<span style="display: inline-flex; color: rgb(0, 0, 238); cursor: pointer; text-decoration: underline;" onmouseover="const newContent = [...this.children].sort((a, b) => a.style.order - b.style.order).map(el => el.innerText).join('');this.outerHTML = \\`<a href='mailto: \\${newContent}'>\\${newContent}</a>\\`">${input.split("").map((char, index) => `<span style="order: ${index}">${char}</span>`).sort(() => 0.5 - Math.random()).join("")}</span>`; document.getElementById("testRoot").innerHTML = obscureHoverReverseMailTo("hello@example.com")
<div id="testRoot"></div> <input type="text" onkeyup="document.getElementById('testOut').innerHTML = obscureHoverReverseMailTo(this.value)"> <div id="testOut"></div>
如果您有其他要隱藏的內容,請使用以下功能:
const obscureHoverReverse = input => `<span style="display: inline-flex" onmouseover="this.outerHTML = [...this.children].sort((a, b) => a.style.order - b.style.order).map(el => el.innerText).join('')">${input.split("").map((char, index) => `<span style="order: ${index}">${char}</span>`).sort(() => 0.5 - Math.random()).join("")}</span>`;
我同意@srobinson 的觀點,即使用在線表單對 html 實體進行編碼似乎有點陰暗。 幾行python將為您完成:
def htmlEntities( string ):
return ''.join(['&#{0};'.format(ord(char)) for char in string])
htmlEntities("barnstable@example.com")
以上返回:
'barnstable@example.com'
這是 barnstable@example.com 編碼為 HTML 實體(用單引號括起來)。
不知道 JavaScript 的簡單機器人通常會在 HTML 頁面內容中查找mailto:
和/或@
。 混淆這些關鍵字將大大降低電子郵件地址抓取的機會。
可以使用 Base-64 編碼的 URL 模板mailto:%user%@%domain%
:
function contact(user, domain = location.hostname) {
const template = atob('bWFpbHRvOiV1c2VyJUAlZG9tYWluJQ==');
location.href = template
.replace('%user%', user)
.replace('%domain%', domain);
return false;
}
其中'bWFpbHRvOiV1c2VyJUAlZG9tYWluJQ=='
是btoa('mailto:%user%@%domain%')
。
HTML 鏈接需要更新如下:
<a href="javascript: contact('x', 'y.com')">e-mail me</a>
此外, javascript:
地址可以對用戶隱藏:
<a href="#" onclick="return contact('x', 'y.com')">e-mail me</a>
return
語句阻止頁面導航到#
錨點。
老實說,如果您詢問 mailto 是否真的是您想要使用的問題,那么您的問題可能沒有實際意義。 例如,許多使用網絡郵件的人,或者沒有在瀏覽器中正確設置郵件客戶端的人都不會從 mailto 中受益。 您正在為一項對大部分用戶不起作用的功能公開您的電子郵件地址。
相反,您可以做的是使用表單在幕后發送電子郵件,以便隱藏電子郵件地址,並且您不必擔心不會從 mailto 中受益的可憐的 sap。
我使用PHP 函數生成一些 javascript 以在頁面加載時輸出電子郵件。 請注意,您不需要PHP 在運行時生成 JS,您可以在本地生成一次 JS,然后將靜態 JS 包含在您的頁面中。
您還可以使用帶有以下代碼段的鏈接函數自動混淆某些給定 HTML 中的電子郵件地址(其中 $processedContent 是 HTML):
$emailMatches = array();
$matchCount = preg_match_all('/(?:[a-zA-Z0-9_\.\-])+\@(?:(?:[a-zA-Z0-9\-])+\.)+(?:[a-zA-Z0-9]{2,4})+/', $processedContent, $emailMatches);
if($matchCount > 0) {
$emailMatches = $emailMatches[0];
foreach($emailMatches as $email) {
$replacement = createJSMailLink($email);
$processedContent = str_replace($email, createJSMailLink($email), $processedContent);
}
看看這個。
“Enkoder 表單”將加密您的電子郵件地址並將結果轉換為自我評估的 JavaScript,將其隱藏在電子郵件收集機器人中,這些機器人會在網絡上搜尋暴露的地址。 您的地址將被網絡瀏覽器正確顯示,但電子郵件收集機器人幾乎無法辨認。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.