C# 检查iFrame是否由允许的域承载

C# 检查iFrame是否由允许的域承载,c#,javascript,html,http,C#,Javascript,Html,Http,我正在开发一个iframe,用于我们的一些合作伙伴网站 我有没有办法确保它只能在那些网站上使用,其他人不能使用 我打算在网站的URL中添加一个强制查询字符串。 每个合作伙伴在Quesrysting dnd中都有不同的值,使用该值查找允许的域 但是,是否仍需要知道承载iframe的站点的顶级域 假设这不是在iFrame的http请求中发送的?还是我看不见 或者您需要从javascript发送域吗 有什么建议吗?您可以尝试检查哪个普通浏览器将在页面上发送IFrame请求 您也可以使用(和)中包含的“

我正在开发一个iframe,用于我们的一些合作伙伴网站

我有没有办法确保它只能在那些网站上使用,其他人不能使用

我打算在网站的URL中添加一个强制查询字符串。 每个合作伙伴在Quesrysting dnd中都有不同的值,使用该值查找允许的域

但是,是否仍需要知道承载iframe的站点的顶级域

假设这不是在iFrame的http请求中发送的?还是我看不见

或者您需要从javascript发送域吗


有什么建议吗?

您可以尝试检查哪个普通浏览器将在页面上发送IFrame请求

您也可以使用(和)中包含的“x-frame-options”标题,但并不是每个浏览器都会尊重这一点(另一方面,如果浏览器支持它,则更可靠)

但是,是否仍需要知道承载iframe的站点的顶级域

没有什么可靠的

假设这不是在iFrame的http请求中发送的?还是我看不见

它可能在推荐信中发送

或者您需要从javascript发送域吗

如果您想从框架页面获取它,您将被同源策略阻止

如果您想从框架页面发送它,您将把它放在查询字符串中,您不能信任它,因为它可以设置为编写框架页面的人喜欢的任何内容

还有(但浏览器支持有限)

我能想到的最可靠的解决方案是:

  • 要求在用于加载框架的查询字符串中指定原点
  • 检查推荐人。如果它与您的白名单不匹配且不为空,请重定向到一个空白页面,除了指向您的站点的链接,该链接带有
    target=“\u top”
    和一些
    top.location=“您的站点”
  • 检查查询字符串中指定的来源是否在白名单中,如果它的行为与被拒绝的步骤2不同
  • 输出一个
    X-Frame-Options
    标题,该标题将帧限制在指定的原点

  • 这可能会捕获足够多的浏览器,阻止构建站点构建您的站点。

    iframe的sanbox属性可能有助于控制iframe中的各种安全方面,包括源代码

    2007年《建筑杂志》有一篇关于这方面的好文章:

    这篇文章的基本建议是: 如果域1上的A页带有一个iframe,而域2上的B页是它的源,那么在域1上的B页到C页之间有一个iframe,将允许您跨域传递信息

    我还没有测试过,但这听起来好像可以工作


    另一种可能是创建一个具有特殊文件名(例如域2上的页面B的URL哈希)和基本扩展名(如.htm)的文件,并将其放置在域1的根目录中。但是,javascript无法检查域1上是否存在该文件,因此应该使用服务器端代码进行检查。

    +0-除非我完全弄错了,否则沙盒允许父级控制IFrame的行为,这与OP要求的相反-如何从IFrame控制其允许工作的位置。+1。(细节比我的多——太好了)。我认为最可靠的选择是通过
    postMessage
    获取家长的来源,因为浏览器中没有任何东西可以改变消息的来源(但OP已经介绍了这个选项“或者您需要从javascript发送域吗”)。您对本文中的第二个答案有何看法?我可以将window.parent.location.href或top.locatio.href与白名单url进行比较吗?这是我的iframe。我可以将白名单上的站点注入iframe的javascript中。这是个好方法吗?哪一秒?三种是三种不同的答案分类方式。我可以将window.parent.location.href或top.locatio.href与白名单url进行比较吗?-不可以。当其他帧指向不同的域时,您无法读取它们的位置。答案是parentIsSameOrigin()函数。我想我可以将parent.location.href与注入javascript的白名单url(都在iframe中)进行比较,而不是检查它们是否是相同的来源。您是说您不能从iFrame读取父帧的URL吗?如果父帧(或任何不同的)帧位于同一原点,您只能读取其URI。否则,您可以通过构建第三方站点来获取有关用户的潜在敏感数据。