Musimy Request.UserHostAddress
uzyskać adres IP w ASP.NET, ale zwykle jest to adres IP dostawcy usług internetowych, a nie dokładnie adres IP komputera użytkownika, który na przykład kliknął link. Jak mogę uzyskać prawdziwy adres IP?
Na przykład w profilu użytkownika Przepełnienie stosu jest to: „Ostatnia aktywność konta: 4 godziny temu od 86.123.127.8” , ale adres IP mojej maszyny jest nieco inny. W jaki sposób przepełnienie stosu uzyskuje ten adres?
W niektórych systemach sieciowych istnieje kontrola adresu IP dla niektórych celów. Na przykład, mając określony adres IP, czy co 24 godziny użytkownik może uzyskać tylko 5 kliknięć linków do pobrania? Ten adres IP powinien być unikalny, nie dla dostawcy usług internetowych, który ma ogromną liczbę klientów lub użytkowników Internetu.
Czy dobrze zrozumiałem?
źródło
Odpowiedzi:
Jak powiedzieli inni, nie możesz zrobić tego, o co prosisz. Jeśli opisujesz problem, który próbujesz rozwiązać, może ktoś może pomóc?
Na przykład
EdytowaćAdres, który widzisz na serwerze, nie powinien być adresem usługodawcy internetowego, ponieważ, jak mówisz, byłby to ogromny zasięg. Adres dla użytkownika domowego korzystającego z łącza szerokopasmowego będzie adresem na jego routerze, więc każde urządzenie w domu będzie wyglądało na zewnątrz tak samo, ale router używa NAT, aby zapewnić prawidłowe kierowanie ruchu do każdego urządzenia. Dla użytkowników uzyskujących dostęp ze środowiska biurowego adres może być taki sam dla wszystkich użytkowników. Witryny, które używają adresu IP do identyfikacji, są bardzo narażone na błędy - podane przez Ciebie przykłady są dobre i często zawodzą. Na przykład moje biuro znajduje się w Wielkiej Brytanii, punktem wyjścia (gdzie „wydaje się”, że jestem w Internecie) jest w innym kraju, w którym znajduje się nasz główny ośrodek informatyczny, więc z mojego biura mój adres IP wydaje się nie znajdować w Wielkiej Brytanii. Z tego powodu nie mam dostępu do treści internetowych tylko w Wielkiej Brytanii, np. BBC iPlayer). W dowolnym momencie w mojej firmie byłyby setki, a nawet tysiące osób, które wydają się mieć dostęp do sieci z tego samego adresu IP.
Podczas pisania kodu serwera nigdy nie możesz być pewien, do jakiego adresu IP się odnosi. Niektórzy użytkownicy lubią to w ten sposób. Niektóre osoby celowo używają serwera proxy lub VPN, aby jeszcze bardziej Cię zaskoczyć.
Kiedy mówisz, że twój adres urządzenia jest inny niż adres IP pokazany na StackOverflow, jak znajdujesz adres swojego urządzenia? Jeśli szukasz tylko lokalnie
ipconfig
lub coś w tym stylu, spodziewam się, że będzie inaczej z powodów, które przedstawiłem powyżej. Jeśli chcesz dokładnie sprawdzić, co myśli świat zewnętrzny, zajrzyj na whatismyipaddress.com/ .Ten link do Wikipedii na temat NAT zapewni Ci pewne podstawy na ten temat.
źródło
Często będziesz chciał znać adres IP osoby odwiedzającej twoją stronę. Chociaż ASP.NET ma kilka sposobów na zrobienie tego, jednym z najlepszych sposobów, jakie widzieliśmy, jest użycie „HTTP_X_FORWARDED_FOR” z kolekcji ServerVariables.
Dlatego...
Czasami twoi goście stoją za serwerem proxy lub routerem, a standard
Request.UserHostAddress
przechwytuje tylko adres IP serwera proxy lub routera. W takim przypadku adres IP użytkownika jest następnie zapisywany w zmiennej serwera („HTTP_X_FORWARDED_FOR”).Chcemy więc najpierw sprawdzić „HTTP_X_FORWARDED_FOR”, a jeśli jest pusty, po prostu wrócimy
ServerVariables("REMOTE_ADDR")
.Chociaż ta metoda nie jest niezawodna, może prowadzić do lepszych wyników. Poniżej znajduje się kod ASP.NET w VB.NET, zaczerpnięty z bloga Jamesa Crowleya „Gotcha: HTTP_X_FORWARDED_FOR zwraca wiele adresów IP”
DO#
VB.NET
źródło
what we actually needed to be doing was take the last IP address
ale twój kod dostaje pierwszyaddresses[0]
. Który jest poprawny?addresses.Length != 0
nie jest konieczne, ponieważ nigdy nie może być 0.AKTUALIZACJA: Dzięki Bruno Lopes. Jeśli może przyjść kilka adresów IP, musisz użyć tej metody:
źródło
System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList[1].ToString();
Jeśli c # patrz w ten sposób, to jest bardzo proste
źródło
Co jeszcze uważasz za adres IP użytkownika? Jeśli chcesz adres IP karty sieciowej, obawiam się, że nie ma możliwości zrobienia tego w aplikacji internetowej. Jeśli twój użytkownik stoi za NAT lub innymi rzeczami, nie możesz uzyskać adresu IP.
Aktualizacja : Chociaż istnieją witryny internetowe, które używają adresu IP w celu ograniczenia użytkownika (np. Rapidshare), nie działają one poprawnie w środowiskach NAT.
źródło
Myślę, że powinienem podzielić się moim doświadczeniem z wami wszystkimi. Widzę, że w niektórych sytuacjach REMOTE_ADDR NIE dostanie tego, czego szukasz. Na przykład, jeśli masz za kulisami moduł równoważenia obciążenia i jeśli próbujesz uzyskać adres IP klienta, będziesz miał kłopoty. Sprawdziłem to za pomocą oprogramowania do maskowania IP oraz sprawdziłem, czy moi koledzy są na różnych kontynentach. Oto moje rozwiązanie.
Kiedy chcę poznać adres IP klienta, próbuję wybrać wszystkie możliwe dowody, aby ustalić, czy są one unikalne:
Tutaj znalazłem inny serwer, który może pomóc wszystkim, jeśli chcesz uzyskać dokładne IP po stronie klienta. więc używam: HTTP_X_CLUSTER_CLIENT_IP
HTTP_X_CLUSTER_CLIENT_IP zawsze podaje dokładny adres IP klienta. W każdym razie, jeśli nie daje ci to wartości, powinieneś poszukać HTTP_X_FORWARDED_FOR, ponieważ jest to drugi najlepszy kandydat do uzyskania adresu IP klienta, a następnie zmienna REMOTE_ADDR, która może, ale nie musi, zwrócić Ci adres IP, ale dla mnie posiadanie tych wszystkich trzy to, co uważam za najlepszą rzecz do ich monitorowania.
Mam nadzieję, że to pomaga niektórym facetom.
źródło
Możesz użyć:
źródło
System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList[1].ToString();
Request for the permission of type 'System.Net.DnsPermission, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
Adresy IP są częścią warstwy sieciowej w „stosie siedmiu warstw”. Warstwa sieci może robić wszystko, co chce zrobić z adresem IP. Tak dzieje się z serwerem proxy, NAT, przekaźnikiem lub czymkolwiek innym.
Warstwa aplikacji nie powinna w żaden sposób zależeć od adresu IP. W szczególności adres IP nie ma być identyfikatorem niczego innego niż identyfikator jednego końca połączenia sieciowego. Jak tylko połączenie zostanie zamknięte, należy oczekiwać zmiany adresu IP (tego samego użytkownika).
źródło
Wszystkie dotychczasowe odpowiedzi uwzględniają niestandaryzowany, ale bardzo powszechny
X-Forwarded-For
nagłówek. Istnieje znormalizowanyForwarded
nagłówek, który jest nieco trudniejszy do przeanalizowania. Niektóre przykłady są następujące:Napisałem klasę, która uwzględnia oba te nagłówki przy określaniu adresu IP klienta.
Poniżej znajdują się niektóre testy jednostkowe, których użyłem do sprawdzenia poprawności mojego rozwiązania:
źródło
Jeśli używasz CloudFlare, możesz wypróbować tę metodę rozszerzenia :
następnie
źródło
źródło
Co możesz zrobić, to zapisać adres IP routera użytkownika, a także przekazany adres IP i postarać się, aby był niezawodny przy użyciu zarówno adresów IP [Zewnętrzny publiczny, jak i Wewnętrzny prywatny]. Ale znowu po kilku dniach klientowi może zostać przypisany nowy wewnętrzny adres IP z routera, ale będzie bardziej niezawodny.
źródło
Łącząc odpowiedzi z @Tony i @mangokun , stworzyłem następującą metodę rozszerzenia:
źródło
HTTP_X_FORWARDED_FOR
ale nie używaszX_FORWARDED_FOR
? Czy oni są tacy sami?użyj w pliku ashx
źródło
Posługiwać się;
źródło
To proste. Spróbuj:
po prostu to :))
źródło
Witajcie, większość kodów, które znajdziecie, zwróci wam adres IP serwera, a nie adres IP klienta. Jednak ten kod zwraca poprawny adres IP klienta. Spróbuj. Aby uzyskać więcej informacji, zaznacz to
https://www.youtube.com/watch?v=Nkf37DsxYjI
Aby uzyskać lokalny adres IP za pomocą javascript, możesz użyć tego kodu w tagu skryptu
oraz Aby uzyskać publiczny adres IP, możesz użyć tego kodu w tagu skryptu
źródło
Użyj tego
źródło
Próbować:
źródło