银行式导航限制

时间:2013-10-30 20:24:06

标签: security

某些网络应用程序(尤其是银行网站)阻止您使用浏览器的导航按钮,打开新标签中的链接甚至刷新页面。通常他们会警告你不要这样做甚至杀死会话,迫使你再次登录。

他们是否遵循特定的架构模式来实现这一目标? 他们的目标是什么? 这如何提高安全性?

2 个答案:

答案 0 :(得分:2)

不是为不同的页面设置不同的URL处理程序,它们可能使用隐藏表单字段传递的POST变量传递页面状态,并且相同的URL处理程序将处理每个请求。

e.g。 “最近交易”的链接可以编码如下

<form method="post" action="https://www.example.com/securebankpage">

<input type="hidden" name="action" value="recentTransactions" />
<input type="hidden" name="token" value="3423432432535235325098525125242" />

<input type="submit" value="View Recent Transactions"  />

</form>

其中token是一个安全随机生成的值,记录在服务器端,针对每个用户会话和操作组合,并在用户导航时根据提交的表单值验证服务器端记录。

由于每个页面都是通过POST方法加载的,因此用户无法通过意外单击然后接受浏览器提示重新提交数据来重复操作。这是因为token已被标记为已使用过的服务器端,并且不允许再次使用该令牌。如果后退按钮导航到汇款页面很有用,因为汇款不会被意外重复。这也可以防止某些类型的重播攻击。

此体系结构还可以防范CSRF,因为任何尝试从其网站向https://www.example.com/securebankpage发起POST并将action作为{{1}传递的攻击者都无法识别该标记值}}

令牌应该是有时间限制的,因此如果不在规定的时间内使用(例如15分钟),则应将其标记为已过期,如果用户的会话仍处于活动状态,则应在呈现时为每个可能的操作重新生成。 / p>

新标签中的链接打开本身并不存在安全风险,但如果服务器不断刷新每个可能操作的标记,原始窗口中的链接现在将包含已过期的标记,因为它们尚未刷新,这就是为什么系统可能会阻止你这样做,并且在整个系统中只有一条可以跟踪的路径。

在上面的示例中,我提到了通过POST传递的所有内容,但也可以使用GET和单独的页面处理程序URL实现类似的操作。 POST路由稍微更安全,因为页面将通过停止重新提交表单的机制在浏览器中自动过期,尽管也可以通过其他方式实现此目的。使用独特的令牌是重点。

答案 1 :(得分:0)

通过javascript,您可以通过检查历史记录的长度来检测新窗口。

您可以通过在页面中注入iframe来捕获后退按钮事件,指向(例如)http://www.example.com/cacheable_blank_page.html,然后将其位置更改为http://www.example.com/cacheable_blank_page.html#offset。当用户点击后退按钮时,iframe将恢复为原始位置。如果您将事件处理程序附加到此处,则可以检测后退按钮并适当地处理该情况。

有一些代码要做here

最终peolpe通常使用它的问题是他们的服务器端代码写得不好,并且不恰当地在会话中存储交易相关数据和/或过度使用PRG模式 - 最终这是一个令人讨厌的黑客攻击问题而不是解决问题的根本原因。

SilverlighFox基于令牌的解决方案非常适合CSRF,但无法解决服务器上状态管理不良的问题。