Phương pháp hiệu quả để ẩn email khỏi bot spam


195

Trên trang chủ của tôi, tôi đang sử dụng phương pháp này để ẩn email của mình khỏi các bot spam:

<a href="admin [at] example.com"
   rel="nofollow"
   onclick="this.href='mailto:' + 'admin' + '@' + 'example.com'">Contact me</a>

Bạn nghĩ gì về nó? Có hiệu quả không? Những phương pháp khác mà bạn biết hoặc sử dụng?


Đây là bản sao của stackoverflow.com/questions/163628/ , hoặc cái khác không hợp lệ vì nó là một danh sách dài wiki không cộng đồng.
Ciro Santilli 郝海东 冠状 病 事件

5
Điều này có nhiều upvote, câu trả lời và quan điểm. Nó không nên được đóng lại để ủng hộ người khác có ít upvote, câu trả lời và quan điểm.
abatishchev

1
Tôi muốn đóng cái đó để theo dõi thực tế cái này thu hút hơn nhiều.
abatishchev

6
Giải pháp tốt nhất là không chia sẻ giải pháp của bạn . Thật không may, đây là loại câu hỏi. Tốt nhất là tìm giải pháp của bạn và giữ nó cho chính mình. Nếu một người được chuẩn hóa, spam bots sẽ được điều chỉnh để vượt qua nó.
Dimitris

1
Giải pháp tốt nhất là kết hợp một số giải pháp dưới đây , ví dụ phần đầu của email dưới dạng hình ảnh, phần thứ hai this.href.replace(/x/g,''), phần thứ ba được mã hóa, v.v. Không có bot spam, dù thông minh đến đâu, sẽ thử các phương pháp giải mã khác nhau trên các phần khác nhau của một địa chỉ email.

Câu trả lời:


98

Đây là phương pháp tôi đã sử dụng, bao gồm phía máy chủ, ví dụ: <!--#include file="emailObfuscator.include" -->nơi emailObfuscator.includechứa các mục sau:

<!-- // http://lists.evolt.org/archive/Week-of-Mon-20040202/154813.html -->
<script type="text/javascript">
    function gen_mail_to_link(lhs,rhs,subject) {
        document.write("<a href=\"mailto");
        document.write(":" + lhs + "@");
        document.write(rhs + "?subject=" + subject + "\">" + lhs + "@" + rhs + "<\/a>");
    }
</script>

Để bao gồm một địa chỉ, tôi sử dụng JavaScript:

<script type="text/javascript"> 
    gen_mail_to_link('john.doe','example.com','Feedback about your site...');
</script>
<noscript>
  <em>Email address protected by JavaScript. Activate JavaScript to see the email.</em>
</noscript>

Bởi vì tôi đã nhận được email qua Gmail từ năm 2005, thư rác không phải là vấn đề. Vì vậy, tôi không thể nói về hiệu quả của phương pháp này. Bạn có thể muốn đọc nghiên cứu này (mặc dù nó đã cũ) đã tạo ra biểu đồ này:

nhập mô tả hình ảnh ở đây


Tại sao bạn cần phía máy chủ bao gồm emailObfuscator.include? Nó sẽ không giống như viết nó bằng .html? (có lẽ đó chỉ là một ví dụ?) Ngoài ra tại sao bạn sử dụng nhận xét html <!-- -->bên trong tập lệnh? Và cuối cùng tại sao một trong những <script>thẻ của bạn là chữ thường trong khi những người khác là chữ hoa <SCRIPT>? Những phương pháp này có giúp nhầm lẫn bot hay cái gì không?
Templar

@Templar SSI không cần thiết, cũng không gây nhầm lẫn cho các bot theo như tôi biết. Nó làm cho (làm) trang web của tôi thành mô-đun (không thực sự sử dụng phương pháp này nữa). Các bình luận đã trích dẫn nguồn nơi tôi tìm thấy hack (bây giờ là một liên kết bị hỏng). Sự thay đổi trong trường hợp chỉ là một con sán. Nếu nó nhầm lẫn bot, tất cả tốt hơn, nhưng tôi nghi ngờ nó có bất kỳ ảnh hưởng.
Fuhrmanator

4
Một nghiên cứu gần đây và đầy đủ hơn khám phá cùng một ý tưởng: grall.name/posts/1/antiSpam-emailAddressObfuscation.html
Lucas Cimon

95

Làm việc với nội dung và attr trong CSS:

.cryptedmail:after {
  content: attr(data-name) "@" attr(data-domain) "." attr(data-tld); 
}
<a href="#" class="cryptedmail"
   data-name="info"
   data-domain="example"
   data-tld="org"
   onclick="window.location.href = 'mailto:' + this.dataset.name + '@' + this.dataset.domain + '.' + this.dataset.tld; return false;"></a>

Khi javascript bị vô hiệu hóa, chỉ cần sự kiện nhấp sẽ không hoạt động, email vẫn được hiển thị.

Một cách tiếp cận thú vị khác (ít nhất là không có sự kiện nhấp chuột) sẽ là sử dụng dấu từ phải sang trái để ghi đè hướng viết. thêm về điều này: https://en.wikipedia.org/wiki/Right-to-left_mark


6
Điều này cần nhiều ngón tay cái hơn.
heXer

Không chắc chắn tại sao nhưng mặc dù giải pháp này trông khá ấn tượng nhưng nó không thể kích hoạt ứng dụng email của tôi. Đây là một mẹo
Ricardo Zea

1
@RicardoZea bạn sử dụng trình duyệt nào? Fiddle của bạn hoạt động tốt với tôi trong chrome, eg11, edge và firefox
cyptus

3
Tuyệt vời. Nhưng nối thêm "; return false" vào sự kiện onclick. Điều này sẽ ngăn việc thêm # xấu vào URL của trình duyệt (bằng cách hủy liên kết gốc href)
T4NK3R

5
TUY NHIÊN - Tôi không thể sao chép thủ công địa chỉ thư (hiển thị) (trong Chrome, Firefox hoặc Edge)?
T4NK3R

83

Có một cái nhìn theo cách này , khá thông minh và sử dụng css.

CSS

span.reverse {
  unicode-bidi: bidi-override;
  direction: rtl;
}

HTML

<span class="reverse">moc.rehtrebttam@retsambew</span>

CSS ở trên sau đó sẽ ghi đè hướng đọc và trình bày văn bản cho người dùng theo đúng thứ tự.

Hy vọng nó giúp

Chúc mừng


54
Nó chắc chắn là buồn cười. Nhưng thật không may, điều này không thể nhấp và sẽ không hoạt động để sao chép / dán, trong khi bỏ qua bất kỳ trình duyệt không phải CSS nào như trình đọc chữ nổi.
Arjan

Mhh tốt, nhưng một khi những người viết trình thu thập thông tin nhìn thấy nó, nó trở nên vô dụng.
Mậu

6
Kết hợp địa chỉ e-mail ngược với RegEx cũng dễ như khớp với địa chỉ không đảo ngược. Gửi thư rác là một doanh nghiệp trị giá hàng tỷ đô la và người gửi thư rác thậm chí không sử dụng chu kỳ CPU của riêng họ để cạo màn hình. Trên thực tế, họ đã đọc cuộc hội thoại này và đã điều chỉnh phương pháp của họ cho phù hợp. Bất cứ thứ gì máy tính có thể đọc được đều có thể đọc được bởi các bot. Cho dù nó được thực thi bởi CSS hay JavaScript.
Jani Hyytiäinen

3
@ JaniHyytiäinen Tôi không đồng ý. Thực tế họ không trả tiền cho CPU, không có nghĩa là họ có tài nguyên không giới hạn. Nếu chạy trình thông dịch JS hóa ra lại mang lại quá ít địa chỉ cho chi phí của nó, họ sẽ vô hiệu hóa nó.
o0 '.

1
@Lohoris: Google báo cáo thời gian tải trang trung bình là (2,45 giây) và kích thước trang trung bình (320KB), nó cung cấp cho bạn ý tưởng về việc bạn có thể phân tích cú pháp bao nhiêu. Trong khi một luồng tải xuống đang thực hiện các yêu cầu, một luồng phân tích cú pháp có thể thực hiện phân tích cú pháp. Phần lớn tải về đang chờ. Cung cấp cho chủ đề dl khả năng kiểm tra các điều kiện tiên quyết trước khi quyết định gửi nó cho trình phân tích cú pháp. Ví dụ: trang kết xuất, indexOf ('@'), indexOf ('mailto:'), v.v. điều khoản của sức mạnh phân tích.
Jani Hyytiäinen

52

Tôi có một hoàn toàn khác về việc này. Tôi sử dụng MailHide cho việc này.

MailHide là một hệ thống từ Google, theo đó người dùng cần hoàn thành bài kiểm tra reCAPTCHA để sau đó tiết lộ email cho họ.


15
Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi.
showdev

5
Mặc dù tôi thường đồng ý với tình cảm này, nhưng trong trường hợp này, câu trả lời là sử dụng một công cụ cụ thể. Nếu liên kết không biến mất, tôi sẽ xóa câu trả lời.
tvanfosson

Cảm ơn - Điều này thật tuyệt. Tôi đang viết một cái gì đó như thế này (tiết lộ là liên kết): Gửi cho tôi một e-mail: tiết lộ
chrs 15/2/2016

6
Lưu ý rằng Google đã vô hiệu hóa MailHide kể từ Trận đấu 2018. Như mọi khi với các dịch vụ Google "miễn phí": họ cung cấp cho họ miễn là họ có thể thu lợi từ dữ liệu từ đó và một khi họ có được thứ họ cần thì họ sẽ bỏ nó. Hầu hết các công ty không đáng tin cậy để cung cấp dịch vụ miễn phí. Tôi sẽ tránh xa các dịch vụ của Google hoặc bất cứ ai khác nếu bạn cần chuyển tiếp bất cứ điều gì bạn đang cố gắng làm.
Masi

51

Không phải ý tưởng ban đầu của tôi nhưng tôi không thể tìm thấy tác giả:

<a href="mailto:coxntact@domainx.com"
    onmouseover="this.href=this.href.replace(/x/g,'');">link</a>

Thêm bao nhiêu x tùy thích. Nó hoạt động hoàn hảo để đọc, sao chép và dán và không thể đọc được bởi bot.


2
Khéo léo! Nhưng những gì về người dùng di động?
Bodzio

Mouseovers cũng được kích hoạt khi bạn chạm vào một liên kết. Nó sẽ hoạt động tốt.
Andrew Swift

4
Hoạt động miễn là địa chỉ của bạn không chứa bất kỳ x. :-p Nhưng, tôi biết, chỉ cần sử dụng một chữ cái khác.
Dan Henderson

1
Nhưng sau đó, nếu javascript bị vô hiệu hóa, bạn đang hiển thị cho người dùng địa chỉ chưa tồn tại sẽ trả lại cho bạn một khách hàng / người dùng.
Xeevis

34
Nếu javascript bị vô hiệu hóa, không có trang web nào của tôi hoạt động cả ;-)
Andrew Swift

16

Tôi nghĩ rằng phương pháp hoàn hảo duy nhất bạn có thể có là tạo trang Liên hệ với tôi, đó là một hình thức gửi đến một tập lệnh gửi đến địa chỉ email của bạn. Bằng cách đó, địa chỉ của bạn không bao giờ được tiếp xúc với công chúng cả. Điều này có thể là không mong muốn vì một số lý do, nhưng tôi nghĩ đó là một giải pháp khá tốt. Nó thường làm phiền tôi khi tôi buộc phải sao chép / dán địa chỉ email của ai đó từ trang web của họ vào ứng dụng thư của tôi và gửi tin nhắn cho họ; Tôi muốn làm điều đó thông qua một hình thức trên trang web của họ. Ngoài ra, phương pháp này cho phép bạn gửi bình luận ẩn danh cho bạn, v.v. Chỉ cần đảm bảo bảo vệ biểu mẫu của bạn bằng cách sử dụng một số loại chương trình chống bot, chẳng hạn như captcha. Có rất nhiều trong số họ thảo luận ở đây về SO.


6
Vấn đề duy nhất với điều này là bạn không có một bản sao của tin nhắn bạn đã gửi trừ khi bạn dành thời gian để sao chép và dán nó vào một nơi khác. Cá nhân tôi không ngại sao chép và dán nhưng với mỗi người.
gvkv

6
Đối với người gửi không có bản sao: đối với nhiều loại biểu mẫu trên web, tôi thích tùy chọn nhận bản sao. Tuy nhiên, thường thì một tùy chọn như vậy cho phép lạm dụng để gửi tin nhắn nặc danh tới bất kỳ ai ...
Arjan

12
Điều này có thể ẩn địa chỉ email của bạn, nhưng nó sẽ không ngăn chặn thư rác, trừ khi bạn bảo mật biểu mẫu của mình bằng tập lệnh xác thực hình ảnh captcha.
SimonDowdles

1
Bạn cũng có thể giải quyết vấn đề người gửi không có bản sao bằng cách bao gồm một tùy chọn để gửi cho họ.
steinybot

1
Tùy chọn "Gửi bản sao cho chính bạn" - thực sự biến biểu mẫu thành thư rác, với bạn là người gửi - ý tưởng tồi!
T4NK3R


10

Nếu bạn có hỗ trợ php, bạn có thể làm một cái gì đó như thế này:

<img src="scriptname.php">

Và scriptname.php:

<?php
header("Content-type: image/png");
// Your email address which will be shown in the image
$email    =    "you@yourdomain.com";
$length    =    (strlen($email)*8);
$im = @ImageCreate ($length, 20)
     or die ("Kann keinen neuen GD-Bild-Stream erzeugen");
$background_color = ImageColorAllocate ($im, 255, 255, 255); // White: 255,255,255
$text_color = ImageColorAllocate ($im, 55, 103, 122);
imagestring($im, 3,5,2,$email, $text_color);
imagepng ($im);
?>

1
thay vì sử dụng php, bạn có thể tạo hình ảnh một cách vật lý. Và như với đảo ngược css, bạn vẫn gặp phải vấn đề không thể nhấp và không thể sao chép trừ khi sử dụng bút: P
Claudiu

9

Tôi biết câu trả lời của tôi sẽ không được nhiều người thích nhưng xin vui lòng xem xét các điểm được nêu ở đây trước khi đưa ngón tay cái xuống.

Bất cứ thứ gì dễ dàng máy có thể đọc được sẽ dễ dàng được đọc bởi những kẻ gửi thư rác. Mặc dù hành động của họ có vẻ ngu ngốc đối với chúng tôi, họ không phải là những người ngu ngốc. Họ sáng tạo và tháo vát. Họ không chỉ sử dụng bot để thu hoạch e-mail, họ có rất nhiều phương pháp theo ý của họ và ngoài ra, họ chỉ cần trả tiền cho danh sách email mới. Điều đó có nghĩa là, họ đã có hàng ngàn tin tặc mũ đen trên toàn thế giới để thực hiện công việc của họ. Mọi người sẵn sàng mã hóa phần mềm độc hại quét màn hình của các trình duyệt của người khác mà cuối cùng sẽ hiển thị bất kỳ phương pháp nào bạn đang cố gắng để đạt được vô dụng. Chủ đề này đã được hơn 10 người như vậy đọc và họ đang cười nhạo chúng tôi. Một số trong số họ thậm chí có thể chán đến phát khóc khi phát hiện ra chúng ta không thể đưa ra một thử thách mới cho họ.

Hãy nhớ rằng cuối cùng bạn không cố gắng tiết kiệm thời gian của mình mà là thời gian của người khác. Vì điều này, xin vui lòng xem xét dành một số thời gian thêm ở đây. Không có viên đạn ma thuật dễ thực hiện nào có thể hoạt động. Nếu bạn làm việc trong một công ty xuất bản 100 email của mọi người trên trang web và bạn có thể giảm 1 email spam mỗi ngày cho mỗi người, chúng ta sẽ nói về 36500 email spam mỗi năm. Nếu xóa email như vậy trung bình mất 5 giây, chúng ta sẽ nói về 50 giờ làm việc hàng năm. Chưa kể số lượng giảm phiền toái. Vì vậy, tại sao không dành một vài giờ cho việc này?

Không chỉ bạn và những người nhận e-mail coi thời gian là tài sản. Do đó, bạn phải tìm cách làm xáo trộn các địa chỉ e-mail theo cách đó để không phải trả tiền để bẻ khóa. Nếu bạn sử dụng một số phương pháp được sử dụng rộng rãi để làm xáo trộn các e-mail, nó thực sự có ích để bẻ khóa nó. Vì kết quả là, cracker sẽ có được hàng ngàn, nếu không phải là hàng chục hoặc hàng trăm ngàn e-mail mới. Và đối với họ, họ sẽ nhận được tiền.

Vì vậy, hãy tiếp tục và mã hóa phương pháp của riêng bạn. Đây là một trường hợp hiếm hoi khi phát minh lại bánh xe thực sự được đền đáp. Sử dụng một phương pháp không thể đọc được bằng máy và tốt nhất là sẽ yêu cầu một số tương tác người dùng mà không làm mất trải nghiệm người dùng.

Tôi đã dành khoảng 20 phút để viết ra một ví dụ về ý tôi muốn nói. Trong ví dụ này, tôi đã sử dụng KnockoutJS đơn giản vì tôi thích nó và tôi biết bạn có thể sẽ không sử dụng nó cho mình. Nhưng dù sao nó cũng không liên quan. Đó là một giải pháp tùy chỉnh không được sử dụng rộng rãi. Bẻ khóa nó sẽ không tạo ra phần thưởng cho việc thực hiện vì phương pháp thực hiện nó sẽ chỉ hoạt động trên một trang duy nhất trên internet rộng lớn.

Đây là câu đố: http://jsfiddle.net/hzaw6/

Mã dưới đây không có nghĩa là một ví dụ về mã tốt. Nhưng chỉ là một mẫu mã nhanh mà rất khó để máy phát hiện ra chúng tôi thậm chí còn xử lý các e-mail ở đây. Và ngay cả khi nó có thể được thực hiện, nó sẽ không được đền đáp để thực hiện ở quy mô lớn.

Và vâng, tôi biết nó không hoạt động trên IE = lte8 vì 'Không thể lấy thuộc tính' thuộc tính 'của tham chiếu không xác định hoặc null' nhưng tôi chỉ đơn giản là không quan tâm vì đó chỉ là bản demo của phương thức, không phải là triển khai thực tế, và không có ý định được sử dụng trong sản xuất. Hãy thoải mái viết mã của riêng bạn, nó mát hơn, kỹ thuật vững chắc hơn, vv ..

Ồ, và không bao giờ đặt tên một cái gì đó thư hoặc email trong html hoặc javascript. Thật quá dễ dàng để cạo DOM và đối tượng cửa sổ cho bất kỳ thứ gì có tên là thư hoặc email và kiểm tra xem nó có chứa thứ gì đó phù hợp với e-mail không. Đây là lý do tại sao bạn không muốn bất kỳ biến nào có thể chứa e-mail ở dạng đầy đủ và đây cũng là lý do bạn muốn người dùng tương tác với trang trước khi bạn gán các biến đó. Nếu mô hình đối tượng javascript của bạn chứa bất kỳ địa chỉ email nào ở trạng thái sẵn sàng DOM, thì bạn đang phơi bày chúng cho những kẻ gửi thư rác.

HTML:

<div data-bind="foreach: contacts">
    <div class="contact">
        <div>
            <h5 data-bind="text: firstName + ' ' + lastName + ' / ' + department"></h5>
            <ul>
                <li>Phone: <span data-bind="text: phone"></span></li>
                <li><a href="#999" data-bind="click:$root.reveal">E-mail</a> <span data-bind="visible: $root.msgMeToThis() != ''"><input class="merged" data-bind="value: mPrefix" readonly="readonly" /><span data-bind="text: '@' + domain"></span></span></li>
            </ul>
        </div>
    </div>
</div>

Mã thông báo

function ViewModel(){
    var self = this;

    self.contacts = ko.observableArray([
        { firstName:'John', mPrefix: 'john.doe', domain: 'domain.com', lastName: 'Doe', department: 'Sales', phone: '+358 12 345 6789' },
        { firstName:'Joe', mPrefix: 'joe.w', domain: 'wonder.com', lastName: 'Wonder', department: 'Time wasting', phone: '+358 98 765 4321' },
        { firstName:'Mike', mPrefix: 'yo', domain: 'rappin.com', lastName: 'Rophone', department: 'Audio', phone: '+358 11 222 3333' }
    ]);
    self.msgMeToThis = ko.observable('');
    self.reveal = function(m, e){
        var name = e.target.attributes.href.value;
        name = name.replace('#', '');
        self.msgMeToThis(name);
    };
}
var viewModel = new ViewModel();
ko.applyBindings(viewModel);

8

Một trong những phương pháp yêu thích của tôi là làm xáo trộn địa chỉ email bằng php, một ví dụ kinh điển là chuyển đổi các ký tự thành giá trị HEX như vậy:

function myobfiscate($emailaddress){
 $email= $emailaddress;                
 $length = strlen($email);                         
 for ($i = 0; $i < $length; $i++){                
 $obfuscatedEmail .= "&#" . ord($email[$i]).";";
 }
 echo $obfuscatedEmail;
}

Và sau đó trong phần đánh dấu của tôi, tôi chỉ cần gọi nó như sau:

  <a href="mailto:<?php echo myobfiscate('someone@somewhere.com'); ?>"
title="Email me!"><?php echo myobfiscate('someone@somewhere.com');?> </a>

Sau đó kiểm tra nguồn của bạn, bạn sẽ ngạc nhiên!


Đó là một ví dụ tốt đẹp. Cảm ơn. Có manh mối nào về SpamBots khi giải mã HEX không?
jasonflaherty

7

Bạn có thể cố gắng ẩn các ký tự bằng cách sử dụng các thực thể html trong hexa (ví dụ: & # x40 cho @). Đây là giải pháp thuận tiện, vì một trình duyệt chính xác sẽ dịch nó và bạn có thể có một liên kết bình thường. Hạn chế là bot có thể dịch nó theo lý thuyết, nhưng nó hơi bất thường. Tôi sử dụng điều này để bảo vệ e-mail của tôi trên blog của tôi.

Một giải pháp khác là sử dụng javascript để tập hợp một phần địa chỉ và giải mã địa chỉ nhanh chóng. Hạn chế là trình duyệt bị vô hiệu hóa javascript sẽ không hiển thị địa chỉ của bạn.

Giải pháp hiệu quả nhất là sử dụng hình ảnh , nhưng thật khó để người dùng phải sao chép địa chỉ bằng tay.

Giải pháp của bạn khá tốt , vì bạn chỉ thêm một nhược điểm (viết thủ công @) chỉ cho người dùng đã tắt javascript. Bạn cũng có thể an tâm hơn với:

onclick="this.href='mailto:' + 'admin' + '&#x40;' + 'domain.com'"

5

Spamb sẽ không giải thích điều này, bởi vì nó là một phương pháp ít được biết đến :)

Đầu tiên, xác định css:

email:before {
    content: "admin";
}

email:after {
    content: "@example.com";
}

Bây giờ, bất cứ nơi nào bạn muốn hiển thị email của mình, chỉ cần chèn HTML sau đây:

<div id="email"></div>

Và tada!


Điều này hoạt động, nhưng nó không hỗ trợ sao chép dán, điều này có thể ảnh hưởng đến khả năng sử dụng đối với hầu hết người dùng
Iruku Kagika

4

Tôi sử dụng kết hợp CSS và jQuery rất đơn giản, hiển thị chính xác địa chỉ email cho người dùng và cũng hoạt động khi neo được nhấp hoặc di chuột:

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);
});

Dưới đây là một ví dụ làm việc.


nó sẽ hiển thị giá trị chính xác của href trong thanh trạng thái trình duyệt khi liên kết được di chuột qua?
Nik O'Lai

Có, nó hiển thị giá trị chính xác của href khi liên kết được di chuột. Đó là lý do tại sao phương thức jQuery .hover cần được triển khai.
Sergiu

Thật không may, không, nó không hiển thị giá trị chính xác của href, ít nhất, khi bạn di chuột qua liên kết lần đầu tiên (đó là me@example.spam). Trên di chuột thứ hai mọi thứ đều ổn. Kiểm tra nó với liên kết của riêng bạn.
Nik O'Lai

1
Nó hoạt động trong Chrome và IE. Có vẻ như chỉ trên Firefox, trên lần di chuột đầu tiên, thanh trạng thái không được cập nhật. Tôi sẽ cố gắng tìm một giải pháp cho Firefox.
Sergiu

1
Tôi thấy, tôi thấy, tôi thực sự thích cái này.
Eric Bishard

3

! - Thêm thông tin này để tham khảo, không biết thông tin có thể lỗi thời như thế nào, nhưng nó cho biết về một vài giải pháp đơn giản không yêu cầu sử dụng bất kỳ tập lệnh nào

Sau khi tự mình tìm kiếm, tôi đã xem qua trang này nhưng cũng có những trang này:

http://nadeausoftware.com/articles/2007/05/stop_spammer_email_harvestftimeobfuscating_email_addresses

hãy thử đảo ngược emailadress

Ví dụ HTML đơn giản:

<bdo dir="rtl">moc.elpmaxe@nosrep</bdo>
Result : person@example.com

Hiệu ứng tương tự bằng CSS

CSS:
.reverse { unicode-bidi:bidi-override; direction:rtl; }
HTML:
<span class="reverse">moc.elpmaxe@nosrep</span>
Result : person@example.com

Kết hợp điều này với bất kỳ phương pháp nào được đề cập trước đó thậm chí có thể làm cho nó hiệu quả hơn


3

Một giải pháp dễ dàng là sử dụng các thực thể HTML thay vì các ký tự thực tế. Ví dụ: "me@example.com" sẽ được chuyển đổi thành:

<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#109;&#101;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;">email me</A>

2
Hãy thử google.se/search?q=HTML+entities+converter sẽ khiến bạn bận rộn;)
grapefrukt

1
Google có thể tìm cho bạn rất nhiều trang cho điều đó. Một ví dụ: hp.vector.co.jp/authors/VA022023/javascript/ Kẻ
Romain Linsolas

4
Nhưng không phải bot cũng dễ dàng như vậy sao?
gargantuan

20
Ouch, ví dụ me @ stack ... tốt hơn nên được viết là me@example.com, me@example.net hoặc me@example.org - đó là những tên miền duy nhất không phải chủ sở hữu nên sử dụng trong các ví dụ!
Arjan

4
Không hiệu quả lắm, theo techblog.tilllate.com/2008/07/20/NH
Fuhrmanator

3

Đây là phiên bản làm việc của tôi:


Tạo một nơi nào đó một thùng chứa với một văn bản dự phòng:

<div id="knock_knock">Activate JavaScript, please.</div>

Và thêm vào dưới cùng của DOM (ghi lại kết xuất) đoạn mã sau:

<script>
  (function(d,id,lhs,rhs){
    d.getElementById(id).innerHTML = "<a rel=\"nofollow\" href=\"mailto"+":"+lhs+"@"+rhs+"\">"+"Mail"+"<\/a>";
  })(window.document, "knock_knock", "your.name", "example.com");
</script>

Nó thêm siêu liên kết được tạo vào vùng chứa được chỉ định:

<div id="knock_knock"><a rel="nofollow" href="your.name@example.com">Mail</a></div>

Ngoài ra, đây là một phiên bản rút gọn:

<script>(function(d,i,l,r){d.getElementById(i).innerHTML="<a rel=\"nofollow\" href=\"mailto"+":"+l+"@"+r+"\">"+"Mail"+"<\/a>";})(window.document,"knock_knock","your.name","example.com");</script>

2

Phương pháp tốt nhất để ẩn địa chỉ email chỉ tốt cho đến khi lập trình viên bot phát hiện ra "mã hóa" này và thực hiện thuật toán giải mã.

Tùy chọn JavaScript sẽ không hoạt động lâu, vì có rất nhiều trình thu thập thông tin JavaScript.

Không có câu trả lời, imho.


Có trình thu thập thông tin JavaScript? Một phương pháp mã hóa JavaScript của tôi dường như hoạt động tốt đối với tôi trong vài năm qua - tốc độ spam của tôi khá ổn định ~ 4 / tuần, vì vậy tôi không lo lắng về các địa chỉ của người khác mà tôi giao phó cho phương pháp này. Tôi có nên
Kev

Chắc chắn, nó có thể loại trừ nhiều trình thu thập thông tin, nhưng tôi, nếu tôi đã tạo một trình thu thập địa chỉ, tôi sẽ triển khai một lib JavaScript :)
guerda

nỗ lực nhiều hơn bạn nghĩ
kẻ hèn nhát vô danh

Google hiện đang thu thập dữ liệu thông qua một số JS.
Alister Bulman

2

Có lẽ có các bot nhận ra [at]và các cách ngụy trang khác là @biểu tượng. Vì vậy, đây không phải là một phương pháp thực sự hiệu quả.

Chắc chắn bạn có thể sử dụng một số mã hóa như mã hóa URL hoặc tham chiếu ký tự HTML (hoặc cả hai):

// PHP example
// encodes every character using URL encoding (%hh)
function foo($str) {
    $retVal = '';
    $length = strlen($str);
    for ($i=0; $i<$length; $i++) $retVal.=sprintf('%%%X', ord($str[$i]));
    return $retVal;
}
// encodes every character into HTML character references (&#xhh;)
function bar($str) {
    $retVal = '';
    $length = strlen($str);
    for ($i=0; $i<$length; $i++) $retVal.=sprintf('&#x%X;', ord($str[$i]));
    return $retVal;
}

$email = 'user@example.com';
echo '<a href="'.bar('mailto:?to=' . foo(','.$email.'')).'">mail me</a>';

// output
// <a href="&#x6D;&#x61;&#x69;&#x6C;&#x74;&#x6F;&#x3A;&#x3F;&#x74;&#x6F;&#x3D;&#x25;&#x32;&#x43;&#x25;&#x37;&#x35;&#x25;&#x37;&#x33;&#x25;&#x36;&#x35;&#x25;&#x37;&#x32;&#x25;&#x34;&#x30;&#x25;&#x36;&#x35;&#x25;&#x37;&#x38;&#x25;&#x36;&#x31;&#x25;&#x36;&#x44;&#x25;&#x37;&#x30;&#x25;&#x36;&#x43;&#x25;&#x36;&#x35;&#x25;&#x32;&#x45;&#x25;&#x36;&#x33;&#x25;&#x36;&#x46;&#x25;&#x36;&#x44;">mail me</a>

Nhưng vì nó là hợp pháp để sử dụng chúng, mọi ứng dụng trình duyệt / e-mail cũng nên xử lý các mã hóa này.


Hoàn toàn đồng ý, những kẻ gửi thư rác là những người "thông minh", sau nhiều năm người thêm [at] hoặc [dot] thay cho cú pháp, tất nhiên họ sẽ có thuật toán chọn các mẫu này.
SimonDowdles

Còn việc giải mã các giá trị HEX này thì sao?
jasonflaherty

2

Tôi là một fan hâm mộ của SpamSpan - nó bị xáo trộn, nhưng vẫn có thể giải mã được nếu JS bị vô hiệu hóa. Nó dường như cũng hoạt động, mặc dù tôi mới chỉ sử dụng khoảng một năm trên một trang web có lưu lượng truy cập thấp.

Ngoài ra còn có một mô-đun để Drupal tự động biến email thành SpamSpans, nếu bạn cần.


1

Nó có hoạt động không nếu tôi nhấp chuột phải vào liên kết và chọn "sao chép URL"? Nếu không, đó không phải là một tình huống lý tưởng (tôi rất ít khi nhấp vào liên kết mailto, thích sao chép địa chỉ email và dán nó vào ứng dụng thư của tôi hoặc bất cứ nơi nào tôi cần tại một thời điểm cụ thể).

Tôi đã từng khá hoang tưởng khi bảo vệ địa chỉ thư trực tuyến của mình (UseNet, web và những thứ tương tự), nhưng ngày nay tôi nghi ngờ nhiều "mục tiêu khả dĩ cho thư rác" thực sự được tạo ra phù hợp với các phần cục bộ với các miền theo lập trình. Tôi dựa trên cơ sở này, thỉnh thoảng, đã đi qua nhật ký máy chủ thư của tôi. Có xu hướng có khá nhiều nỗ lực phân phối đến các địa chỉ không tồn tại (bao gồm cả các phiên bản rút gọn của mồi spam mà tôi đã sử dụng trên UseNet vào cuối những năm 90, khi việc quét địa chỉ rất phổ biến).


1

Sau khi sử dụng rất nhiều kỹ thuật tôi đã tìm thấy một cách dễ dàng và rất thân thiện, các bot tìm kiếm @ Símbolo và gần đây họ tìm kiếm [at] ant đó là biến thể nên tôi sử dụng 2 kỹ thuật

  1. tôi viết email của mình trên một hình ảnh giống như sử dụng domaintolls và nó hoạt động hoàn hảo hoặc
  2. để thay thế Símbolo (@) bằng hình ảnh của nó như

@ thay thế và alt hình ảnh sẽ là alt = "@" vì vậy bot sẽ tìm thấy một hình ảnh và bất kỳ con người nào cũng sẽ xem đó là một địa chỉ bình thường, vì vậy nếu anh ta sao chép nó, anh ta sẽ sao chép email và công việc là don nên mã sẽ là

<p>myname<img src="http://www.traidnt.net/vb/images/mail2.gif" width="11" height="9" alt="@" />domain.com</p>


1

Đầu tiên tôi sẽ đảm bảo địa chỉ email chỉ hiển thị khi bạn đã bật javascript. Bằng cách này, không có văn bản đơn giản có thể được đọc mà không có javascript.

Thứ hai, Một cách để thực hiện một tính năng an toàn là tránh xa <button>thẻ. Thẻ này cần chèn văn bản giữa các thẻ, làm cho nó có thể đọc được trên máy tính. Thay vào đó hãy thử<input type="button"> với trình xử lý javascript cho onClick. Sau đó sử dụng tất cả các kỹ thuật được đề cập bởi otherse để thực hiện ký hiệu email an toàn.

Một tùy chọn khác là có một nút với "Nhấp để xem địa chỉ email". Sau khi nhấp vào thay đổi này thành một email được mã hóa (các ký tự trong mã HTML). Trên một nhấp chuột khác, chuyển hướng này đến chức năng 'mailto: email'

Một phiên bản chưa giải mã của ý tưởng cuối cùng, với các địa chỉ email có thể chọn và không thể chọn:

<html>
<body>
<script type="text/javascript">
      e1="@domain";
      e2="me";
      e3=".extension";
email_link="mailto:"+e2+e1+e3;
</script>
<input type="text" onClick="this.onClick=window.open(email_link);" value="Click for mail"/>
<input type="text" onClick="this.value=email;" value="Click for mail-address"/>
<input type="button" onClick="this.onClick=window.open(email_link);" value="Click for mail"/>
<input type="button" onClick="this.value=email;" value="Click for mail-address"/>
</body></html>

Xem nếu đây là điều bạn muốn và kết hợp nó với ý tưởng của người khác. Bạn không bao giờ có thể quá chắc chắn.


2
oh look - me@domain.extension - có địa chỉ email văn bản đơn giản.
Alister Bulman

1

Và chức năng của tôi. Tôi đã tạo ra nó nhìn vào câu trả lời được đặt trong chủ đề này.

 function antiboteEmail($email)
 {
        $html = '';

        $email = strrev($email);
        $randId = rand(1, 500);

        $html .= '<span id="addr-'.$randId.'" class="addr">[turn javascript on to see the e-mail]</span>';
        $html .= <<<EOD
                <script>
                $(document).ready(function(){

                    var addr = "$email";
                    addr = addr.split("").reverse().join("");
                    $("#addr-$randId").html("<a href=\"mailto:" + addr + "\">" + addr + " </a>");
                });
                </script>
EOD;

        return $html;
    }

Nó sử dụng hai phương thức: đặt từ phải sang trái và đặt javascript.


1

Tùy chọn 1: Chia địa chỉ email thành nhiều phần và tạo một mảng trong JavaScript từ các phần này. Tiếp theo, tham gia các phần này theo đúng thứ tự và sử dụng thuộc tính .innerHTML để thêm địa chỉ email vào trang web.

 <span id="email">  </span>   // blank tag

 <script>
 var parts = ["info", "XXXXabc", "com", "&#46;", "&#64;"];
 var email = parts[0] + parts[4] + parts[1] + parts[3] + parts[2];
 document.getElementById("email").innerHTML=email; 
 </script>

Tùy chọn 2: Sử dụng hình ảnh thay vì văn bản email

Trang web của người tạo hình ảnh từ văn bản: http://www.chxo.com/labelgen/

Tùy chọn 3: Chúng tôi có thể sử dụng AT thay vì "@" và DOT thay vì "."

I E :

 info(AT)XXXabc(DOT)com 

1
Tôi nghĩ rằng tùy chọn 1 không phải là một lựa chọn tốt. Một trình phân tích cú pháp chạy cùng với bot có thể dễ dàng tìm ra giá trị của InternalHTML và tùy chọn 3 có lẽ cũng không tốt lắm vì một bot thông minh có thể tìm ra nó. Tôi nghĩ lựa chọn 2 là tốt nhất.
John Sonderson

1

Tôi không thích JavaScript và HTML được trộn lẫn, đó là lý do tại sao tôi sử dụng giải pháp này. Nó hoạt động tốt cho tôi, bây giờ.

Ý tưởng : bạn có thể làm cho nó phức tạp hơn bằng cách cung cấp thông tin được mã hóa trongdata phân phối và giải mã nó trong JS. Điều này được thực hiện đơn giản bằng cách thay thế các chữ cái hoặc chỉ đảo ngược chúng.

HTML :

<span class="generate-email" data-part1="john" data-part2="gmail" data-part3="com">placeholder</span>

JS :

$(function() {
    $('.generate-email').each(function() {
        var that = $(this);
        that.html(
            that.data('part1') + '@' + that.data('part2') + '.' + that.data('part3')
        );
    });  
});

Hãy dùng thử: http://jsfiddle.net/x6g9L817/


1

HTML_CHARACTER thì sao?:

joe&#064;mail.com

đầu ra

joe@mail.com

1
Địa chỉ email không thể nhấp theo cách này và vị trí của biểu tượng @ sẽ không có khả năng chống đạn, theo đó địa chỉ sẽ không giống như khi được đặt nội tuyến.
Brent O'Connor

0

Đây là một giải pháp jquery đơn giản cho vấn đề này:

<script type="text/javascript">
$(document).ready(function() {
    str1="mailto:";
    str2="info";
    str3="@test.com";
    $("#email_a").attr("href", str1+str2+str3);

});
</script>

<a href="#" id="email_a"><img src="sample.png"/></a>

0

Tôi thích câu trả lời của ofaurax nhất nhưng tôi sẽ sửa đổi điều này cho một email ẩn hơn một chút:

onclick="p1='admin'; p2='domain.com'; this.href='mailto:' + p1 + '& #x40;' + p2"

0

Tôi chỉ cần cung cấp một câu trả lời khác. Tôi chỉ nghĩ ra một cái gì đó thú vị để chơi với.

Tôi phát hiện ra rằng trong nhiều bảng ký tự phổ biến, các chữ cái @ và az xuất hiện lại nhiều lần. Bạn có thể ánh xạ các ký tự gốc vào các ánh xạ mới và khiến các bot spam khó tìm ra e-mail là gì.

Nếu bạn lặp qua chuỗi và lấy mã ký tự của một chữ cái, sau đó thêm 65248 vào nó và xây dựng một thực thể html dựa trên số đó, bạn sẽ tìm thấy một địa chỉ email có thể đọc được của con người.

var str = 'john.doe@email.com';
str = str.toLowerCase().replace(/[\.@a-z]/gi, function(match, position, str){
    var num = str.charCodeAt(position);
    return ('&#' + (num + 65248) + ';');
});

Đây là một fiddle làm việc: http://jsfiddle.net/EhtSC/8/

Bạn có thể cải thiện phương pháp này bằng cách tạo một bộ ánh xạ hoàn chỉnh hơn giữa các ký tự trông giống nhau. Nhưng nếu bạn sao chép / dán e-mail vào notepad chẳng hạn, bạn sẽ nhận được rất nhiều hộp.

Để khắc phục một số vấn đề về trải nghiệm người dùng, tôi đã tạo e-mail dưới dạng liên kết. Khi bạn bấm vào nó, nó sẽ ánh xạ lại các ký tự trở về bản gốc của chúng.

Để cải thiện điều này, bạn có thể tạo ánh xạ ký tự phức tạp hơn nếu muốn. Nếu bạn có thể tìm thấy một số ký tự có thể được sử dụng, ví dụ ở vị trí 'a', tại sao không ánh xạ ngẫu nhiên tới các ký tự đó.

Có lẽ không phải là cách tiếp cận an toàn nhất từng có nhưng tôi thực sự rất vui khi chơi với nó: D

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.