0

当提交向数据库中插入记录并且操作成功的表单时,我会进行重定向,然后在 Url 中传递一些参数以显示新插入的记录以及标题消息(即“插入成功”) .

response.sendRedirect(yPage + "?pid=" + ipd + "&feedback=" + form.getFormFeebackSB() );

然后我会在jsp中显示如下: <c:out value="${param.feedback}" />

我使用重定向而不是转发,因为我希望操作是幂等的。当我使用forward成功插入后点击刷新的用户时,通常总是在警告弹出窗口上单击重试,这会导致重复插入。

然后我们的 IT 部门发现我有一个 XSS 漏洞:

page.jsp?feedback=%3Cscript%20type=%22text/javascript%22%3Ealert%28%27xss%27%29;%3C/script%3E

所以我改成这样: <c:out value="${param.feedback}" escapeXml='true'/>

但是现在<br>我的 FeedbackSB 中的任何内容都被转义了,我最终得到了这样的标题消息

Insert was successful<br>An email was sent to Joe<br>Now Complete the XYZ Form;

将消息传递回用户的标准方法是什么,同时保持任何提交幂等并防止 XSS?

编辑:

我搜索了 Flash Scope 并遇到了这个http://blog.smartkey.co.uk/2011/01/implementing-flash-scope-in​​-java -web -applications/ 因为我的应用程序需要做很多工作才能合并框架,该链接中提到的过滤器很容易合并,并且能够轻松实现闪存范围。

4

1 回答 1

3

不要在重定向中传递消息本身。将消息存储在会话中的唯一键下,使用此消息的键作为 URL 参数进行重定向,然后转到会话,获取消息并显示它。

我也会立即从会话中删除消息:如果用户刷新,没有理由再次告诉他插入成功。

大多数 MVC 框架使用它们通常称为 Flash 作用域(一旦检索到它们就从会话中删除的会话属性)为您执行此操作。

于 2012-09-19T21:20:40.653 回答