Iframe HTML嵌入站点的地理位置被拒绝-锚定标记功能策略

Iframe HTML嵌入站点的地理位置被拒绝-锚定标记功能策略,iframe,anchor,content-security-policy,w3c-geolocation,feature-policy,Iframe,Anchor,Content Security Policy,W3c Geolocation,Feature Policy,带有allow=“geolocation”的iframe非常有效。 但是如果我想加载一个从html锚标记调用getCurrentPosition()的链接,该怎么办 例如: 在iframe中,我将使用 我有一个html嵌入链接的用例,比如 嵌入到父站点中。 父站点在其自己的iframe中加载子链接 需要注意的是,父站点的iframe具有allow=“geolocation”属性 在这种情况下,请求被无声地拒绝,并出现错误 错误代码:1 errorMessage:“此文档中的地理位置已被禁用。

带有allow=“geolocation”的iframe非常有效。 但是如果我想加载一个从html锚标记调用getCurrentPosition()的链接,该怎么办

例如: 在iframe中,我将使用

我有一个html嵌入链接的用例,比如

嵌入到父站点中。 父站点在其自己的iframe中加载子链接

需要注意的是,父站点的iframe具有allow=“geolocation”属性

在这种情况下,请求被无声地拒绝,并出现错误

错误代码:1

errorMessage:“此文档中的地理位置已被禁用。” 权限策略。“

文档指向iframe,但是锚定标记嵌入呢

我知道我可以使用iframe而不是锚定标记嵌入,但是父站点只允许锚定标记嵌入

这是我在这里的第一个问题。请帮忙

注:

  • 我还尝试了一个随机快照,将allow=“geolocation”包含在锚标记中,但它不起作用
  • 这在Safari上似乎是可行的(我假设这是因为Safari尚未为跨源站点请求实施功能策略)
  • 编辑1:

    我在jsfiddle中尝试了我的用例,并注意到我给出的所有脚本(iframe或锚标记)都加载在jsfiddle的iframe中

    如果我把我的iframe加载到这个里面,它会工作得很好!(一切都应该是完美平衡的…)

    但是如果我把锚标签放在里面,我会得到错误。依照

    带有allow='geolocation'的jsfiddle的iframe应该设置jsfiddle站点的特性策略,使该iframe中加载的所有脚本都可以访问地理位置,对吗?为什么JSFIDLE的iframe中的iframe可以工作,但锚定标记不能工作

    注意-我无法控制顶级站点。我只为
    https://siteWhichCallsGetGeolocation.com

    解决方案(如果您控制top document的功能策略或控制任何具有地理位置权限的中间
    (源自granty的回答)

    我尝试了建议的解决方案,通过inspect元素将jsfiddle的iframe属性更改为

    为了突出显示,我像allowlist一样在geolocation旁边添加了我的站点

    allow=“midi;地理位置
    https://siteWhichCallsGetGeolocation.com

    然后装上我的锚标签。 从
    加载的脚本触发getCurrentPosition()时https://siteWhichCallsGetGeolocation.com
    ,浏览器提示我允许/拒绝位置共享。我允许并获得了坐标

    哇!如果它可以像通过inspect元素编辑顶级文档的功能/权限策略那样简单就好了


    但遗憾的是,我无法控制顶级文档的功能策略。至少我了解了引擎盖下发生的事情。

    简而言之,您必须发布

    Feature-Policy: geolocation https://siteWhichCallsGetGeolocation.com;
    
    HTTP响应头,当服务器将页面发送到浏览器时

    TL;DR或引擎盖下发生了什么
    allow=“geolocation”
    属性用于在iframe内设置功能策略(现在已重命名为权限策略)。
    您将
    geolocation
    指令与来源的雇员列表一起使用,因此应用
    geolocation“src”
    。这意味着允许在iframe内部为从与iframe相同位置加载的脚本使用geolocation API-
    https://siteWhichCallsGetGeolocation.com

    请注意,对于
    allow=“geolocation”
    ,默认策略是
    'src'
    (源于iframe的
    src=
    )。但是如果使用指令
    功能策略:geolocation;
    ,空列表的默认策略是
    'self'

    要在主页(顶级文档)中设置功能策略,需要使用
    功能策略
    标题。如果未设置,则应用默认策略
    地理定位“self”
    。这禁止对从
    加载的脚本使用地理定位APIhttps://siteWhichCallsGetGeolocation.com
    origin

    因此使用

    Feature-Policy: geolocation https://siteWhichCallsGetGeolocation.com;
    

    如果您自己的页面也使用地理位置

    参考编辑1

    Jsfiddle的
    感谢您的回答@granty。另外,您的答案中的链接默认策略似乎不可访问。我注意到Jsfiddle中有一个奇怪的情况。请参考问题中的编辑1。谢谢。您好,我更新了答案以覆盖您的编辑1并替换了损坏的链接。好的,我尝试了您建议的解决方案,似乎这只起作用如果我可以控制顶层文档的特性策略,对吗?(我通过inspect元素编辑了jsfiddle的iframe,以允许我的站点运行,但由于安全策略,如果没有inspect元素的编辑权限,我无法强制执行此操作?)您不需要控制顶部文档的功能策略。您只需要控制任何具有地理位置权限的中间文件。插入JSFIDLE
    ,在这样的iframe中,您的锚定标记将起作用。永远不要使用
    allow=“geolocation“
    ,您看不到您允许它给谁。始终使用
    allow=“地理位置https://siteWhichCallsGetGeolocation.com https://example.com https://trusted-domain.com;“
    具有明确的源列表。与功能策略相关的所有“安全策略”是:如果任何上下文具有某些权限,它可以将这些权限委托给任何嵌套上下文。如果上下文未被授予某些权限,它将无法通过
    allow=“
    或功能策略HTTP头将其委派给自己或嵌套上下文(iframe)。但请记住,任何“权限”都意味着与脚本相关的“功能+允许来源列表”,而不是“iframe本身”。若脚本是从未列出的源加载到iframe中的,则该脚本将无法获得访问“功能”的权限。
    Feature-Policy: geolocation 'self' https://siteWhichCallsGetGeolocation.com;
    
    <iframe allow="midi; geolocation; microphone; camera; display-capture; encrypted-media;"
    
    <iframe allow="midi 'src'; geolocation 'src'; microphone 'src'; camera 'src';
      display-capture 'src'; encrypted-media 'src';"