Innymi słowy, jak mogę stwierdzić, czy osoba używająca mojej aplikacji internetowej znajduje się na serwerze, na którym się ona znajduje? Jeśli dobrze pamiętam, PHPMyAdmin robi coś takiego ze względów bezpieczeństwa.
99
Możesz również użyć $_SERVER['REMOTE_ADDR']
adresu IP żądającego klienta, który jest podany przez serwer sieciowy.
$whitelist = array(
'127.0.0.1',
'::1'
);
if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
// not valid
}
Host: 127.0.0.1
I zostanie on wypełnionyHTTP_HOST
, więc nie jest to w ogóle metoda niezawodna.$whitelist = array('127.0.0.1', '::1');
Jako uzupełnienie, jako funkcja ...
źródło
Nowsi użytkownicy systemu operacyjnego (Win 7, 8) mogą również uznać za konieczne dołączenie zdalnego adresu w formacie IPV6 do swojej białej listy:
źródło
$_SERVER["REMOTE_ADDR"]
powinien podać adres IP użytkownika. Jest to jednak fałszywe.Sprawdź to pytanie o nagrodę, aby uzyskać bardzo szczegółową dyskusję.
Myślę, że to, co pamiętasz z PHPMyAdmin, jest czymś innym: wiele serwerów MySQL jest skonfigurowanych tak, że ze względów bezpieczeństwa można uzyskać do nich dostęp tylko z lokalnego hosta.
źródło
Przepraszam, ale wszystkie te odpowiedzi wydają mi się straszne. Sugerowałbym przeformułowanie pytania, ponieważ w pewnym sensie wszystkie maszyny są „hostami lokalnymi”.
Pytanie powinno brzmieć; Jak uruchomić różne ścieżki kodu w zależności od tego, na której maszynie jest wykonywany.
Moim zdaniem najłatwiej jest stworzyć plik o nazwie DEVMACHINE lub cokolwiek naprawdę chcesz a potem po prostu sprawdzić
Pamiętaj, aby wykluczyć ten plik podczas przesyłania do środowiska hostingu na żywo!
To rozwiązanie nie jest zależne od konfiguracji sieci, nie może być sfałszowane i ułatwia przełączanie między uruchomionym „kodem na żywo” i „kodem programisty”.
źródło
Wydaje się, że nie powinieneś go używać
$_SERVER['HTTP_HOST']
, ponieważ jest to wartość w nagłówku http, łatwa do sfałszowania.Możesz
$_SERVER["REMOTE_ADDR"]
też użyć , jest to bezpieczniejsza wartość, ale można też podrobić. Toremote_addr
jest adres, na który Apache zwraca wynik.źródło
REMOTE_ADDR
można sfałszować, jednak jeśli chcesz podrobić to jako127.0.0.1
lub::1
, co wymaga skompromitowania maszyny, w której sfałszowanieREMOTE_ADDR
jest najmniejszym z twoich zmartwień. Odpowiednia odpowiedź - stackoverflow.com/a/5092951/3774582Jeśli chcesz mieć białą listę / allowlist, która obsługuje statyczne adresy IP i dynamiczne nazwy .
Na przykład:
W ten sposób możesz ustawić listę nazw / adresów IP, które będą mogły (na pewno) zostać wykryte. Nazwy dynamiczne zapewniają większą elastyczność dostępu z różnych punktów.
Masz tutaj dwie typowe opcje, możesz ustawić nazwę w lokalnym pliku hostów lub możesz po prostu użyć jednego dostawcy nazw dynamicznych, który można znaleźć wszędzie.
Ta funkcja CACHES działa, ponieważ gethostbyname jest bardzo powolną funkcją.
Dla tego pupose zaimplementowałem tę funkcję:
Aby zwiększyć niezawodność, możesz zamienić $ _SERVER ['REMOTE_ADDR'] na get_ip_address (), o którym @Pekka wspomniał w swoim poście jako „to pytanie o nagrodę”
źródło
Co powiesz na porównanie w
$_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR']
celu ustalenia, czy klient znajduje się na tym samym komputerze co serwer?źródło
$_SERVER['SERVER_ADDR']
nie zawsze niezawodnie zwraca adres serwera, np. jeśli używasz load balancerów, zwraca adres IP load balancera.Znalazłem łatwą odpowiedź.
Ponieważ wszystkie dyski lokalne mają C: lub D: lub F: ... itd.
Po prostu wykryj, czy druga postać to:
źródło