Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: автоблокировка ip в htaccess
Форумы портала PHP.SU » » Вопросы новичков » автоблокировка ip в htaccess

Страниц (1): [1]
 

1. valkiriy - 08 Декабря, 2013 - 23:58:47 - перейти к сообщению
Доброй ночи,

имеется файрволл на php который ведет логи:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. 8-12-2013 23:44:26 | Bots attack | IP: 176.106.208.4 ] | DNS: 176-106-208-4.point.lviv.ua | Agent: Mozilla/2.0 (compatible; MSIE 3.02; Update a; AK; Windows NT) | URL: / | Referer: 5853bm203s.ru
  3.  

но файрволл достаточно слабый и хостинг замораживает аккаунт во избежания нагрузки.
решил перехитрить написанием скрипта который будет автоматом читать логи и вносить ip с опр флагами в htaccess на блокировку:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $log = file("logs.txt");
  4. for($i = 0; $i < count($log); $i++)
  5. {
  6. if(preg_match('|'.preg_quote('Bots attack | IP: ', '/').'(.*?)'.preg_quote(' ', '/').'|is', $log[$i], $atkstr))
  7. {
  8. $atkstrout = preg_replace("/Bots attack \| IP: /i","",$atkstr[0]);
  9. $atkstrout = preg_replace("/ /i","",$atkstrout);
  10. $file = file(".htaccess");
  11. $num_stroka = count($file);
  12. $num_stroka = $num_stroka-1;
  13. unset($file[$num_stroka]);
  14. $num_stroka = $num_stroka-1;
  15. unset($file[$num_stroka]);
  16. $fp = fopen(".htaccess", "w");
  17. $endfile="".implode("", $file)." deny from ".$atkstrout."\n allow from all\n</Limit>";
  18. fputs($fp, $endfile);
  19. fclose($fp);
  20. }
  21. }
  22. ?>

и тут встала задача сравнить есть ли в .htaccess ip в черном листе или нет
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $file = file(".htaccess");
  4. $BlackList = array();
  5. for($x = 0; $x < count($file); $x++)
  6. {
  7. if(preg_match('|deny from (.*?)\n deny from|is', $file[$x], $ipblock))
  8. {
  9. $ipblockout = preg_replace("/deny from /i","",$ipblock[0]);
  10. $ipblockout = preg_replace("/ \n deny from/i","",$ipblockout);
  11. array_push($BlackList, $ipblockout);
  12. }
  13. }
  14. }
  15. in_array($atkstrout, $BlackList);
  16. ?>
  17.  

пытаюсь парсить .htaccess а он не парсится.... не пойму почему и без этого не могу сделать проверку...
конечный скрипт по моим замыслам должен был иметь такой вид:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $log = file("logs.txt");
  4. $BlackList = array();
  5. for($i = 0; $i < count($log); $i++)
  6. {
  7. if(preg_match('|'.preg_quote('Bots attack | IP: ', '/').'(.*?)'.preg_quote(' ', '/').'|is', $log[$i], $atkstr))
  8. {
  9. $atkstrout = preg_replace("/Bots attack \| IP: /i","",$atkstr[0]);
  10. $atkstrout = preg_replace("/ /i","",$atkstrout);
  11. $file = file(".htaccess");
  12. for($x = 0; $x < count($file); $x++)
  13. {
  14. if(preg_match('|deny from (.*?)\n deny from|is', $file[$x], $ipblock))
  15. {
  16. $ipblockout = preg_replace("/deny from /i","",$ipblock[0]);
  17. $ipblockout = preg_replace("/ \n deny from/i","",$ipblockout);
  18. array_push($BlackList, $ipblockout);
  19. }
  20. }
  21. }
  22. if(!in_array($atkstrout, $BlackList))
  23. {
  24. $num_stroka = count($file);
  25. $num_stroka = $num_stroka-1;
  26. unset($file[$num_stroka]);
  27. $num_stroka = $num_stroka-1;
  28. unset($file[$num_stroka]);
  29. $fp = fopen(".htaccess", "w");
  30. $endfile="".implode("", $file)." deny from ".$atkstrout."\n allow from all\n</Limit>";
  31. fputs($fp, $endfile);
  32. fclose($fp);
  33. }
  34. }
  35. }
  36. ?>

(Добавление)
нашел ошибку в регулярке и
PHP:
скопировать код в буфер обмена
  1. preg_match('|deny from (.*?)\n deny from|is', $file[$x], $ipblock)

поменял на
PHP:
скопировать код в буфер обмена
  1. preg_match('|deny from (.*)|is', $file[$x], $ipblock)
2. teddy - 09 Декабря, 2013 - 00:26:59 - перейти к сообщению
valkiriy пишет:
сравнить есть ли в .htaccess ip

а не проще
PHP:
скопировать код в буфер обмена
  1. $htaccess = file_get_contents(".htaccess");
  2. if(stristr($htaccess, $ip)){
  3.     echo 'Такой IP уже есть в htaccess';
  4. }else{
  5.     echo 'Нет совпадений по IP';
  6. }

чем лепить тонну кода с регулярками?
3. valkiriy - 09 Декабря, 2013 - 00:34:27 - перейти к сообщению
Оу благодарю)))) ну я легких путей не ищу)
4. teddy - 09 Декабря, 2013 - 00:41:42 - перейти к сообщению
valkiriy пишет:
ну я легких путей не ищу

ну это не всегда хорошо... если можно что то написать короче и при этом не нарушить логику приложения, то как правило нужно писать короче Улыбка
сложные пути нужны только тогда когда они нужны

 

Powered by ExBB FM 1.0 RC1