Поисковики атакуют?

12
dlyanachalas
На сайте с 15.09.2006
Offline
693
#11
victim:
А ведь через .htaccess можно прямо по подсети забанить...хм, хотя вдруг юзер какой целевой попадет в бан...наверное бан по подсети отметается??? Как думаете?

Думаю, по подсети опасно, вы правильно думаете про целевых посетителей. Подсеть точно не надо. Да и в бан по конкретному ip тоже может кто-то хороший попасть...

Если уж совсем всё по уму делать, то предлагаю такой вариант:

1. При каждом заходе на страницу записываем $REMOTE_ADDR в базу MySQL и время (до секунды) доступа. При этом предварительно проверяем базу на наличие в ней такого $REMOTE_ADDR и если он там есть, то смотрим, сколько страниц он этот ip просмотрел за последний час (минуту). Если больше скольки-то (подобрать можно только опыткым путём), то начинаем сканировать хуиз $REMOTE_ADDRа с помощью функции, которую я привёл ниже.

2. Если при проверке функции вылез "TurkTelecom" или ещё одно из запретных слов, то тогда выдаём 404 ошибку.

victim:
А вот этот кусок php кода! Где что менять надо?
МОжно такой небольшой мануальчик?

Так а что там непонятно? Давайте я в виде функции перепишу:

function testip($ip, $bantextarray)
{
$ban = false;

$sock = fsockopen ("whois.ripe.net",43,$errno,$errstr);

if (!$sock)
{
return;
}
else
{
fputs ($sock, $ip."\r\n");

$country = "";
$city = "";
$lastcity = "";

while (!feof($sock))
{
$str = fgets ($sock,128);

foreach ($bantextarray as $bantext )
{
if (strpos($str, $bantext ) > 0)
{
$ban = true;
break;
}
}
if ($ban)
{
break;
}

}

fclose ($sock);
}

Итого, общий алгоритм:

dlyanachalas
На сайте с 15.09.2006
Offline
693
#12
<?

// функция проверки ip
// требуется две таблицы - ips, поля ip - VARCHAR(20) и dat - DATETIME
// и whiteip (список уже проверенных ip, чтобы снизить нагрузку на сервер) - поля - ip - VARCHAR(20)

function correctip($ip)
{
$query = "SELECT ip FROM whiteip WHERE ip='$ip'";

if ($record = mysql_query($query))
{
if ($row = mysql_fetch_object($query))
{
return true;
}
}

$start = strftime ('%Y-%m-%d %H:%M:%S', localtime(time() - 60 * 60)); // проверяем за последний час
$end = strftime ('%Y-%m-%d %H:%M:%S');
$query = "SELECT count(ip) as raz FROM ips WHERE ip='$ip' and dat>='$start' and dat <='$end'";

if ($record = mysql_query($query))
{
if ($row = mysql_fetch_object($query))
{
if ($row->raz > 100) // если больше 100 страниц за час, то
{
return false;
}
}
}

// добавляем в базу
$query = "INSERT INTO ips (ip, dat) VALUES ('$ip', '$end')";
mysql_query($query);

return true;
}

$bantextarray[] = "TurkTelecom";
$bantextarray[] = "Вася Пупкин";
// и т.д.

if (!correctip($REMOTE_ADDR))
{
if (!testip($REMOTE_ADDR, $bantextarray))
{
header("HTTP/1.0 404 Not Found");
exit;
}
else
{
$query = "INSERT INTO whiteip (ip) VALUES ('".$REMOTE_ADDR."')";
mysql_query($query);
}
}

?>

Вроде так. Если что, то можем обсудить, улучшить и т.д.)

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий