Jak sprawdzić za pomocą javascript, czy połączenie jest hostem lokalnym?

107

Chcę sprawdzić w moim javascript, czy ładująca się strona znajduje się na moim komputerze lokalnym.

Powodem, dla którego chcę to zrobić, jest to, że podczas programowania lubię upewnić się, że zarówno walidacja po stronie serwera (C #) działa poprawnie. Dlatego lubię widzieć błędy po stronie klienta i po stronie serwera.

Więc podczas testowania mam flagę w moim jquery validate stuff, który po prostu zawsze przepuszcza nieprawidłowe dane. W ten sposób widzę błędy po stronie klienta i serwera za jednym zamachem.

Jednak teraz muszę ręcznie zmieniać ustawienia, przechodząc od etapu projektowania do produkcji.

chobo2
źródło
3
Chciałbym tylko ostrzec każdego, kto używa którejkolwiek z tych metod w którejkolwiek z tych odpowiedzi, aby „dodać” funkcjonalność do systemu, zwłaszcza jeśli ta funkcjonalność może zostać użyta do ujawnienia w inny sposób bezpiecznych informacji lub danych w systemie. Jednak użycie tej techniki do „usunięcia” funkcjonalności ma sens. Na przykład, jeśli chcesz wyłączyć śledzenie analiz uruchamianych w środowisku programistycznym, nawet jeśli robisz to w środowisku produkcyjnym. Po prostu zastanów się dokładnie, co ujawniasz za pomocą warunku lub przełącznika po stronie przeglądarki i jak może to stać się luką w zabezpieczeniach.
Javid Jamae

Odpowiedzi:

217

location.hostnameZmienna daje bieżącego hosta. To powinno wystarczyć do określenia, w jakim środowisku się znajdujesz.

if (location.hostname === "localhost" || location.hostname === "127.0.0.1")
    alert("It's a local server!");
Unicron
źródło
14
Czy nie ma bardziej ogólnego / uniwersalnego rozwiązania, które obejmowałoby również przypadki używania 127.0.0.1 itd.?
jacobq
8
To jest po prostu złe. wiele osób edytuje swój plik hosta, więc słowo „localhost” nie zostanie znalezione
vsync
4
zgadzam się. To jest źle. Nie działa również podczas uzyskiwania dostępu do pliku „lokalnego” za pośrednictwem dysku sieciowego.
ProblemsOfSumit
1
@Sumit przez interfejs plików, możesz sprawdzić, czy nazwa hosta jest pusta
chacham15
1
Nie jestem pewien, dlaczego wszyscy uważają to za złe. Ten prosty fragment działa idealnie dla mnie na hoście lokalnym i produkcji. Moje oprogramowanie zna pogodę, aby wyświetlać reklamy - lub nie, za pomocą 1 prostej linii kodu. Dzięki OP.
Andy
32

jeśli uruchomienie statycznego html w przeglądarce, np. z lokalizacji takiej jak file:///C:/Documents and Settings/Administrator/Desktop/wykrywanie "localhost", nie zadziała. location.hostnamezwróci pusty ciąg. więc

if (location.hostname === "localhost" || location.hostname === "127.0.0.1" || location.hostname === "")
    alert("It's a local server!");
Tomasz Bujnowski
źródło
Natknąłem się dokładnie na ten problem i chociaż sam wymyślałem rozwiązanie, ta odpowiedź powinna nadal znajdować się wyżej.
domsson,
7

Wciąż nie jest to haczyk, ale może to być niewielka poprawa. Możesz teraz utworzyć tablicę domen i używać .includes

const LOCAL_DOMAINS = ["localhost", "127.0.0.1", ...];

if (LOCAL_DOMAINS.includes(window.location.hostname))
  alert("It's a local server!");
daniele bertella
źródło
5

W ten sposób zostaje sprawdzony w React, zarejestruj pracownika usługi , dobry sposób na sprawdzenie, czy jesteś na hoście lokalnym, sprawdzając nazwę hosta, w tym localhost i IPv6 , i dopasowując początek od 127 :

const isLocalhost = Boolean(
    window.location.hostname === 'localhost' ||
    // [::1] is the IPv6 localhost address.
    window.location.hostname === '[::1]' ||
    // 127.0.0.1/8 is considered localhost for IPv4.
    window.location.hostname.match(
        /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
    )
);
Alireza
źródło
3

Najkrótsza forma wykorzystująca tę samą mechanikę co inne skrypty:

if ( ["localhost", "127.0.0.1", ""].includes(window.location.hostname) ) {
     console.log("It's local host !");
}
TarmoPikaro
źródło
3

Ten obejmuje również niektóre typowe przypadki, w których adresy IP sieci lokalnej zaczynają się od 10.0.lub 192.168.lub domeny Bonjour, jak domena kończąca się na .local:

export function isLocalNetwork(hostname = window.location.hostname) {
  return (
    (['localhost', '127.0.0.1', '', '::1'].includes(hostname))
    || (hostname.startsWith('192.168.'))
    || (hostname.startsWith('10.0.'))
    || (hostname.endsWith('.local'))
  )
}
Holtwick
źródło
2

Łatwym sposobem na to byłoby po prostu sprawdzenie nazwy hosta z lokalnym hostem lub porównanie nazwy domeny niestandardowej z podciągiem, w tym przypadku „.local” adresami URL, takimi jak http: //testsite.local

var myUrlPattern = '.local';
if (window.location.hostname === "localhost" || location.hostname === "127.0.0.1" || window.location.hostname.indexOf(myUrlPattern) >= 0) {
    alert("It's a local server!");
}
Szczyt
źródło
1

Możesz wykryć w jednym ze swoich kodów za stronami z C #, na przykład:

if ((Request.Url.Host.ToLower() == "localhost"))
{
    // ..., maybe set an asp:Literal value that's in the js
}

Lub jeśli chcesz to zrobić ze skryptu klienta, możesz sprawdzić wartość window.location.host.

if (window.location.host == "localhost")
{
    // Do whatever
}

Mam nadzieję że to pomoże.

Samuel Meacham
źródło
3
location.host zawiera nazwę hosta ORAZ port. Zamiast tego użyj location.hostname.
pmont
1
const LOCAL_DOMAINS = [ "localhost", "127.0.0.1" ];

/* offline || development */
if ( LOCAL_DOMAINS.includes(location.hostname) )
{
    BASE_URL_PUBLIC = location.hostname + "/folder/website/"; // your project folder
}

/* online || production */
else
{
    BASE_URL_PUBLIC = location.hostname;
}
antelove
źródło
0

Powyższe odpowiedzi w większości rozwiązują problem, ale ...

  • Co jeśli localhost niekoniecznie musi oznaczać „localhost /”?
  • A jeśli chcesz przeprowadzić walidację FE podczas programowania?
  • Co jeśli chcesz różnych zachowań podczas tworzenia oprogramowania
    ( np. Walidacja, walidacja, brak walidacji )

Jednym z rozwiązań jest ustawienie skrótu lokalizacji i sprawdzenie go.

http://myname.foo.com/form.html#devValidation

Możesz dodać nieograniczoną liczbę opcji za pomocą przełącznika

switch(location.hash) {}
    case '#devValidation':
        // log the results and post the form
        break;
    case '#beValidation':
        // skip front end validation entirely
        break;
    case '#noValidation':
        // skip all validation $('[name=validationType']).val('novalidation');
        break;
    case '#feValidation':
    default:
        // do fe validation
        break;
}
Shanimal
źródło
To rozwiązanie nadal wymaga ręcznej pracy i można przy nim manipulować.
A1rPun
Myślę, że „praca ręczna” jest nieistotna, również manipulująca, ponieważ możemy przesłać, co nam się podoba, bez zgody javascript, a większość frameworków ma filtry, które łagodzą ataki, zanim żądanie dotrze do aplikacji. Być może zezwolenie OP na pominięcie sprawdzania poprawności po stronie serwera jest ryzykowne, ale zostało dodane tylko po to, aby pokazać użyteczność użycia klucza w skrócie.
Shanimal,
Nigdy nie używam localhost ani pętli zwrotnej, ponieważ umieszczenie na białej liście dziesiątek umiędzynarodowionych klientów (clinetA.com, clientA.de, clientB.com, clientB.au itp.) Szybko stałoby się koszmarem. Zdecydowałem się zaoferować to rozwiązanie, ponieważ nie dba o domenę i można to sprawdzić w aktywnej witrynie bez łatki.
Shanimal
0

Wyrażenie regularne jest wolniejsze *, ale krótkie i zgrabne. Ponadto nikt tutaj nie sprawdza lokalnego hosta IPv6 (:: 1)

/localhost|127\.0\.0\.1|::1|\.local|^$/i.test(location.hostname)

Sprawdza ogólny host lokalny, domenę lokalną i plik: (pusta nazwa hosta).

*) W przeglądarce Chrome wydajność [].includes(...)jest najlepsza (42 ms), po której następuje prosta pętla (for, while) ze sprawdzaniem elementów tablicy (119 ms), następnie [].indexOf(...) > -1(289 ms) i na końcu wyrażenie regularne (566 ms). Ale te pomiary są w pewnym sensie względne, ponieważ różne przeglądarki są optymalizowane w różny sposób. W FF 52 ESR includesi indexOfmają podobne wyniki, wyrażenie regularne jest 2 × wolniejsze, a pętla 6 × wolniej.

mikiqex
źródło
0

W oparciu o powyższe komentarze, następujące wyrażenie regularne pomogło mi zweryfikować, czy adres URL to „localhost”, dowolny adres IP IPv4 lub IPv6.

window.location.hostname.match(/localhost|[0-9]{2,3}\.[0-9]{2,3}\.[0-9]{2,3}\.[0-9]{2,3}|::1|\.local|^$/gi)
smutny
źródło