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

pis*_*hio 19 html c# asp.net asp.net-mvc

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

小智 18

但是,这是不可能的.

<iframe src="mypage?iframe=yes"></iframe>
Run Code Online (Sandbox Code Playgroud)

如果查询字符串包含iframe = yes或浏览器发送Referer标头,则检查服务器端.

  • 如果是出于安全原因,那么你做错了.在最好的情况下,唯一可能让你在iframe中出现的事情就是引用者.甚至那是可以原谅的.安全性通过访问检查和验证来完成,而不是通过脆弱的假设网络来完成. (15认同)
  • 谢谢,但这并没有解决我的问题,因为我希望只有在iframe内访问页面(出于某些安全原因).在查询字符串中添加一些东西太容易做到安全. (2认同)

Vor*_*456 7

在表单中使用以下代码:

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

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

bool bIsInIFrame = (hfIsInIframe.Value == "true");
Run Code Online (Sandbox Code Playgroud)

经过测试并为我工作.

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

document.getElementById('<%= hfIsInIframe.ClientID %>').value = isInIFrame;
Run Code Online (Sandbox Code Playgroud)

编辑2:这仅在页面加载一次时有效.如果有人有想法改进这一点,请告诉我.在我的情况下,我幸运地只需要回发后的值.

  • 没有@RoyiNamir,这不是服务器端解决方案;) (3认同)
  • 这个答案的唯一问题是它需要页面运行一次,因此值将被填充.所以,它需要在加载后的某些地方基本上做:`If Not IsPostback Then Postback()`. (2认同)