Как защитить почту на сайте от спамеров (автопарсинг)?

Здравствуйте.

У меня, может, и странный, но вопрос - как можно защитить почту на сайте, чтобы для обычного посетителя это был стандартный mailto, а робот, сканирующий сайт, не смог ее обнаружить?

Тот же вопрос и для телефона (там нет mailto, но хочется оставить возможность копирования номера).

Сайт достаточно хорошо заточен под мобильники, желательно, чтобы решение работало и там.
  • Вопрос задан
  • 2512 просмотров
Решения вопроса 1
Сделайте поле mailto изначально пустым, а слева ссылку "Показать почту" или "Отправить почту", на которую повесьте JS-обработчик, который будет создавать (вычислять или расшифровывать) итоговое поле "mailto" по какому-нибудь несложному алгоритму. Наверное, потом можно из него же и onClick над вторым (собранным) полем вызвать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Habazlam
Из глубины веков:

#!/usr/bin/perl
# Usage (SSI):
# <!--#include virtual="this_file.cgi?email=realemail@domain.tld&fakedemail=fakedemail@domain.tld&text=Some text (may contain e-mails)" -->
#
print "Content-type: text/html\n\n";
&ParseInput;
$JSEMailArray = '\\\''. join ('\\\',\\\'',(split('',$email))) .'\\\'';
$JSTextArray = '\''. join ('\',\'',(split('',$text))) .'\'';
$JSOut = q|<script language=javascript>document.write('<a href="mailto:%%fakedemail%%" onmouseover="email = new Array(%%JSEMailArray%%);this.href=\'mailto:\';for(i=0;i<email.length;i++){this.href+=email[i]}">')</script><script language=javascript>text=new Array(%%JSTextArray%%);for(i=0;i<text.length;i++){document.write(text[i])}</script><script language=javascript>document.write('</a>')</script>|;
$JSOut =~ s|%%(.*?)%%|$$1|ge;
print $JSOut;
exit;

sub ParseInput       { #GET only
@allowednames=('email','text','fakedemail');
 if    ($ENV{'REQUEST_METHOD'} =~ m/^get$/i){@pairs=split(/&/,$ENV{'QUERY_STRING'})}
 else  {print ''; exit}
 foreach $pair (@pairs) {
  local($name, $value) = split(/=/, $pair);
  $name =~ tr/+/ /;
  $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1))/eg;
  $name =~ tr/\0//d;
  $value =~ tr/+/ /;
  $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1))/eg;
  $value =~ tr/\0//d;
  $value =~ s/<!--(.|\n)*-->//g;
  $found = '';
   foreach $allowedname(@allowednames){if($allowedname eq $name){$found='OK';last}}
   unless ($found){print '';exit}
  $$name = $value;
 }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы