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

23

如何在服务器端(使用C#,ASP.NET MVC)检测加载的页面是否在 iframe 中?谢谢。

5个回答

19

然而,这是不可能的。

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

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


2
谢谢,但这并不能解决我的问题,因为我希望页面只能在 iframe 中访问(出于某些安全原因)。向查询字符串添加内容太容易了,不够安全。 - pistacchio
17
如果出于安全原因,那么你正在做错事情。最多,唯一能提示你处于 iframe 中的可能是 referer。但即使如此,referer 也是可伪造的。安全是通过访问检查和验证来完成的,而不是通过脆弱的假设网络来实现的。 - Yuliy

7
在表单中使用以下代码:
<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:这仅适用于页面加载一次的情况。如果有人有改进的想法,请让我知道。在我的情况下,幸运的是我只需要在postback之后获取值。


1
这应该是答案。 - Royi Namir
3
不,@RoyiNamir,这不是服务器端的解决方案 ;) - tetri
1
@tetri,使用此代码,您可以从服务器端检查是否在 iframe 中。我同意,有一些客户端代码,但我认为它是最好的解决方案,因为它不关心页面如何被调用。当前接受的答案需要在每个 iframe 中设置请求值,这可能会被忘记。 - Vortex852456
2
这个答案唯一的问题是它需要页面运行一次,所以值才会被填充。因此,在加载后需要在某个地方添加以下代码:If Not IsPostback Then Postback() - eidylon

3

根据您在@WTP答案评论中所述的“安全”要求,没有适合您要求的检查方法。


1

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

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

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

这是我的意见。


0

虽然这是一个老问题,但为什么不采用更简单的方法呢?

var isFramed = self !== parent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接