Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] poprawne IP
Forum PHP.pl > Forum > Przedszkole
d3f3nd3r
Witam

chcę zrobić banowanie przyczym mam formularz gdzie recznie wpisuję adres IP i chodzi mi aby byly przyjmowane tylko poprawne adresy ip.

W sieci znalazłem cos takiego:

  1. <?php
  2. if (!eregi("^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,4})$", $email))
  3. ?>


wstawiłem sobie to w jedno miejsce i maila sprawdza poprawnie. Poprzerabiałem to troszkę ale nie do końca to sprawdzanie IP jest poprawne.

Pomoże ktoś ?
baszkir
Nie za bardzo wiem co sobie poprzerabiales, bo Twoje wyrazenie regularne adresu IP na 100% nie sprawdza, no chyba, ze w IP masz znaczek '@' no i adres zaczyna sie od litery :-) .

Moze cos takiego zadziala:
  1. <?php
  2.  
  3. $ip="192.168.11.255";
  4.  
  5. if(eregi("^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$",$ip))
  6. echo "jest ok";
  7. else
  8. echo "nie jest ok";
  9.  
  10. ?>


A tak przy okazji moze warto w googlach wpisac "wyrazenia regularne"
d3f3nd3r
Cytat(baszkir @ 27.08.2008, 17:59:22 ) *
Nie za bardzo wiem co sobie poprzerabiales, bo Twoje wyrazenie regularne adresu IP na 100% nie sprawdza, no chyba, ze w IP masz znaczek '@' no i adres zaczyna sie od litery :-) .

Moze cos takiego zadziala:
  1. <?php
  2. $ip=&#092;"192.168.11.255\";
  3.  
  4. if(eregi(&#092;"^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$\",$ip))
  5. echo &#092;"jest ok\";
  6. else
  7. echo &#092;"nie jest ok\";
  8.  
  9. ?>


A tak przy okazji moze warto w googlach wpisac "wyrazenia regularne"


niestety to działą jeszcze gorzej niż to ja co przerobiłem gdyż np IP 1.1 które jest niepoprawne jest uwazane za poprawne.


Chodzi o to aby tylko IP 0.0.0.0 do 255.255.255.255 (nawet jakby bylo 999.999.999.999) bylo uwazane za poprawne
barthpl
Podobny problem rozwiązywaliśmy tutaj. Do sprawdzania czy jest to poprawne powinna wystarczyć zmodyfikowana funkcja z tamtego tematu.
  1. <?php
  2. function isIP( $ip )
  3. { 
  4. $pattern = "/^([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})$/";
  5.  
  6. if( !preg_match( $pattern, trim($ip), $ip ) )
  7. return false;
  8.  
  9. foreach( $ip as $key => $val )
  10. $ip[$key] = intval($val);
  11. if( ($ip[1] >= 0 && $ip[1] < 256) && ($ip[2] >= 0 && $ip[2] < 256) && ($ip[3] >= 0 && $ip[3] < 256) && ($ip[4] >= 0 && $ip[4] < 256) )
  12. return true;
  13. return false;
  14. }
  15. ?>

i przykład
  1. <?php
  2. $ip[] = '0.0.0.0';
  3. $ip[] = '255.255.255.255';
  4. $ip[] = '999.999.999.999';
  5. $ip[] = '1.1.1.1';
  6. $ip[] = '2.2';
  7. $ip[] = '192,165.1';
  8. $ip[] = '234.10.5';
  9. $ip[] = '12.34.56.12';
  10.  
  11.  
  12. foreach( $ip as $ipItem )
  13. if( isIP($ipItem) )
  14. echo "$ipItem\n";
  15. ?>

a jego wynik to:

0.0.0.0
255.255.255.255
1.1.1.1
12.34.56.12

Choć ja wcale nie jestem taki pewien czy 0.0.0.0 to faktycznie poprawny adres IP.

edit --> Poprawiłem błąd jaki miałem w kodzie. Dodałem warunek w linii 6.
baszkir
no racja, moj blad - z rozpedu zapomnialem ze nie chodzi o cyfry a o liczby do 255.
Sorki, za blad. Musze bardziej przemyslec post zanim klikne "dodaj odpowiedz"

Ale tak przy okazji '1.1' jest traktowane jako niepoprawny adres, wlasie testowalem:

  1. <?php
  2.  
  3. $adr=array('1.1.1.1','2.2','0.0.0.0.0','192,165.1','234.10.5','12.34.56.12');
  4.  
  5. foreach($adr as $ip)
  6. {
  7. if(eregi("^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$",$ip))
  8. echo "$ip -- jest ok<br>";
  9. else
  10.  echo "$ip -- nie jest ok<br>";
  11. }
  12. ?>


a wynik to :

1.1.1.1 -- jest ok
2.2 -- nie jest ok
0.0.0.0.0 -- nie jest ok
192,165.1 -- nie jest ok
234.10.5 -- nie jest ok
12.34.56.12 -- jest ok

Mam nadzieje, ze nie zostanie to potraktowane jako nabijanie postow.
d3f3nd3r
Cytat(baszkir @ 27.08.2008, 19:01:29 ) *
no racja, moj blad - z rozpedu zapomnialem ze nie chodzi o cyfry a o liczby do 255.
Sorki, za blad. Musze bardziej przemyslec post zanim klikne "dodaj odpowiedz"

Ale tak przy okazji '1.1' jest traktowane jako niepoprawny adres, wlasie testowalem:

  1. <?php
  2. $adr=array('1.1.1.1','2.2','0.0.0.0.0','192,165.1','234.10.5','12.34.56.12');
  3.  
  4. foreach($adr as $ip)
  5. {
  6.   if(eregi(&#092;"^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$\",$ip))
  7.       echo &#092;"$ip -- jest ok
  8. &#092;";
  9.   else
  10.      echo &#092;"$ip -- nie jest ok
  11. &#092;";
  12. }
  13. ?>


a wynik to :

1.1.1.1 -- jest ok
2.2 -- nie jest ok
0.0.0.0.0 -- nie jest ok
192,165.1 -- nie jest ok
234.10.5 -- nie jest ok
12.34.56.12 -- jest ok

Mam nadzieje, ze nie zostanie to potraktowane jako nabijanie postow.


Heh dziwne bo u mnie wyświetlało na odwrót tongue.gif


przestawiłem tylko u siebie na odwrót i jest teraz git (hehe dodaje nawet 999.999.999.999 ale tutaj trzeba by zbudować dużo dłuższy warunek)
Kicok
Można prościej:
  1. <?php
  2.  
  3. // PRZYKŁADOWE TESTY:
  4. #$ip = '0.0.0.0';
  5. #$ip = '127.0.0.1';
  6. #$ip = '255.255.255.255';
  7. $ip = '123.12.3.123';
  8. #$ip = '0.0.0.256';
  9. #$ip = '999.999.999.999';
  10. #$ip = 'ala ma kota';
  11.  
  12.  
  13. if( $ip == long2ip( ip2long( $ip ) ) )
  14. {
  15. echo $ip . ' - poprawny adres IP';
  16. }
  17. else
  18. {
  19. echo $ip . ' - niepoprawny adres IP';
  20. }
  21.  
  22.  
  23. ?>
d3f3nd3r
Cytat(Kicok @ 27.08.2008, 19:18:13 ) *
Można prościej:
  1. <?php
  2.     // PRZYKŁADOWE TESTY:
  3.     #$ip = '0.0.0.0';
  4.     #$ip = '127.0.0.1';
  5.     #$ip = '255.255.255.255';
  6.     $ip = '123.12.3.123';
  7.     #$ip = '0.0.0.256';
  8.     #$ip = '999.999.999.999';
  9.     #$ip = 'ala ma kota';
  10.     
  11.     
  12.     if( $ip == long2ip( ip2long( $ip ) ) )
  13.     {
  14.         echo $ip . ' - poprawny adres IP';
  15.     }
  16.     else
  17.     {
  18.         echo $ip . ' - niepoprawny adres IP';
  19.     }
  20.     
  21.  
  22. ?>


Jejku dzięki wielkie  czarodziej.gif teraz jest lux  przedział 0.0.0.0-255.255.255.255 inne są niepoprawne 
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.