Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] skrypt banowania
Forum PHP.pl > Forum > PHP
pitu
Witam

Mam skrypt ban listy na swojej stronie, korzysta ona z pliku ban.txt niby wszystko ok jak mam dopisane 1 ip do działa ale jak dopiszę następne np. po spacji albo enterze to już nie działa(osoby z tymi ip mogą wejść na stronę) czy ktoś może zobaczyć ten skrypt i w razie czego przerobić go aby można było dopisywać ip po spacji czyli np. 53.21.252.253 53.21.252.257

Oto ten skrypt:

-kod wklejany do index.php
  1. <?php
  2. include( 'cfg/ban.lib.php' );
  3.  if( ban( file( 'cfg/ban.txt' ), $_SERVER['REMOTE_ADDR'] ) ) {
  4. die( 'Twoje ip jest zbanowane'.$_SERVER['REMOTE_ADDR'].'' );
  5.  }
  6. ?>


-plik ban.lib.php
  1. <?php
  2. function ban( $arrList, $ip ) {
  3. if( in_array( $ip, $arrList ) ) {
  4.  return TRUE;
  5. }
  6. $replace = array( '*' => '([0-9]{1,3})', '?' => '([0-9]{1})', '.' => '.');
  7.  
  8. foreach( $arrList AS $key => $value ) {
  9. if( preg_match( '#^'.strtr( $value, $replace ).'$#', $ip ) ) {
  10.  return TRUE;
  11. }
  12.  
  13. }
  14.  
  15. return FALSE;
  16.  }
  17. ?>


Z góry dziękuję za pomoc
Lonas
Spróbuj tak

  1. <?php
  2. include( 'cfg/ban.lib.php' );
  3.  if( ban( file_get_contents( 'cfg/ban.txt' ), $_SERVER['REMOTE_ADDR'] ) ) {
  4. die( 'Twoje ip jest zbanowane'.$_SERVER['REMOTE_ADDR'].'' );
  5.  }
  6. ?>
  7.  
  8. //drugi plik
  9.  
  10. <?php
  11. function ban( $arrList, $ip ) 
  12. {
  13.  $arrIP = explode(" ",$arrList); 
  14.  
  15.  if( in_array( $ip, $arrIP ) ) 
  16.  return TRUE;
  17.  else
  18.  return FALSE;
  19. }
  20. ?>
nevt
funkcja in_array() nie znajduje ci IP ponieważ standardowo file() w każdym wierszu zwraca też znaki końca linii, zmień na:
  1. <?php
  2. if( ban( file( 'cfg/ban.txt', FILE_IGNORE_NEW_LINES), $_SERVER['REMOTE_ADDR'] ) ) {
  3. ?>

i będzie działać. kolejne wpisy IP umieszczaj w osobnych liniach pliku, bez żadnych spacji przed lub po... powodzenia.
pitu
To tak kod podany przez @Lonas troszkę mniej mniej interesuje, ponieważ chciałbym mieć banowanie z maskami (np. 54.65.*) a po zmianie podanej przez @nevt jest tak, że wstawiam np. tak ip do txt:
  1. 83.21.253.52
  2. 83.21.253.54
  3. 83.21.253.51


To wtedy banuje tylko podany jako ostatni ip, gdy wstawię swój ip jako np. pierwszy albo drugi od końca to normalnie wchodzę na stronę.
nevt
czy ten plik tworzysz pod windoząquestionmark.gif jeżeli tak, to wróć do pierwotnej wersji (z pierwszego posta), a pierwszej linijce funkcji ban() dopisz:
  1. <?php
  2. function ban( $arrList, $ip ) {
  3. $arrList = str_replace(array("r", "\n"), array('', '') $arrList);
  4. if( in_array( $ip, $arrList ) ) {
  5. ...
  6. ?>
pitu
Kurcze zmieniłem tak jak podał kolega @nevt, przynajmniej z tego co ja zrozumiałem miałem zmienić w pliku ban.lib.php i zmieniłem tak:
  1. <?php
  2. function ban( $arrList, $ip ) {
  3. $arrList = str_replace(array("r", "\n"), array('', '') $arrList);
  4. if( in_array( $ip, $arrList ) ) {
  5.  return TRUE;
  6. }
  7. $replace = array( '*' => '([0-9]{1,3})', '?' => '([0-9]{1})', '.' => '.');
  8.  
  9. foreach( $arrList AS $key => $value ) {
  10. if( preg_match( '#^'.strtr( $value, $replace ).'$#', $ip ) ) {
  11.  return TRUE;
  12. }
  13.  
  14. }
  15.  
  16. return FALSE;
  17.  }
  18. ?>


Jeśli to miało być zrobione w ten sposób to lipa, bo wywala błąd i strona się nie wyświetla sad.gif
Crozin
  1. <?php
  2.  
  3. include( 'cfg/ban.lib.php' );
  4. if(ban('cfg/ban.txt', $_SERVER['REMOTE_ADDR'])){ 
  5. die( 'Twoje ip jest zbanowane: '.$_SERVER['REMOTE_ADDR'].'</b>' ); 
  6. }
  7.  
  8. ?>
  1. <?php
  2.  
  3. function ban($filename, $remoteAddr){
  4. $fileContents = file($filename, FILE_IGNORE_NEW_LINES);
  5. $replace = array( '*' => '([0-9]{1,3})', '?' => '([0-9]{1})');
  6.  
  7. foreach($fileContents as $line){ 
  8. if(preg_match( '#^' . strtr($value, $replace) . '$#', $remoteAddr)) 
  9. return true; 
  10.  
  11. return false;
  12. }
  13.  
  14. ?>
pitu
W tym kodzie co podałeś brakowało { za
  1. <?php
  2. if(preg_match( '#^' . strtr($value, $replace) . '$#', $remoteAddr))
  3. ?>


i

}
}
za
  1. <?php
  2. return true;
  3. ?>


Bo jak ich nie było wywalało bład ale mimo, że poprawiłem dodając te znaki niby juz nie było blędów na stronie ale mimo dopisywania do txt ip nie banowało sad.gifsad.gif
nevt
zabrakło jednego przecinka!!! spróbuj raz jeszcze:
  1. <?php
  2. $arrList = str_replace(array("r", "\n"), array('', ''), $arrList);
  3. ?>
pitu
Dzięki @nevt teraz jest ok smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.