检测页面是不是在 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 中 - 服务器端的主要内容,如果未能解决你的问题,请参考以下文章