Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Konwertowanie adresu IPv4
Forum PHP.pl > Forum > Przedszkole
Dominator
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. }
klocu
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.
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.