Pull to refresh

Еще один способ защиты от спама отображаемых на сайте емейлов

Reading time3 min
Views1.8K
Проблема защиты от спама емейлов, выложенных на сайте, уже наболевшая и давно затертая до дыр. Но я случайно нашел еще один способ борьбы.

Можно, конечно, использовать следующие способы защиты:
— Графическое изображение
— Замену символов. Типа spam[at]must[dot]die
— Вывод через js вида
var login = 'spammer';
var server = 'must.die';
var email = login+'@'+server;
var url = 'mailto:'+email;
document.write('<a href="'+url+'">'+email+''
);


— можно использовать простенький вывод &#ANSI_код_символа; на php:
$email = 'spammer@must.die';
$url = 'mailto:spammer@must.die';
$safe_email=$safe_url='';
for($i=0; $i<strlen($email); $i++){
   $safe_email .= '&#'.ord($email{$i}).';';
}
for($i=0; $i<strlen($url); $i++){
   $safe_url .= '&#'.ord($url{$i}).';';
}
print "<a href='$safe_url'>$safe_email</a>";


Когда для моего последнего проекта print-com.biz нужно было сделать защиту выкладываемого мыла от спама, то в поисках оного наткнулся на этот интересный сервис.
Пошарив в коде, получим:
  function encode(email, text, tpl) {
    var t = tpl.replace(/{e}/g, email);
    var a = t.replace(/{text}/g, text);
    t = "";
    for (i = 0; i < a.length; i++) {
      if (a.charCodeAt(i) <= 127) {
        t += (String.fromCharCode(Math.floor(a.charCodeAt(i) / 16) + 65))
        t += (String.fromCharCode(a.charCodeAt(i) % 16 + 65));
      } else {
        t += a.charAt(i);
      }
    }
    var to = t;

    return t;
  }
  function decode(a) {
    var t = "";
    for (i = 0; i < a.length; i++) {
      t += (a.charCodeAt(i) <= 127) ?
        String.fromCharCode((a.charCodeAt(i) - 65 ) * 16 + (a.charCodeAt(++i) - 65))
        :
        a.charAt(i);
    }
    return t;
  }

* This source code was highlighted with Source Code Highlighter.


Возникает закономерный вопрос, а почему бы не реализовать нечто подобное, скажем, на php?
И вот, что получилось.

function encode_email($email, $text = null, $tpl = null)
{
  if (empty($email)) return false;
  if ($tpl === null) $tpl = "<A HREF=\"mailto:{e}\">{text}</A>";
  if ($text === null) $text = $email;
  $t = str_replace('{e}', $email, $tpl);
  $a = str_replace('{text}', $text, $t);
  $result = '';
  for($i = 0; $i < strlen($a); $i++) {
    if (ord($a[$i]) <= 127) {
      $result .= chr(floor(ord($a[$i]) / 16) + 65)
      . (string)chr(ord($a[$i])%16 + 65);
    } else {
      $result .= (string)$a[$i];
    }
  }
  $code = "";
  $code .= "<script type=\"text/javascript\">"
  . "a=\"" . $result . "\";"
  . "for(i=0;i< a.length;i++){document.write((a.charCodeAt(i)<=127)?String.fromCharCode((a.charCodeAt(i)-65)*16+(a.charCodeAt(++i)-65)):a.charAt(i))}"
  . "</" . "script>"
  . "<noscript>".str_replace(array('@', '.'), array('©','·'), $email)."</noscript>";

  return $code;
}




В итого для мыла spam[at]must.die получается, что-то типа:
DMEBCAEIFCEFEGDNCCGNGBGJGMHEGPDKHDHAGBGNEAGNHFHDHECOGEGJGFCCDOНаписатьCAписьмоCAбезCAспамаDMCPEBDO.
А после декодирования средствами js мы видим нормальную ссылку на email.

Так что пинайте, только не очень больно. Буду благодарен за любую критику по делу.
Tags:
Hubs:
+31
Comments79

Articles