Javascript 我能否安全地依赖于本地文件中未定义的主机名(即导航到本地文件)?
我正在创建一个web扩展,它可以在每个页面上运行,但只能在某些上下文中运行。以下是isSupported()方法:Javascript 我能否安全地依赖于本地文件中未定义的主机名(即导航到本地文件)?,javascript,hostname,window.location,Javascript,Hostname,Window.location,我正在创建一个web扩展,它可以在每个页面上运行,但只能在某些上下文中运行。以下是isSupported()方法: //返回一个布尔值,如果域/页受支持,元素名匹配,则该值为true //支持的类型,并且内容被标记为可检查拼写 函数isSupported(节点、主机名){ const supportedNodeNames=['TEXTAREA','DIV'] const-supportedDomains=['mail.google.com','github.com'] if(node.spell
//返回一个布尔值,如果域/页受支持,元素名匹配,则该值为true
//支持的类型,并且内容被标记为可检查拼写
函数isSupported(节点、主机名){
const supportedNodeNames=['TEXTAREA','DIV']
const-supportedDomains=['mail.google.com','github.com']
if(node.spellcheck&&node.isContentEditable){
if(node.nodeName==='TEXTAREA'){
返回真值
}
if(supportedNodeNames.contains(node.nodeName)和&supportedDomains.contains(hostname)){
返回真值
}
}
返回错误
}
不幸的是,当URI为file:///home/username/github/multi-dict/test_page/test-page.html
我能否安全地依赖未定义的window.location.hostname
,并允许扩展在运行时运行?我在和上查看了文档,但我不太清楚在什么样的上下文中主机名是未定义的
提前谢谢
*它实际上是一个空字符串,保留在读者/答案上下文的原始描述中。所以问题是-我可以安全地依赖于
window.location.hostname
吗?只有浏览器打开的本地文件才是空的-没有本地Web服务器在运行。主机名
被定义为字符串(,),因此它不能有未定义的值。它是一个空字符串(“”
),而不是未定义的
,在我尝试过的每个浏览器(Chrome、Firefox、IE、Edge)上。如果您认为某些浏览器上的未定义
,您可以进行错误检查:
if (location.hostname) {
// It has a non-blank value
} else {
// Its value is falsy (probably "", perhaps undefined)
}
但是我不认为它是未定义的。从:
主机名属性的getter必须运行以下步骤:
如果此位置
对象的相关文档
为非空,且其原点与条目设置对象的原点不在同一原点域,则抛出“SecurityError”DomeException
如果此位置
对象的url主机为null
,返回空字符串。
返回此位置
对象的url的主机
,序列化
(我的重点)
本地URL的主机是null
,因此第2步强调的部分适用。它真的是未定义的
,还是只是空字符串”
?为什么不在本地主机上运行服务器呢?这几天真是太容易了…对什么安全?但不,我不相信这一点。(不能马上说什么可以破坏它——
或者其他没有原创的东西?——但出于任何安全目的,它都非常不舒服。)本地主机上的服务器或者可能检查文件://
似乎是更好的方向。嘿,我现在更新了标题,更清晰,很好。我的意思是安全的,就像主机名是一个空字符串,只有在访问本地文件的上下文中减去本地服务器。我的错误是,我应该检查值的类型-您是对的,即使只是将浏览器指向一个文件,它确实是一个字符串(在本例中是空的)。我现在已经更新了这个问题,希望它能更清楚一点——我想知道location.hostname对于本地服务的文件是否永远都是空的。接受了Ry的建议,我也在检查位置协议。@GrayedFox-这是我所知道的唯一一种使原点为空的情况,所以上面的第2步应该适用。但一定要看看协议(aka方案)。