某些网络应用程序(尤其是银行网站)会阻止您使用浏览器的导航按钮、在新选项卡中打开链接甚至刷新页面。通常他们会警告您不要这样做,甚至终止会话,迫使您再次登录。
他们是否遵循特定的架构模式来实现这一目标?
他们的目标是什么?
这如何提高安全性?
他们可能使用隐藏表单字段传递的 POST 变量来传递页面状态,并且相同的 URL 处理程序将处理每个请求,而不是为不同的页面使用不同的 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>
Where token
是一个安全随机生成的值,该值根据每个用户会话和操作组合在服务器端记录,并且在用户导航时根据提交的表单值验证服务器端记录。
由于每个页面都是通过 POST 方法加载的,因此用户不可能通过意外单击“后退”然后接受浏览器提示重新提交数据来重复该操作。这是因为token
将被标记为已使用的服务器端,并且不允许再次使用令牌。如果后退按钮导航到汇款页面,则很有用,因为汇款不会意外重复。这还可以防止某些类型的重放攻击。
该架构还可以防止CSRF因为任何尝试发起 POST 的攻击者都不知道令牌值https://www.example.com/securebankpage
从他们的网站并通过action
as doMoneyTransfer
.
令牌应该有时间限制,因此如果在设定的时间(例如 15 分钟)内未使用,则应将它们标记为已过期,并且如果用户的会话仍处于活动状态,则应在呈现时为每个可能的操作重新生成令牌。
在新选项卡中打开的链接本身并不存在安全风险,但如果服务器不断刷新每个可能操作的令牌,则原始窗口中的链接现在将包含过期的令牌,因为它们尚未刷新,这就是系统可能会阻止您这样做并在整个系统中拥有一条可以跟踪的路径。
在上面的示例中,我提到所有内容都通过 POST 传递,但也可以使用 GET 和单独的页面处理程序 URL 来实现类似的功能。 POST 路由稍微安全一些,因为页面将通过停止重新提交表单的机制在浏览器中自动过期,尽管也可以通过其他方式实现这一点。使用独特的代币是重点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)