Анти-бот система комментариев


С некоторыми советы от Поэтому, я разработал эту систему, которую я считаю достаточно сильным для ботов для автоматического комментирования.

index.php

<html>
<head>
<script type="text/javascript" src="jquery.js"></script>
<script>
function main()
{
 var str=$("#key").load("getToken.php",function (responseText) {
                                                 $("#key").val(responseText);
                                               }
      );
 setTimeout("main()", 100000);
}
</script>
</head>
 <body onload='main()'>
 <form name="f" action="poster.php" method="post">
  <input type="text" name="text"/><br>
  <input type="text" name="key" id="key" value=""/><br>
  <input type="submit">
 </form>
</body>
</html>

getToken.php

<?php
 $key=date("Y-m-d H:i:s");
 $hash=sha1($key.'mySecretKey');
 echo $key.'#'.$hash;
?>

poster.php

<?php
if (!isset($_POST['key']))
 exit;

$parts = explode('#',$_POST['key'],2);
$key = $parts[0];
$hash = $parts[1];

$date1 = $key;
$date2 = date("Y-m-d H:i:s");
$diff = abs(strtotime($date2) - strtotime($date1)); 
$years   = floor($diff / (365*60*60*24)); 
$months  = floor(($diff - $years * 365*60*60*24) / (30*60*60*24)); 
$days    = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));
$hours   = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24)/ (60*60)); 
$minuts  = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24 - $hours*60*60)/ 60); 
$seconds = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24 - $hours*60*60 - $minuts*60)); 

if ($seconds < 5)
 echo $seconds.' Too fast, must be a naughty bot <br>';
else if ($seconds>5 && $seconds < 600)
 echo $seconds.' In time <br>';
else
 echo $seconds.' time out <br>';

if ($hash == (sha1($key.'sou')))
 echo $_POST['text'];
else
 echo 'You are a bot !';
?>


1590
7
задан 11 мая 2011 в 09:05 Источник Поделиться
Комментарии
2 ответа


  • 365*60*60*24 должна быть постоянная.

  • Вы должны действительно улучшить ваш именования переменных.

    $date2 = date("Y-m-d H:i:s");

  • дата2? Это что-нибудь сказать? значение currentTime больше нравится. Всегда описывать то, что переменные содержат, не то, что они есть.

  • Не $дифф уже количество секунд?

  • Большая часть дата/время проверки можно переписать:

    $seconds = time() - strtotime($key);

6
ответ дан 11 мая 2011 в 10:05 Источник Поделиться

Почему вы используете АБС()?

Зачем там 6-7 строк кода, чтобы просто получить количество секунд между каждой метки? Просто использовать разницу между использованием$_SERVER['REQUEST_TIME'] и все время вытаскивают из маркера.

Если все, что вы делаете, это проверяете скорость отправки, т. е.. между загрузкой страницы и последующем представить в виде, тогда вам не нужно фантазии хэшированных маркер - и вы определенно не нужны JavaScript! Просто писать во время загрузки страницы в скрытом поле, или хранить его в сессии и сравнить время отправки.

Кроме того, большинство ботов отключить JavaScript, так что обесценивает всю вашу решение.

Мой совет: зарегистрируйтесь на askimet или другой 3-й партии спам обслуживание, свернуть свою собственную библиотеку обнаружения спама с кучей ключевых слов / фраз.

Не принимайте это неправильный путь - хорошая попытка & продолжать усилия! :)

3
ответ дан 26 мая 2011 в 01:05 Источник Поделиться