Как защитить E-mail на сайте от спама?

Проблема защиты от спама емейлов, выложенных на сайте, уже наболевшая и давно затертая до дыр. Но я случайно нашел еще один способ борьбы.
Можно, конечно, использовать следующие способы защиты:
— Графическое изображение
— Замену символов. Типа 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="http://articles.org.ru/cn/go.php?+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.

Так что пинайте, только не очень больно. Буду благодарен за любую критику по делу.

Метки записи: