如果连接是本地主机,如何使用 javascript 检查?
Posted
技术标签:
【中文标题】如果连接是本地主机,如何使用 javascript 检查?【英文标题】:How to check with javascript if connection is local host? 【发布时间】:2011-03-10 21:35:39 【问题描述】:如果加载的页面在我的本地机器上,我想检查我的 javascript。
我想这样做的原因是,当我开发时,我喜欢确保我的服务器端 (C#) 验证都正常工作。所以我喜欢看到客户端和服务器端的错误都显示出来。
因此,当我在测试时,我的 jquery 验证内容中有一个标志,它总是让无效数据通过。这样我可以一次性看到客户端和服务器错误。
但是现在从开发到生产时,我必须手动来回更改。
【问题讨论】:
我只是提醒任何人在任何这些答案中使用这些方法中的任何一种来向系统“添加”功能,特别是如果所述功能可用于在您的系统中公开其他安全信息或数据.然而,使用这种技术“删除”功能是有意义的。例如,如果您想在开发环境中禁止触发分析跟踪,即使您在生产环境中执行此操作也是如此。请仔细考虑一下您通过浏览器端条件或切换暴露的内容以及它如何成为安全漏洞。 【参考方案1】:location.hostname
变量为您提供当前主机。这应该足以让您确定您所处的环境。
if (location.hostname === "localhost" || location.hostname === "127.0.0.1")
alert("It's a local server!");
【讨论】:
难道没有更通用的/“包罗万象”的解决方案也可以涵盖使用 127.0.0.1 等的情况吗? 这是错误的。许多人编辑他们的主机文件,因此找不到“localhost”这个词 我同意。这是错误的。通过网络驱动器访问“本地”文件时也不起作用。 @Sumit 通过文件接口可以检查主机名是否为空 呃不知道为什么每个人都说这是错误的。这个简单的剪辑非常适合我在本地主机和生产环境中使用。我的软件知道投放广告的天气——或者不知道,只需要 1 行简单的代码。谢谢OP。【参考方案2】:如果在浏览器中启动静态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!");
【讨论】:
我遇到了这个确切的问题,虽然我自己想出了解决方案,但这个答案应该仍然更高。【参考方案3】:仍然不是全部,但可能会有所改进。 您现在可以创建一个域数组并使用.includes
const LOCAL_DOMAINS = ["localhost", "127.0.0.1", ...];
if (LOCAL_DOMAINS.includes(window.location.hostname))
alert("It's a local server!");
【讨论】:
警告:IE11 不支持“.includes”【参考方案4】:这就是它在 React, register service worker 中的检查方式,这是通过检查主机名来检查您是否在 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$/
)
);
【讨论】:
Boolean()
包装器在这里扮演什么角色?【参考方案5】:
使用与其他脚本相同的机制的最短形式:
if ( ["localhost", "127.0.0.1", ""].includes(window.location.hostname) )
console.log("It's local host !");
【讨论】:
警告:IE11 不支持“.includes”【参考方案6】:本文还涵盖了一些常见的本地网络 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'))
)
【讨论】:
【参考方案7】:执行此操作的一种简单方法是仅根据 localhost 检查主机名或根据子字符串检查您的自定义域名,在本例中为“.local” url,例如 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!");
【讨论】:
【参考方案8】: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;
【讨论】:
【参考方案9】:您可以使用 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
希望这会有所帮助。
【讨论】:
location.host 包括主机名和端口。请改用 location.hostname。【参考方案10】:以上答案大多解决了问题,但是......
如果 localhost 不一定是 'localhost/' 怎么办? 如果您想在开发过程中进行 FE 验证怎么办? 如果您希望在开发期间有不同的行为怎么办 (有验证,有验证,没有验证)一种解决方案是设置位置哈希并检查它。
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;
【讨论】:
这个解决方案还是有一些人工操作,可以被篡改。 我认为“手动工作”是微不足道的,因为我们可以在没有 javascript 批准的情况下提交我们喜欢的任何内容,并且大多数框架都有过滤器,可以在请求到达应用程序之前缓解攻击。也许允许 OP 跳过服务器端验证是一种风险,但它只是为了显示在哈希中使用密钥的实用性而添加的。 我从不使用 localhost 或环回,因为将数十个国际化客户端(clinetA.com、clientA.de、clientB.com、clientB.au 等)列入白名单很快就会成为一场噩梦。我决定提供这个解决方案是因为它不关心域,并且可以在没有补丁的情况下在实时站点中进行检查。【参考方案11】:正则表达式较慢*,但简短而整洁。此外,这里没有人检查 IPv6 localhost (::1)
/localhost|127\.0\.0\.1|::1|\.local|^$/i.test(location.hostname)
它检查一般 localhost、.local 域和文件:(空主机名)。
*) 在 Chrome 中,[].includes(...)
的性能最好(42 ms),其次是带有数组项检查的简单循环(for、while)(119 ms),然后是[].indexOf(...) > -1
(289 ms),最后是正则表达式(566 毫秒)。
但这些测量值在某种程度上是相对的,因为不同的浏览器进行了不同的优化。在 FF 52 ESR 中,includes
和 indexOf
有相似的结果,正则表达式慢 2 倍,循环慢 6 倍。
【讨论】:
【参考方案12】:基于上述 cmets th 以下正则表达式帮助我验证 如果 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)
【讨论】:
以上是关于如果连接是本地主机,如何使用 javascript 检查?的主要内容,如果未能解决你的问题,请参考以下文章