Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Konwertowanie adresu IPv4
Dominator
post
Post #1





Grupa: Zarejestrowani
Postów: 565
Pomógł: 15
Dołączył: 11.10.2010

Ostrzeżenie: (20%)
X----


Podczas konwertowania adres IP zwraca mi null, dlaczego ? Uruchamiam skrypt na xampp'ie.

  1. function get_real_ip()
  2. {
  3. if(isset($_SERVER["HTTP_X_CLUSTER_CLIENT_IP"]) && !detectSSL()) { return $_SERVER["HTTP_X_CLUSTER_CLIENT_IP"]; }
  4. $address = false;
  5. if(isset($_SERVER["REMOTE_ADDR"]))
  6. {
  7. if("PHP51_MODE")
  8. {
  9. if(preg_match("#(?:\d{1,3}\.){3}\d{1,3}#", $_SERVER["REMOTE_ADDR"]))
  10. {
  11. $address = $_SERVER["REMOTE_ADDR"];
  12. if(preg_match("#^(10\.[0-255]|169\.254|172\.(1[6-9]|2[0-9]|3[12])|192\.168)#", $address))
  13. {
  14. foreach (array("HTTP_X_FORWARDED_FOR", "HTTP_CLIENT_IP") as $key)
  15. {
  16. if(isset($_SERVER[$key]) && preg_match("#^[0-255]\.[0-255]\.[0-255]\.[0-255]$#", $_SERVER[$key]))
  17. {
  18. $address = $_SERVER[$key];
  19. break;
  20. }
  21. }
  22. }
  23. }
  24. }
  25. else
  26. {
  27. if(filter_var($_SERVER["REMOTE_ADDR"], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4))
  28. {
  29. $address = $_SERVER["REMOTE_ADDR"];
  30. if(preg_match("#^(10\.[0-255]|169\.254|172\.(1[6-9]|2[0-9]|3[12])|192\.168)#", $address))
  31. {
  32. foreach (array("HTTP_X_FORWARDED_FOR", "HTTP_CLIENT_IP") as $key)
  33. {
  34. if(isset($_SERVER[$key]) && filter_var($_SERVER[$key], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4))
  35. {
  36. $address = $_SERVER[$key];
  37. break;
  38. }
  39. }
  40. }
  41. }
  42. elseif(filter_var($_SERVER["REMOTE_ADDR"], FLITER_VALIDATE_IP, FILTER_FLAG_IPV6))
  43. {
  44. $address = $_SERVER["REMOTE_ADDR"];
  45. }
  46. }
  47. return $address;
  48. }
  49. else
  50. {
  51. return false;
  52. }
  53. }
  54.  
  55. if(get_real_ip() == null)
  56. {
  57. echo "Brak adresu IP";
  58. }
  59. else
  60. {
  61. echo get_real_ip();
  62. }
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 1)
klocu
post
Post #2





Grupa: Zarejestrowani
Postów: 291
Pomógł: 45
Dołączył: 21.08.2007

Ostrzeżenie: (0%)
-----


Czytam to 5 raz i nadal nie wiem o co chodzi.
Co chcesz konwertować? Chyba pobrać najbardziej poprawny adres IP klienta (jeśli takowy jest znany)

Co w kodzie jest "be":
- coś takiego "if("PHP51_MODE")" zawsze zwróci ci prawdę bo to jest łańcuch znaków, a nawet jeśli użyjesz stałej to jest ona niezadeklarowana więc musiałbyś zrobić co najmniej:
  1. define('PHP51_MODE', (bool)version_compare(PHP_VERSION, '5.2.0', '<'));

- dlaczego PHPv5 może korzystać z wyrażeń regularnych, a inne wersje nie? a manual mówi, że preg_match występuje w wersji 4
- jak dla mnie sprawdzanie w środowisku produkcyjnym adresacji z pul prywatnych jest zbędnym zabiegiem, chyba że stawiasz serwer wewnętrzny (intranetowy) i jest ci to do czegoś potrzebne, a widzę że chyba nie
- sprawdzanie SSL'a przy adresacji IP...
- mieszanie typów zmiennych - raz $address jest boolem, raz stringiem - do ujednolicenia

Powiem tak: kiedyś, kiedy potrzebowałem sprawdzać IP korzystałem tylko z dwóch kluczy tablicy $_SERVER - HTTP_X_FORWARDED_FOR oraz REMOTE_ADDR.
Jeśli pierwszy posiadał jakąś daną to znaczy, że ruch szedł przez proxy i proxy przekazywało adres źródłowy. W innych przypadkach adres był przechowywany tylko w drugim kluczu.

Ogólnie strasznie zamotałeś i z banalnej funkcji zrobiła się kobyłka.
To może krótko opisz co chcesz uzyskać jako wynik i jak mniej więcej prezentuje się infrastruktura - bo jak mniemam pracujesz na webserwerze lokalnym.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 05:29