是否可以防止弹出窗口直接打开而不是通过Javascript打开?

时间:2016-05-11 18:35:02

标签: javascript c# asp.net

我正在处理的应用程序依赖于许多弹出窗口。那些弹出窗口依赖于查询字符串。如果有人可以在浏览器地址栏中输入网址,那么页面将抛出错误,因为查询字符串值是动态构造的。

function myFunction(id)
{
    window.open("mypopup.aspx?id=" + id); 
}

如果页面的请求者不是Javascript,是否有阻止页面显示的原因?如果有人输入类似的内容:

https://mycompanyname.com/path/mypopup.aspx

不应该让用户这样做。或者,至少检查请求者是否不是javascript所以我可以显示一条消息或将用户重定向到另一个页面?否则,如果没有构造请求所需的所有数据,页面将抛出异常。

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

直接在myPopup.aspx中验证查询字符串,如果缺少某些内容,只需重定向或显示消息。

使用Request.QueryString集合在myPopup.aspx中进行验证。

据我所知,没有简单的方法可以验证请求是否来自javascript。您可以尝试创建令牌以验证发件人是您期望的那个,但如果您只需要验证参数,则无需担心谁在发送请求。

答案 1 :(得分:1)

如果两个请求来自同一个浏览器,则该页面无法区分请求的方式。

但是,您可以在查询字符串中包含以区分它们。

例如,

window.open("mypopup.aspx?request=javascript&id=" + id); 

如果用户有意输入https://mycompanyname.com/path/mypopup.aspx?request=javascript,那就这样吧。我不担心。

答案 2 :(得分:1)

弹出窗口也是浏览器窗口。因此,检查请求页面的窗口是正常窗口还是弹出窗口是很棘手的。

  1. 您应该限制用户查看弹出窗口打开的URL,您可以隐藏地址栏。因此,用户无法复制或了解网址中的内容。 window.open('/pageaddress.html','winname','directories=no,titlebar=no,toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=no,width=400,height=350');

  2. 设置基于令牌的验证。向服务器(Ajax request)发出请求以获取随机令牌(具有一次验证机制并使其过期),您可以在查询字符串中发送令牌,并在服务器上验证它是否与发出的令牌相同。确定所请求的页面是否具有有效令牌(弹出窗口),否则拒绝请求或显示错误消息。想想captcha如何工作,你只需要以编程方式进行。

  3. 虽然它也不是最好的解决方案,因为令牌信息可以通过网络流量跟踪器工具(如fiddler)嗅探,但它可以防止手动请求。