Автоматически забанить юзера

Автор Idrassil, 11 марта 2012, 02:21:31

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Idrassil

Пишу мод, который в определенных обстоятельствах должен забанить пользователя, точнее айпи адрес. Насколько я понял (путем исследований), баны добавляются в две таблицы, smf_ban_groups и smf_ban_items. Могу расписать подробно, для чего какое поле, но щас речь не об этом.

Я написал код, который банит, но почему-то он не банит юзера моментально. Если закрыть браузер/удалить куки, и опять зайти,то бан срабатывает аж тогда, а не раньше. В чем может быть причина? Я пробовал уже удалять куки для сессии, устанавливать куки как при бане, делать редирект - все равно толку 0.

В общем, как правильно забанить, чтобы юзеру сразу же отобразилось, что он забанен? Может кто-нибудь кодил такое?

И еще - как считаете, если мне требуются баны только айпи, может лучше банить через хтакцесс (а не через форум)? Что-то вида (псевдокод):
fopen (htaccess,a+)
fwrite \r\n deny from 127.0.0.1
fclose

Как лучше?

digger®

ЦитироватьЯ написал код, который банит, но почему-то он не банит юзера моментально. Если закрыть браузер/удалить куки, и опять зайти,то бан срабатывает аж тогда, а не раньше. В чем может быть причина? Я пробовал уже удалять куки для сессии, устанавливать куки как при бане, делать редирект - все равно толку 0.
Возможно, нужно еще делать это
http://support.simplemachines.org/function_db/index.php?action=view_function;id=112

Mr. Anviss

#2
Цитата: Idrassil от 11 марта 2012, 02:21:31Как лучше?
а если так, как один из вариантов?
iptables -I INPUT -s IP -p tcp --dport 80 -j DROP

Idrassil

digger, спасибо, но все равно не работает как надо, т.е. бан добавляется, а толку нет. Может надо банить стандартными средствами в таком случае? Я делаю примерно так:

$reminder = "Reminder".$curr_time; //имя бана
$reason = "Восстановление пароля к профилю ".$retr_user; //$retr_user - имя юзера переданное пост-запросом, к которому восстанавливать запрещено.

$add_ban0 = "INSERT INTO ".$db_prefix."ban_groups (`name`,`ban_time`,`expire_time`,`cannot_access`,`reason`,`notes`) VALUES (\"$reminder\",".$curr_time.",NULL,1,'Сообщение для забаненого',\"$reason\")";
mysql_query($add_ban0) or die (mysql_error());


$id_ban_group = mysql_insert_id();

$add_ban1 = "INSERT INTO ".$db_prefix."ban_items (`id_ban_group`,`ip_low1`,`ip_high1`,`ip_low2`,`ip_high2`,`ip_low3`,`ip_high3`,`ip_low4`,`ip_high4`,`id_member`,`hits`) VALUES ($id_ban_group,".$arr_ip[0].",".$arr_ip[0].",".$arr_ip[1].",".$arr_ip[1].",".$arr_ip[2].",".$arr_ip[2].",".$arr_ip[3].",".$arr_ip[3].",0,0)";
mysql_query($add_ban1) or die (mysql_error());

updateBanMembers();


/* пробовал еще - не помогает

unset ($_SESSION['PHPSESSID']);
setcookie("SMFCookie15_","16");
header ("Location: http://smftest2.su"); */
die ("восстановление пароля к профилю $retr_user запрещено.Ваш айпи заблокирован");


Mr. Anviss, а как это вызвать с php? Я не силен в линуксе просто. Командой system?

Mr. Anviss

#4
Если у тебя есть возможность и права создаешь 2 файла, например: add_ban_ip.sh и ip_address.txt (находятся в одном каталоге)
Файлу add_ban_ip.sh даешь права на исполнение вот так: chmod 0777 add_ban_ip.sh (с учетом того, что ты находишься в каталоге с файлом)
Содержимое файла add_ban_ip.sh:

#!/bin/bash
iptables -F
cat ip_address.txt | while read line
do
iptables -I INPUT -s $line -p tcp --dport 80 -j DROP
done
exit 0;

Запускаешь этот файл кроном с той периодичностью какой тебе надо, например раз в час
Соответственно почувствовать себя забаненым ты сможешь лишь после того как отработает файл add_ban_ip.sh
В файле ip_address.txt находятся IP-шники по одному на строку, добавляешь или удаляешь их оттдуда/туда с помощью своего мода на php

Здесь правда есть минус. Если записей в файле ip_address.txt очень много и обновлять правила для файрвола сильно часто то это может подзагрузить сервер.

P.S. Этот метод похож на вскрытие консервной банки с помощью экскаватора.