Bağlantının yerel ana bilgisayar olup olmadığı javascript ile nasıl kontrol edilir?


108

Sayfanın yüklenmesi yerel makinemde ise javascript'ime bir kontrol yaptırmak istiyorum.

Bunu yapmak istememin nedeni, geliştirirken her iki sunucu tarafı (C #) doğrulamamın da doğru çalıştığından emin olmaktan hoşlanmam. Bu yüzden hem istemci tarafı hem de sunucu tarafı hatalarının ortaya çıkmasını seviyorum.

Bu yüzden, test ederken jquery doğrulama öğemde her zaman geçersiz verilerin geçmesine izin veren bir bayrak var. Bu şekilde istemci tarafı ve sunucu hatalarını tek seferde görüyorum.

Ancak şu anda geliştirmeden üretime geçerken manuel olarak gidip gelmem gerekiyor.


3
Bu yanıtların herhangi birinde, sisteme işlevsellik "eklemek" için bu yöntemlerden herhangi birini kullanan herkesi uyarmak isterim, özellikle de söz konusu işlevsellik sisteminizdeki başka türlü güvenli bilgileri veya verileri açığa çıkarmak için kullanılabilirse. Ancak, işlevselliği "kaldırmak" için bu tekniğin kullanılması mantıklıdır. Örneğin, üretim ortamınızda yapsanız bile geliştirme ortamınızda analitik takibinin tetiklenmesini engellemek istiyorsanız. Tarayıcı tarafı koşullu veya geçiş yoluyla neyi açığa çıkardığınızı ve bunun nasıl bir güvenlik açığı haline gelebileceğini dikkatlice düşünün.
Javid Jamae

Yanıtlar:


218

location.hostnameDeğişken size mevcut ana verir. Bu, hangi ortamda olduğunuzu belirlemeniz için yeterli olmalıdır.

if (location.hostname === "localhost" || location.hostname === "127.0.0.1")
    alert("It's a local server!");

14
127.0.0.1 vb. Kullanım durumlarını da kapsayan daha genel / "tümünü yakalama" çözümü yok mu?
jacobq

8
Bu çok yanlış. birçok kişi ana bilgisayar dosyasını düzenler, böylece 'localhost' kelimesi bulunmaz
vsync 13

4
Katılıyorum. Bu yanlış. Ayrıca bir ağ sürücüsü üzerinden "yerel" bir dosyaya erişirken de çalışmaz.
ProblemsOfSumit

1
@Dosya arayüzü aracılığıyla ana bilgisayar adının boş olup olmadığını kontrol edebilirsiniz
chacham15

1
Herkesin bunu neden yanlış olarak söylediğinden emin değilim. Bu basit kırpılmış, localhost ve prodüksiyonda benim için mükemmel çalışıyor. Yazılımım, 1 basit kod satırıyla reklamları sunmak için hava durumunu biliyor - ya da değil. Teşekkürler OP.
Andy

32

tarayıcıda statik html başlatılırsa, örneğin file:///C:/Documents and Settings/Administrator/Desktop/"localhost" algılama gibi bir konumdan çalışmaz. location.hostnameboş dize döndürecektir. yani

if (location.hostname === "localhost" || location.hostname === "127.0.0.1" || location.hostname === "")
    alert("It's a local server!");

Tam olarak bu sorunla karşılaştım ve çözümü kendim bulurken, bu cevap hala daha yüksek olmalı.
domsson

7

Yine de hepsini yakalamak değil ama biraz gelişme olabilir. Artık bir dizi etki alanı oluşturabilir ve .includes kullanabilirsiniz

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

if (LOCAL_DOMAINS.includes(window.location.hostname))
  alert("It's a local server!");

5

React'te bu şekilde kontrol edilir , servis çalışanını kaydedin, localhost ve IPv6 dahil olmak üzere ana bilgisayar adını kontrol ederek localhost'ta olup olmadığınızı kontrol etmenin iyi bir yolu ve 127 ile eşleşen başlangıç :

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}$/
    )
);

3

Diğer komut dosyalarıyla aynı mekaniği kullanan en kısa biçim:

if ( ["localhost", "127.0.0.1", ""].includes(window.location.hostname) ) {
     console.log("It's local host !");
}

3

Bu seferki aynı zamanda yerel ağ IP'leri ile başlayan bazı ortak durumları kapsar 10.0.veya 192.168.veya Bonjour etki alanında biten gibi .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'))
  )
}

2

Bunu yapmanın kolay bir yolu, ana makine adını localhost ile karşılaştırmak veya özel alan adınızı bir alt dizeyle karşılaştırmaktır, bu durumda http: //testsite.local gibi ".local" url'ler

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!");
}

1

Sayfaların arkasındaki kodlarınızdan birinde c # ile aşağıdaki gibi saptayabilirsiniz:

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

Veya bunu istemci komut dosyasından yapmak istiyorsanız, window.location.host'un değerini kontrol edebilirsiniz.

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

Bu yardımcı olur umarım.


3
location.host, ana bilgisayar adını VE bağlantı noktasını içerir. Bunun yerine location.hostname kullanın.
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;
}

0

Yukarıdaki cevaplar çoğunlukla sorunu çözer ama ...

  • Ya localhost mutlaka 'localhost /' değilse?
  • Geliştirme sırasında FE doğrulaması yapmak isterseniz ne olur?
  • Geliştirme sırasında farklı davranışlar istiyorsanız ne olur
    ( doğrulama, doğrulama, doğrulama yok )

Çözümlerden biri, konum karmasını ayarlamak ve kontrol etmektir.

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

Bir anahtarla sınırsız seçenek ekleyebilirsiniz

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;
}

Bu çözümün hala bazı manuel çalışmaları vardır ve kurcalanabilir.
A1rPun

Javascript'in onayı olmadan istediğimiz her şeyi gönderebildiğimiz ve çoğu çerçevede, istek uygulamaya ulaşmadan önce saldırıları azaltan filtrelere sahip olduğu için "manuel çalışmanın" önemsiz olduğunu düşünüyorum. OP'nin sunucu tarafı doğrulamasını atlamasına izin vermek bir risk olabilir, ancak yalnızca karmada bir anahtar kullanmanın faydasını göstermek için eklenmiştir.
Shanimal

Hiçbir zaman localhost veya geridöngü kullanmıyorum çünkü düzinelerce uluslararasılaşmış müşteriyi beyaz listeye eklemek (klinetA.com, clientA.de, clientB.com, clientB.au, vb.) Hızla kabusa dönüşür. Bu çözümü sunmaya karar verdim çünkü alanı umursamıyor ve bir yama olmadan canlı bir sitede kontrol edilebiliyor.
Shanimal

0

Normal ifade daha yavaştır *, ancak kısa ve derli topludur. Ayrıca, burada kimse IPv6 localhost'u kontrol etmez (:: 1)

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

Genel localhost, .local domain ve file: (boş ana bilgisayar adı) olup olmadığını kontrol eder.

*) Chrome'da performansı [].includes(...)en iyisidir (42 ms), ardından dizi öğesi denetimi (119 ms) ile basit döngü (for, while), ardından [].indexOf(...) > -1(289 ms) ve son olarak regexp (566 ms) gelir. Ancak bu ölçümler bir şekilde görecelidir, çünkü farklı tarayıcılar farklı şekilde optimize edilmiştir. FF 52 ESR'de includesve indexOfbenzer sonuçlara sahip, regexp 2 kat daha yavaştır ve döngü 6 kat daha yavaştır.


0

Yukarıdaki yorumlara dayanarak, aşağıdaki düzenli ifade, url'nin 'localhost', herhangi bir IP adresi IPv4 veya IPv6 olup olmadığını doğrulamama yardımcı oldu.

window.location.hostname.match(/localhost|[0-9]{2,3}\.[0-9]{2,3}\.[0-9]{2,3}\.[0-9]{2,3}|::1|\.local|^$/gi)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.