จะตรวจสอบด้วย javascript ได้อย่างไรว่าการเชื่อมต่อเป็นโลคัลโฮสต์หรือไม่?


108

ฉันต้องการตรวจสอบจาวาสคริปต์ของฉันหากการโหลดหน้าเว็บอยู่ในเครื่องของฉัน

เหตุผลที่ฉันต้องการทำเช่นนั้นคือเมื่อฉันพัฒนาฉันต้องการตรวจสอบให้แน่ใจว่าการตรวจสอบความถูกต้องทั้งฝั่งเซิร์ฟเวอร์ (C #) ของฉันทำงานได้อย่างถูกต้อง ดังนั้นฉันต้องการดูข้อผิดพลาดทั้งฝั่งไคลเอ็นต์และฝั่งเซิร์ฟเวอร์เพื่อแสดง

ดังนั้นในขณะที่ฉันกำลังทดสอบฉันมีแฟล็กใน jquery ของฉันตรวจสอบสิ่งต่างๆที่ปล่อยให้ข้อมูลที่ไม่ถูกต้องผ่านไปได้เสมอ ด้วยวิธีนี้ฉันจะเห็นข้อผิดพลาดฝั่งไคลเอ็นต์และเซิร์ฟเวอร์ในคราวเดียว

อย่างไรก็ตามตอนนี้ฉันต้องเปลี่ยนไปมาด้วยตนเองเมื่อเปลี่ยนจากการพัฒนาไปสู่การผลิต


3
ฉันขอเตือนทุกคนที่ใช้วิธีการเหล่านี้ในคำตอบเหล่านี้เพื่อ "เพิ่ม" ฟังก์ชันการทำงานให้กับระบบโดยเฉพาะอย่างยิ่งหากฟังก์ชันดังกล่าวสามารถใช้เพื่อเปิดเผยข้อมูลหรือข้อมูลที่มีความปลอดภัยในระบบของคุณ อย่างไรก็ตามการใช้เทคนิคนี้เพื่อ "ลบ" ฟังก์ชันการทำงานนั้นสมเหตุสมผล ตัวอย่างเช่นหากคุณต้องการระงับการเริ่มการติดตามการวิเคราะห์ในสภาพแวดล้อมการพัฒนาของคุณแม้ว่าคุณจะทำในสภาพแวดล้อมการผลิตของคุณก็ตาม เพียงแค่คิดอย่างรอบคอบเกี่ยวกับสิ่งที่คุณกำลังเปิดเผยผ่านเงื่อนไขหรือสลับข้างเบราว์เซอร์และวิธีที่อาจกลายเป็นช่องโหว่ด้านความปลอดภัย
Javid Jamae

คำตอบ:


217

location.hostnameตัวแปรช่วยให้คุณโฮสต์ปัจจุบัน นั่นน่าจะเพียงพอสำหรับคุณในการพิจารณาว่าคุณอยู่ในสภาพแวดล้อมใด

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

14
ไม่มีวิธีแก้ปัญหา / "จับทั้งหมด" ทั่วไปที่ครอบคลุมกรณีการใช้ 127.0.0.1 ฯลฯ หรือไม่?
jacobq

8
แค่นี้ก็ผิดแล้ว หลายคนแก้ไขไฟล์โฮสต์เพื่อไม่พบคำว่า 'localhost'
vsync

4
ฉันเห็นด้วย. นี่เป็นสิ่งที่ไม่ถูกต้อง นอกจากนี้จะไม่ทำงานเมื่อเข้าถึงไฟล์ "ในเครื่อง" ผ่านไดรฟ์เครือข่าย
ProblemsOfSumit

1
@Sumit ผ่านอินเทอร์เฟซไฟล์คุณสามารถตรวจสอบว่าชื่อโฮสต์ว่างเปล่า
chacham15

1
เอ่อไม่แน่ใจว่าทำไมทุกคนถึงระบุว่าผิด สนิปง่ายๆนี้เหมาะสำหรับฉันใน localhost และการผลิต ซอฟต์แวร์ของฉันรู้สภาพอากาศในการแสดงโฆษณา - หรือไม่ด้วยโค้ดง่ายๆ 1 บรรทัด ขอบคุณ OP.
Andy

32

หากเปิดใช้ HTML แบบคงที่ในเบราว์เซอร์เช่นจากตำแหน่งเช่นfile:///C:/Documents and Settings/Administrator/Desktop/การตรวจจับ "localhost" จะไม่ทำงาน location.hostnameจะส่งคืนสตริงว่าง ดังนั้น

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

ฉันพบปัญหาที่แน่นอนนี้และในขณะที่ฉันหาวิธีแก้ปัญหาด้วยตัวเองคำตอบนี้ควรจะสูงขึ้น
domsson

7

ยังไม่สามารถจับได้ทั้งหมด แต่อาจมีการปรับปรุงเล็กน้อย ขณะนี้คุณสามารถสร้างอาร์เรย์ของโดเมนและใช้.includes

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

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

5

นั่นคือวิธีการตรวจสอบในReact ลงทะเบียนผู้ให้บริการวิธีที่ดีในการตรวจสอบว่าคุณอยู่ใน localhost หรือไม่โดยตรวจสอบชื่อโฮสต์รวมถึง localhostและIPv6และจับคู่เริ่มต้นด้วย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}$/
    )
);

3

รูปแบบที่สั้นที่สุดโดยใช้กลไกเดียวกันกับสคริปต์อื่น ๆ :

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

3

กรณีนี้ยังครอบคลุมถึงกรณีทั่วไปบางส่วนที่ IP ของเครือข่ายท้องถิ่นเริ่มต้นด้วย10.0.หรือ 192.168.หรือ Bonjour เช่นโดเมนที่ลงท้ายด้วย.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

วิธีง่ายๆในการดำเนินการนี้คือเพียงตรวจสอบชื่อโฮสต์กับ localhost หรือตรวจสอบชื่อโดเมนที่กำหนดเองของคุณกับสตริงย่อยในกรณีนี้คือ URL " .local " เช่น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!");
}

1

คุณสามารถตรวจพบในโค้ดของคุณหลังหน้าด้วย c # ดังนี้:

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

หรือถ้าคุณต้องการทำจากสคริปต์ไคลเอนต์คุณสามารถตรวจสอบค่าของ window.location.host

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

หวังว่านี่จะช่วยได้


3
location.host มีชื่อโฮสต์และพอร์ต ใช้ 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;
}

0

คำตอบข้างต้นส่วนใหญ่แก้ปัญหาได้ แต่ ...

  • จะเกิดอะไรขึ้นถ้า localhost ไม่จำเป็นต้องเป็น 'localhost /'?
  • ถ้าคุณต้องการทำการตรวจสอบ FE ระหว่างการพัฒนาล่ะ?
  • จะเกิดอะไรขึ้นถ้าคุณต้องการพฤติกรรมที่แตกต่างระหว่าง dev
    ( การตรวจสอบความถูกต้องตรวจสอบความถูกต้องไม่มีการตรวจสอบความถูกต้อง )

วิธีแก้ไขอย่างหนึ่งคือการตั้งค่าแฮชตำแหน่งและตรวจสอบ

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

คุณสามารถเพิ่มตัวเลือกได้ไม่ จำกัด ด้วยสวิตช์

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

โซลูชันนี้ยังคงมีการทำงานแบบแมนนวลและสามารถแก้ไขได้
A1rPun

ฉันคิดว่า "การทำงานด้วยตนเอง" นั้นไม่มีความสำคัญ แต่เป็นการปลอมแปลงเช่นกันเนื่องจากเราสามารถส่งสิ่งที่เราต้องการได้โดยไม่ต้องได้รับการอนุมัติจากจาวาสคริปต์และเฟรมเวิร์กส่วนใหญ่จะมีตัวกรองที่ลดการโจมตีก่อนที่คำขอจะไปถึงแอปพลิเคชัน บางทีการอนุญาตให้ OP ข้ามการตรวจสอบความถูกต้องฝั่งเซิร์ฟเวอร์อาจเป็นความเสี่ยง แต่มันถูกเพิ่มเพื่อแสดงยูทิลิตี้ในการใช้คีย์ในแฮช
Shanimal

ฉันไม่เคยใช้ localhost หรือลูปแบ็คเพราะการอนุญาตลูกค้าสากลหลายสิบราย (clinetA.com, clientA.de, clientB.com, clientB.au ฯลฯ ... ) จะกลายเป็นฝันร้ายอย่างรวดเร็ว ฉันตัดสินใจที่จะเสนอโซลูชันนี้เนื่องจากไม่สนใจโดเมนและสามารถตรวจสอบได้ในไซต์ที่ใช้งานจริงโดยไม่ต้องมีการแก้ไข
Shanimal

0

นิพจน์ทั่วไปช้ากว่า * แต่สั้นและเรียบร้อย นอกจากนี้ไม่มีใครตรวจสอบ IPv6 localhost (:: 1)

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

ตรวจสอบโดเมน localhost, .local ทั่วไปและไฟล์: (ชื่อโฮสต์ว่าง)

*) ใน Chrome ประสิทธิภาพ[].includes(...)จะดีที่สุด (42 ms) ตามด้วยการวนซ้ำอย่างง่าย (สำหรับในขณะที่) ด้วยการตรวจสอบรายการอาร์เรย์ (119 ms) จากนั้น[].indexOf(...) > -1(289 ms) และสุดท้าย regexp (566 ms) แต่การวัดเหล่านี้มีความสัมพันธ์กันเนื่องจากเบราว์เซอร์ต่างๆได้รับการปรับให้เหมาะสมแตกต่างกัน ใน FF 52 ESR includesและindexOfมีผลลัพธ์ที่คล้ายกัน regexp ช้ากว่า 2 เท่าและวนรอบช้ากว่า 6 เท่า


0

จากความคิดเห็นด้านบนการติดตามนิพจน์ทั่วไปช่วยให้ฉันตรวจสอบได้ว่า url เป็น 'localhost', IP แอดเดรส IPv4 หรือ 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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.