Czy można bezpiecznie zaufać usłudze $ _SERVER ['REMOTE_ADDR']?

89

Czy można zaufać $_SERVER['REMOTE_ADDR']? Czy można go zastąpić, zmieniając nagłówek żądania lub coś w tym rodzaju?

Czy napisanie czegoś takiego jest bezpieczne?

if ($_SERVER['REMOTE_ADDR'] == '222.222.222.222') { // my ip address
    $grant_all_admin_rights = true;
}
Srebrne światło
źródło
3
Dodając do istniejących odpowiedzi, zawsze będzie to adres IP, który wysłał żądanie do twojego serwera, ale to nie znaczy, że jest to adres IP komputera, który rozpoczął żądanie. Pomiędzy Tobą a użytkownikiem końcowym może znajdować się dowolna liczba serwerów proxy, a najbliższy to otrzymany adres IP.
Dan Grossman,
tak, to jest bezpieczne, ponieważ nie można go zastąpić innymi sztuczkami lub oszustwem. ale upewnij się, że dodałeś więcej sprawdź zmienną $ grant_all_admin_rights.
Yuda Prawira
Każda zmienna $ _SERVER może zostać sfałszowana - np. Curl_setopt ($ ch, CURLOPT_HTTPHEADER, array ("REMOTE_ADDR: $ ip", "HTTP_X_FORWARDED_FOR: $ ip")); Zależy to więc całkowicie od kontekstu: jeśli atakujący oczekuje odpowiedzi, wróci do $ ip. Jeśli nie zależy im na odpowiedzi, z pewnością mogą sfałszować nagłówek. Jeśli zamiast tego twój kod po sprawdzeniu nagłówka mówi: "open_the_door_to_badguys ();" miałbyś problem.
TMG
3
@TMG Nie możesz sfałszować $_SERVER['REMOTE_ADDR']zmiennej, ustawiając nagłówek żądania HTTP. PHP automatycznie przedrostkuje wszystkie nagłówki żądań HTTP HTTP_przy tworzeniu kluczy w obszarze $_SERVERsuperglobalnym.
MrWhite

Odpowiedzi:

110

Tak, to jest bezpieczne. Jest to źródłowy adres IP połączenia TCP i nie można go zastąpić przez zmianę nagłówka HTTP.

Jednym z przypadków, o które możesz się martwić, jest to, że jesteś za odwrotnym proxy, w którym to przypadku REMOTE_ADDR zawsze będzie adresem IP serwera proxy, a adres IP użytkownika zostanie dostarczony w nagłówku HTTP (takim jak X-Forwarded-For ). Ale dla zwykłego przypadku użycia odczyt REMOTE_ADDR jest w porządku.

sagi
źródło
4
A co z podszywaniem się pod adres IP?
Abdull
1
@Abdull Osoby, które mogą to zrobić, to zazwyczaj te same osoby, które mają fizyczny dostęp do Twojej skrzynki. więc nie martw się o to tak bardzo.
Behrooz
5
@Abdull IP spoofing może wysyłać wiadomości tylko w jedną stronę, nie możesz sfałszować swojego adresu IP i otrzymać w zamian wiadomość.
1
Czy routery internetowe nie sprawdzają źródłowego i docelowego adresu IP, aby kierować pakiety? Wątpię, czy sfałszowany pakiet kiedykolwiek dotrze do miejsca docelowego przez węzły internetowe.
Viktor Joras
57

$_SERVER['REMOTE_ADDR']to adres IP, na który nadeszło połączenie TCP. Chociaż jest technicznie możliwe dwukierunkowe fałszowanie adresów IP w Internecie (poprzez ogłaszanie fałszywych tras przez BGP), takie ataki mogą zostać wykryte i niedostępne dla typowego atakującego - w zasadzie atakujący musi mieć kontrolę nad dostawcą usług internetowych lub operatorem. Nie ma (jeszcze) wykonalnych jednokierunkowych ataków fałszowania na TCP. Dwukierunkowe fałszowanie adresu IP jest jednak trywialne w sieci LAN.

Należy również pamiętać, że może to nie być adres IPv4, ale adres IPv6. Twoje obecne sprawdzenie jest pod tym względem w porządku, ale jeśli sprawdzisz, że 1.2.3.4występuje tylko w dowolnym miejscu w środku$_SERVER['REMOTE_ADDR'] , atakujący może po prostu połączyć się z 2001:1234:5678::1.2.3.4.

Podsumowując, w przypadku aplikacji innych niż krytyczne (bankowe / wojskowe / potencjalne szkody> 50 000 €) możesz użyć zdalnego adresu IP, jeśli możesz wykluczyć atakujących w sieci lokalnej.

phihag
źródło
4
Brzmisz bardzo dobrze o protokole internetowym.
Brian Peterson
@phihag, to, czy $_SERVER['REMOTE_ADDR']jest to adres IP, na który nadeszło połączenie TCP, zależy całkowicie od twojego SAPI.
Pacerier
dla atakującego sieci WLAN WEP / WPA jest to dalekie od niewykonania, aby wyrzucić prawdziwego klienta i sfałszować ten adres IP - zarówno WEP, jak i WPA mają słabe punkty, które ułatwiają tworzenie fałszywych you have been kicked off the wlanpakietów za pomocą odpowiednich narzędzi. WPA downgrade testna przykład google
hanshenrik
Adres IP ma poziom IP, a nie poziom TCP.
Viktor Joras
3

Jak wspomniano powyżej, nie jest to całkowicie bezpieczne. Ale to nie znaczy, że nie powinieneś go używać. Rozważ połączenie tego z innymi metodami uwierzytelniania, na przykład sprawdzaniem wartości COOKIE.

Audio
źródło
6
Po sfałszowaniu adresu IP, zmiana żądania http i wysłanie fałszywych plików cookie to bułka z masłem ..... (lub kawałek cookie)
Uri Goren
1
Proszę wyjaśnij, co masz na myśli, mówiąc „nie jest to całkowicie bezpieczne”
Jake,