检测页面是不是在 iframe 中 - 服务器端

Posted

技术标签:

【中文标题】检测页面是不是在 iframe 中 - 服务器端【英文标题】:Detect if a page is within a iframe - serverside检测页面是否在 iframe 中 - 服务器端 【发布时间】:2010-11-13 20:10:06 【问题描述】:

如果加载的页面在 iframe 中,我如何检测服务器端(c#、asp.net mvc)?谢谢

【问题讨论】:

【参考方案1】:

但是这是不可能的。

<iframe src="mypage?iframe=yes"></iframe>

然后检查服务器端是否查询字符串包含 iframe=yes 或者使用浏览器发送的Referer头。

【讨论】:

谢谢,但这并不能解决我的问题,因为我希望只有在 iframe 中才能访问页面(出于某些安全原因)。向查询字符串添加一些东西太容易了,不安全。 如果是出于安全原因,那么您做错了什么。充其量,唯一可能让您知道在 iframe 中的是引用。甚至那是可以伪造的。安全性是通过访问检查和验证来实现的,而不是通过脆弱的假设网络来实现的。【参考方案2】:

在表单中使用以下代码:

<asp:HiddenField ID="hfIsInIframe" runat="server" />
<script type="text/javascript">
    var isInIFrame = (self != top);
    $('#<%= hfIsInIframe.ClientID %>').val(isInIFrame);
</script>

然后您可以在代码隐藏中轻松检查它是否是 iFrame:

bool bIsInIFrame = (hfIsInIframe.Value == "true");

经过测试并为我工作。

编辑:请注意,您需要 jQuery 来运行我上面的代码。要在不使用 jQuery 的情况下运行它,只需使用以下代码(未经测试)来设置隐藏字段的值:

document.getElementById('<%= hfIsInIframe.ClientID %>').value = isInIFrame;

编辑 2:这仅在页面加载一次时有效。如果有人有想法来改进这一点,请告诉我。就我而言,幸运的是,我只需要回发后的值。

【讨论】:

这应该是答案。 不@RoyiNamir,这不是服务器端解决方案;) @tetri,使用此代码,您可以从服务器端检查您是否在 iframe 中。我同意,有一些客户端代码 - 但在我看来,这是最好的解决方案,因为它不关心页面是如何被调用的。当前接受的答案要求在每个 iframe 中设置请求值 - 这可能会被遗忘。 这个答案的唯一问题是它需要页面运行一次,因此该值将被填充。因此,它需要在加载后基本上完成的某个地方:If Not IsPostback Then Postback()【参考方案3】:

如您在@WTP 的回答中所述,无法检查是否符合您对“安全”的要求。

【讨论】:

【参考方案4】:

我认为服务器端无法做到这一点,那么为什么不在 iframe 中的页面中放置一个隐藏控件呢?当 iframe 中的 URL 加载时,您可以添加一些客户端代码来设置隐藏输入以指示您在 iframe 中。最简单的检查是在客户端的 onload 方法中,如下所示:

// Set hidden input
someHiddenInput.value = self != top

它比查询字符串更安全,但对您来说仍然可能不够安全。

我的 2 美分。

【讨论】:

【参考方案5】:

老问题,但为什么不采用更简单的方法,例如

var isFramed = self !== parent

【讨论】:

以上是关于检测页面是不是在 iframe 中 - 服务器端的主要内容,如果未能解决你的问题,请参考以下文章

检测 iframe src 是不是可显示

检测 iframe 加载错误

检测 iframe、服务器端(无 javascript)?

在 magnolia 的页面详细信息视图中检测 iframe 的变化

检测 iFrame 中的元素是不是在客户端视图中

检测数组(网页中包含多个框架时)