security - 验证 POST 参数后防止浏览器密码缓存

标签 security grails

如何解决这个问题?

应用程序有一个带有密码和其他输入字段的表单。用户必须输入密码才能提交交易以及其他交易信息。在提交交易时需要密码作为安全检查。

表单输入值绑定(bind)到命令对象。

这是我们的应用程序处理此问题的方式:

void submitAction(FooCommand command){
if(command.hasErrors()){
    render(view: ‘show’, model: [command:command])
}
//else do save and redirect
}

我们意识到,通过使用渲染而不是重定向,用户注销后用户的密码在浏览器缓存中可见。渲染中使用的 URL 与 POST URL 相同。用户注销后,其他人可以使用浏览器的后退按钮并重新提交表单,同时使用诸如 firebug 之类的工具检查 POST 参数并获得对用户密码的访问权限。

还需要将用户的输入从表单保留回显示验证错误的页面。因此,闪存中带有错误消息的简单重定向将无法满足此要求。

建议的解决方案是使用 chain放置方法
命令对象进入闪存范围,因此可以重定向以显示错误和用户输入。这可以防止某人在浏览器工具中访问 POST URL,从而访问密码。
void submitAction(FooCommand command){
    if(command.hasErrors()){
    chain(action: ‘show’, model: [command:command])//redirect instead of render
}
//else do save and redirect
}

一个潜在的缺点是将命令对象存储在闪存范围(最终是 session )中,这些对象可能会急切地获取命令中的关系。在 session 中存储命令对象会影响性能吗?

有更好的解决方案吗?

最佳答案

  • 为了防止在有人点击后退按钮时在注销后显示页面,请使用以下响应 header :
    Cache-Control: no-store, must-revalidate
    
  • 链听起来像是要走的路。您不需要为模型使用 Hibernate/JPA 实体,您可以创建一个特定于表单的类并复制到您的实体。这可能会占用更少的内存,尽管您不太可能使用闪存映射将其存储太久。
  • 关于security - 验证 POST 参数后防止浏览器密码缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32851258/

    相关文章:

    wcf - 如何验证应用程序而不是用户?

    security - 此服务器支持不安全的 Diffie-Hellman (DH) key 交换参数 (Logjam)。等级设置为 F

    php - 从我自己的安全系统中退出

    grails - 是什么导致 gsp 的 html 头中的脚本 block 被覆盖

    asp.net - 自 MS14-059 以来,System.Web.MVC 未复制到 bin 文件夹中。如何防止由于 Windows 更新而创建缺少 DLL 的构建?

    security - 如何使用 Javascript SDK authResponse 防止 "replay"

    security - Grails - 是否有推荐的方法来处理 AJAX 形式的 CSRF 攻击?

    java - 将 Grails 集成到现有的 Spring 应用程序中?

    java - 构建 Grails 应用程序时出错

    grails - 如何修改现有域并将新属性更新到Bootstrap?