如何解决这个问题?
应用程序的表单包含密码和其他输入字段。用户必须输入密码才能提交交易以及其他交易信息。在交易提交时,密码是安全检查所必需的。
表单输入值绑定到命令对象。
这是我们的应用程序处理此问题的方式:
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
}
一个潜在的缺点是将命令对象存储在可能在命令中急切获取关系的闪存范围(最终是会话)中。在会话中存储命令对象会影响性能吗?
有更好的解决方案吗?
答案 0 :(得分:1)
要防止有人点击后退按钮后退出时显示页面,请使用以下响应标题:
Cache-Control: no-store, must-revalidate
链条听起来像是要走的路。您不需要为模型使用Hibernate / JPA实体,您可以创建特定于表单的类并复制到您的实体。这可能会占用更少的内存,但使用Flash地图不太可能存储太长时间。