Làm thế nào để kiểm tra bằng javascript nếu kết nối là máy chủ cục bộ?


101

Tôi muốn kiểm tra javascript của mình nếu trang đang tải lên trên máy cục bộ của tôi.

Lý do tại sao tôi muốn làm điều đó là khi tôi phát triển, tôi muốn đảm bảo rằng cả xác thực phía máy chủ (C #) của tôi đang hoạt động chính xác. Vì vậy, tôi muốn thấy cả lỗi phía máy khách và phía máy chủ hiển thị.

Vì vậy, trong khi tôi đang thử nghiệm, tôi có một cờ trong nội dung xác thực jquery của mình mà chỉ luôn cho phép dữ liệu không hợp lệ đi qua. Bằng cách này, tôi thấy lỗi phía máy khách và máy chủ cùng một lúc.

Tuy nhiên ngay bây giờ tôi phải tự đi và thay đổi qua lại khi chuyển từ phát triển sang sản xuất.


3
Tôi chỉ cảnh báo cho bất kỳ ai sử dụng bất kỳ phương pháp nào trong số các câu trả lời này để "thêm" chức năng vào hệ thống, đặc biệt nếu chức năng đã nói có thể được sử dụng để tiết lộ thông tin hoặc dữ liệu an toàn trong hệ thống của bạn. Tuy nhiên, sử dụng kỹ thuật này để "loại bỏ" chức năng có ý nghĩa. Ví dụ: nếu bạn muốn ngăn chặn việc theo dõi phân tích kích hoạt trong môi trường phát triển của mình, ngay cả khi bạn làm điều đó trong môi trường sản xuất của mình. Chỉ cần suy nghĩ cẩn thận về những gì bạn đang phơi bày thông qua điều kiện hoặc chuyển đổi phía trình duyệt và cách nó có thể trở thành một lỗ hổng bảo mật.
Javid Jamae

Câu trả lời:


209

Các location.hostnamebiến cung cấp cho bạn các máy chủ hiện hành. Điều đó đủ để bạn xác định bạn đang ở trong môi trường nào.

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

14
Không có giải pháp tổng quát hơn / "bắt tất cả" cũng sẽ bao gồm các trường hợp sử dụng 127.0.0.1, v.v.?
jacobq

8
Điều này chỉ là sai. nhiều người chỉnh sửa tệp máy chủ lưu trữ của họ để từ 'localhost' sẽ không được tìm thấy
vsync

4
tôi đồng ý. Cái này sai. Cũng sẽ không hoạt động khi truy cập tệp "cục bộ" thông qua ổ đĩa mạng.
ProblemsOfSumit

1
@Sumit thông qua các tập tin giao diện bạn có thể kiểm tra tên máy chủ là rỗng
chacham15

1
Uhh không chắc tại sao mọi người đều nói điều này là sai. Đoạn mã đơn giản này hoạt động hoàn hảo cho tôi trên localhost và production. Phần mềm của tôi biết thời tiết để phân phát quảng cáo - hay không, bằng 1 dòng mã đơn giản. Cảm ơn OP.
Andy

30

nếu khởi chạy html tĩnh trong trình duyệt, ví dụ từ vị trí như file:///C:/Documents and Settings/Administrator/Desktop/phát hiện "localhost" sẽ không hoạt động. location.hostnamesẽ trả về chuỗi trống. vì thế

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

Tôi đã gặp phải vấn đề chính xác này và trong khi tôi tự tìm ra giải pháp, câu trả lời này vẫn sẽ cao hơn.
domsson

6

Vẫn chưa phải là nắm bắt tất cả nhưng nó có thể được cải thiện một chút. Bây giờ bạn có thể tạo một mảng tên miền và sử dụng .includes

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

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

3

Đó là cách nó được kiểm tra trong React, đăng ký service worker , cách tốt để kiểm tra xem bạn có đang ở trên localhost hay không bằng cách kiểm tra tên máy chủ, bao gồm localhostIPv6 , và bắt đầu khớp với 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}$/
    )
);

2

Một cách dễ dàng để thực hiện việc này là chỉ cần kiểm tra tên máy chủ với localhost hoặc kiểm tra tên miền tùy chỉnh của bạn với một chuỗi con, trong trường hợp này là các url ".local", chẳng hạn như 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!");
}

2

Biểu mẫu ngắn nhất sử dụng cùng một cơ chế như các tập lệnh khác:

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

2

Phần này cũng đề cập đến một số trường hợp phổ biến trong đó IP mạng cục bộ bắt đầu bằng 10.0.hoặc 192.168.hoặc Bonjour như tên miền kết thúc trên .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'))
  )
}

1

Bạn có thể phát hiện trong một mã của mình đằng sau các trang có c #, như sau:

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

Hoặc nếu bạn muốn làm điều đó từ tập lệnh máy khách, bạn có thể kiểm tra giá trị của window.location.host.

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

Hi vọng điêu nay co ich.


3
location.host bao gồm tên máy chủ VÀ cổng. Sử dụng location.hostname để thay thế.
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

Các câu trả lời trên hầu hết giải quyết được vấn đề nhưng ...

  • Điều gì sẽ xảy ra nếu localhost không nhất thiết phải là 'localhost /'?
  • Nếu bạn muốn xác nhận FE trong quá trình phát triển thì sao?
  • Điều gì xảy ra nếu bạn muốn các hành vi khác nhau trong quá trình phát triển
    ( xác thực fe, xác thực, không xác thực )

Một giải pháp là đặt băm vị trí và kiểm tra nó.

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

Bạn có thể thêm các tùy chọn không giới hạn bằng một nút chuyển

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

Giải pháp này vẫn có một số thao tác thủ công và nó có thể bị giả mạo.
A1rPun

Tôi nghĩ rằng "công việc thủ công" là không đáng kể, cũng có thể làm giả mạo vì chúng tôi có thể gửi bất cứ thứ gì chúng tôi thích mà không cần sự chấp thuận của javascript và hầu hết các khung công tác đều có bộ lọc giảm thiểu các cuộc tấn công trước khi yêu cầu đến được ứng dụng. Có thể cho phép OP bỏ qua xác thực phía máy chủ là một rủi ro, nhưng nó chỉ được thêm vào để hiển thị tiện ích của việc sử dụng một khóa trong băm.
Shanimal

Tôi không bao giờ sử dụng localhost hoặc loopback vì danh sách cho phép hàng chục máy khách quốc tế hóa (clinetA.com, clientA.de, clientB.com, clientB.au, v.v.) sẽ nhanh chóng trở thành một cơn ác mộng. Tôi quyết định cung cấp giải pháp này vì nó không quan tâm đến miền và có thể được kiểm tra trong một trang web trực tiếp mà không cần bản vá.
Shanimal

0

Biểu thức chính quy chậm hơn *, nhưng ngắn và gọn gàng. Ngoài ra, không ai ở đây kiểm tra IPv6 localhost (:: 1)

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

Nó kiểm tra localhost chung, miền .local và tệp: (tên máy chủ trống).

*) Trong Chrome, hiệu suất của [].includes(...)là tốt nhất (42 mili giây), tiếp theo là vòng lặp đơn giản (for, while) với kiểm tra mục mảng (119 mili giây), sau đó [].indexOf(...) > -1(289 mili giây) và cuối cùng là regexp (566 mili giây). Nhưng những phép đo đó bằng cách nào đó là tương đối, bởi vì các trình duyệt khác nhau được tối ưu hóa khác nhau. Trong FF 52 ESR includesindexOfcó kết quả tương tự, regexp chậm hơn 2 lần và vòng lặp chậm hơn 6 lần.


0

Dựa trên các nhận xét ở trên, biểu thức chính quy sau đây đã giúp tôi xác minh xem url có phải là 'localhost' hay không, bất kỳ địa chỉ IP nào là IPv4 hay 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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.