1

某些 Web 应用程序,特别是银行网站,会阻止您使用浏览器的导航按钮、在新选项卡中打开链接甚至刷新页面。他们通常会警告您不要这样做,甚至会终止会话,迫使您再次登录。

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

4

2 回答 2

2

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

例如,“最近交易”的链接可以编码如下

<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 并传递actionas的攻击者都不会知道令牌值doMoneyTransfer

令牌应该是有时间限制的,因此如果在设定的时间量(例如 15 分钟)内没有使用,它们应该被标记为过期,如果用户的会话仍然处于活动状态,则应该在呈现时为每个可能的操作重新生成它们。

在新选项卡中打开的链接本身并不是安全风险,但如果服务器不断刷新每个可能操作的令牌,则原始窗口中的链接现在将包含过期令牌,因为它们尚未刷新,这就是系统的原因可能会阻止您这样做并在整个系统中使用一条可以跟踪的路径。

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

于 2013-10-31T12:01:29.883 回答
0

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

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

这里有一些代码可以做到这一点

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

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

于 2013-10-31T13:03:35.360 回答