Предлагаю изменить подход к проблеме и сделать правильно.
Т.е. не заморачиваться на конкретном случае.
Отталкиваться от мысли, что адресов может быть сколько угодно и вид они могут иметь любой (хосты или ипы) и ещё могут быть диапазоны этих самых хостов или ипов. Вот. Примера в два часа ночи писать не буду, думать нужно. Пока подумайте сами на этот счёт.
11. ETC - 07 Апреля, 2006 - 18:18:12 - перейти к сообщению
12. SviMik - 07 Апреля, 2006 - 18:31:31 - перейти к сообщению
ETC пишет:
Примера в два часа ночи писать не буду
Так бы сразу и сказал Если чесно, мне тоже в это время думается плохо, вот и спросил...
CODE:
if($_SERVER['HTTP_X_FORWARDED_FOR']!=''){
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$ip = $_SERVER['REMOTE_ADDR'];
}
$banlist='84.52.1.47, 127.0.0.1, 1.2.3.4, 4.3.2.1';
if(preg_match("/$ip/", $banlist){
die("тебе сюда нельзя!!!");
}
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$ip = $_SERVER['REMOTE_ADDR'];
}
$banlist='84.52.1.47, 127.0.0.1, 1.2.3.4, 4.3.2.1';
if(preg_match("/$ip/", $banlist){
die("тебе сюда нельзя!!!");
}
По идее должно пахать. тока по маске это надо подумать, по этому поводу я уже выше сказал
13. RaZoR - 07 Апреля, 2006 - 18:40:49 - перейти к сообщению
кажется, я уже где-то постил эту функцию, но вот еще раз
использовать так
можно теперь перед проверкой добавить получение IP из хоста.
CODE:
function testip($range,$ip)
{
$result=1;
$maskocts=split("\.",$range);
$ipocts=split("\.",$ip);
for ($i=0;$i<4;$i++)
{
if (ereg("\[([0-9]+)\-([0-9]+)\]",$maskocts[$i],$regs))
{
if (($ipocts[$i]>$regs[2])||($ipocts[$i]<$regs[1])) $result=0;
}
else
{
if ($maskocts[$i]<>$ipocts[$i]) $result=0;
}
}
return $result;
}
{
$result=1;
$maskocts=split("\.",$range);
$ipocts=split("\.",$ip);
for ($i=0;$i<4;$i++)
{
if (ereg("\[([0-9]+)\-([0-9]+)\]",$maskocts[$i],$regs))
{
if (($ipocts[$i]>$regs[2])||($ipocts[$i]<$regs[1])) $result=0;
}
else
{
if ($maskocts[$i]<>$ipocts[$i]) $result=0;
}
}
return $result;
}
использовать так
CODE:
, где сначала указывается забаненный IP (можно с маской), а затем проверяемый IP.echo testip('192.128.[13-19].[1-58]','192.128.19.58');
можно теперь перед проверкой добавить получение IP из хоста.
14. TvoyWeb - 07 Апреля, 2006 - 18:50:02 - перейти к сообщению
Лучше всего хранить IP-шники уже в виде Regexp шаблона и в виде массива.
Например так:
Например так:
CODE:
$ip_array = Array (
[0] => 82\.151\.102\.\d{1,3},
[1] => 195\.58\.229\.\d{1,3},
[2] => 82\.209\.217\.163,
[3] => 195\.245\.185\.18,
[4] => 66\.202\.75\.19,
[5] => 82\.209\.228\.126,
[6] => 59\.120\.0\.127,
[7] => 66\.197\.205\.5
)
$ip = 'текущий IP пользователя';
foreach ($ip_array as $b_ip) {
if (preg_match("#^$b_ip#",$ip)) {
die("С новым годом! Пошел нафик");
break;
}
}
[0] => 82\.151\.102\.\d{1,3},
[1] => 195\.58\.229\.\d{1,3},
[2] => 82\.209\.217\.163,
[3] => 195\.245\.185\.18,
[4] => 66\.202\.75\.19,
[5] => 82\.209\.228\.126,
[6] => 59\.120\.0\.127,
[7] => 66\.197\.205\.5
)
$ip = 'текущий IP пользователя';
foreach ($ip_array as $b_ip) {
if (preg_match("#^$b_ip#",$ip)) {
die("С новым годом! Пошел нафик");
break;
}
}
15. RaZoR - 12 Апреля, 2006 - 21:38:25 - перейти к сообщению
TvoyWeb
как вариант да, но таким образом нельзя заблокировать доступ для определенного диапазона IP. допустим 192.167.19.[15-19].. только 192.167.19.*
как вариант да, но таким образом нельзя заблокировать доступ для определенного диапазона IP. допустим 192.167.19.[15-19].. только 192.167.19.*
16. TvoyWeb - 13 Апреля, 2006 - 06:34:25 - перейти к сообщению
RaZoR пишет:
допустим 192.167.19.[15-19].. только 192.167.19.*
Ну это просто надо подумать как сформировать шаблон.
17. SviMik - 13 Апреля, 2006 - 14:34:25 - перейти к сообщению
Пишу сейчас один скрипт. Вот, выдрал. Чуть ли не самое ценное в нём
Зы. Професионалов прошу не смеятся. Знаю что наверняка можно было сделать и проще\короче\компактнее. Сделал как умею. Но оно пашет!
ЗЫ. При копировании отдельных кусков и дописывании мог пропустить какую-нидь скобку.Это на случай если не заработает, т.к. конкретно этот код не проверял.
Файл banlist.txt:
В конец каждой строки ставится точка (чтобы избежать обработки переноса строки). Если причина не указана - оставляете просто точку (и точку в конце строки. Итого 2 точки).
NB! Скрипт не понимает маски вида 84.52.1.4* Алгоритм заключается в делении айпишника на 4 части. И каждая часть должна либо совпасть с IP юзера либо быть просто звёздочкой. Сам лично не вижу необходимости в такой маске, ну на всякий случай...
У меня там была ещё удобная панель управления, записывалась дата забанивания, писались логи и т.д. но это уже не втему, поэтому тут баня демо версии.
Зы. Професионалов прошу не смеятся. Знаю что наверняка можно было сделать и проще\короче\компактнее. Сделал как умею. Но оно пашет!
CODE:
if($_SERVER['HTTP_X_FORWARDED_FOR']!=''){
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$ip = $_SERVER['REMOTE_ADDR'];
}
list($ip1, $ip2, $ip3, $ip4) = split('[.]', $ip);
$banlist = fopen('banlist.txt','r');
$tmpb = fgets($banlist);
while($tmpb && $banned!='1'){
list($tmpb1, $tmpb2, $tmpb3, $tmpb4, $reason) = split('[.]', $tmpb);
if($tmpb1==$ip1 | $tmpb1=='*'){
if($tmpb2==$ip2 | $tmpb2=='*'){
if($tmpb3==$ip3 | $tmpb3=='*'){
if($tmpb4==$ip4 | $tmpb4=='*'){
$banned='1';
}
}
}
}
$tmpb = fgets($banlist);
}
fclose($banlist.dat);
if(!$reason){$reason='Не указана';}
if($banned=='1'){
die('Вы забанены. Причина: '.$reason);
if($_SERVER['HTTP_X_FORWARDED_FOR']!=''){
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$ip = $_SERVER['REMOTE_ADDR'];
}
list($ip1, $ip2, $ip3, $ip4) = split('[.]', $ip);
$banlist = fopen('banlist.txt','r');
$tmpb = fgets($banlist);
while($tmpb && $banned!='1'){
list($tmpb1, $tmpb2, $tmpb3, $tmpb4, $reason) = split('[.]', $tmpb);
if($tmpb1==$ip1 | $tmpb1=='*'){
if($tmpb2==$ip2 | $tmpb2=='*'){
if($tmpb3==$ip3 | $tmpb3=='*'){
if($tmpb4==$ip4 | $tmpb4=='*'){
$banned='1';
}
}
}
}
$tmpb = fgets($banlist);
}
fclose($banlist.dat);
if(!$reason){$reason='Не указана';}
if($banned=='1'){
die('Вы забанены. Причина: '.$reason);
ЗЫ. При копировании отдельных кусков и дописывании мог пропустить какую-нидь скобку.Это на случай если не заработает, т.к. конкретно этот код не проверял.
Файл banlist.txt:
CODE:
84.52.1.47.Тест.
84.52.*.*.Забаним полгорода.
127.0.0.1.Сам дурак.
*.*.*.*.У админа плохое настроение! =).
1.2.3.4..
84.52.1.47.Тест.
84.52.*.*.Забаним полгорода.
127.0.0.1.Сам дурак.
*.*.*.*.У админа плохое настроение! =).
1.2.3.4..
В конец каждой строки ставится точка (чтобы избежать обработки переноса строки). Если причина не указана - оставляете просто точку (и точку в конце строки. Итого 2 точки).
NB! Скрипт не понимает маски вида 84.52.1.4* Алгоритм заключается в делении айпишника на 4 части. И каждая часть должна либо совпасть с IP юзера либо быть просто звёздочкой. Сам лично не вижу необходимости в такой маске, ну на всякий случай...
У меня там была ещё удобная панель управления, записывалась дата забанивания, писались логи и т.д. но это уже не втему, поэтому тут баня демо версии.
18. TvoyWeb - 13 Апреля, 2006 - 15:51:42 - перейти к сообщению
2ALL
Посмотрите как записываются забаненные IP адреса в базу. Во время записи идет построение шаблона для будущего сравнения. При желании можно модифицировать скрипт, чтобы можно было банить по маске как писал RaZoR
Посмотрите как записываются забаненные IP адреса в базу. Во время записи идет построение шаблона для будущего сравнения. При желании можно модифицировать скрипт, чтобы можно было банить по маске как писал RaZoR
19. SviMik - 13 Апреля, 2006 - 16:05:36 - перейти к сообщению
TvoyWeb
А где же скрипт который записывает адреса в базу? Раз такая сложная запись, то ессно не вручную должны эти Regexp составлятся...
А где же скрипт который записывает адреса в базу? Раз такая сложная запись, то ессно не вручную должны эти Regexp составлятся...
20. TvoyWeb - 13 Апреля, 2006 - 16:25:08 - перейти к сообщению
SviMik
Там же. Смотри в папке модуля.
Там же. Смотри в папке модуля.