Еще один способ защиты от спама отображаемых на сайте емейлов
Раздел:
Programming /
Вебмастеру
@
26.10.2008 |
Ключевые слова: спам антиспам spam защита от спама
Автор: snnwolf
Источник: habrahabr
Проблема защиты от спама емейлов, выложенных на сайте, уже наболевшая и давно затертая до дыр. Но я случайно нашел еще один способ борьбы.
Можно, конечно, использовать следующие способы защиты:
— Графическое изображение
— Замену символов. Типа 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.
Так что пинайте, только не очень больно. Буду благодарен за любую критику по делу.
Вернуться в раздел:
Programming /
Вебмастеру