【问题标题】:Spring MVC hiding url parameters on GETSpring MVC在GET上隐藏url参数
【发布时间】:2013-04-28 00:48:33
【问题描述】:

我有一个页面重定向到另一个页面,但是在重定向中传递了一个参数。在控制器中有一个 url 映射,该映射将 url 与 GET 方法匹配。 get 方法接受参数并在显示器上设置值。网址如下所示:

http://localhost:1234/appName/pageName.htm?recNo=123

但是,用户可以很容易地将参数值从 123 更改为任意值,然后刷新页面。一旦用户输入的recNo有效并且页面被刷新,数据将被显示。我想让用户只能查看通过的 recNo 的记录。我不希望用户能够修改 url 中的参数。

在 Spring MVC 中处理此问题的最佳方法是什么?该方法必须是页面重定向后的 GET。

【问题讨论】:

  • 如果你在你的函数中做一些验证以确保用户有权访问那个recNo?

标签: java spring spring-mvc


【解决方案1】:

如果您的请求必须是 GET.. 这意味着它必须是无状态的。它不应该依赖于用户在最后一次请求中所做的事情,这也意味着正确执行 GET 请求所需的所有信息都应该包含在 GET 请求中。

考虑到这一点,在 URL 中传递信息的唯一方法是使其成为 URI 的一部分,或作为 URL 参数。 所以要么/app/product/123要么/app/product?id=123

这会将 URL 暴露给可能的安全漏洞,用户可以在其中操纵 url 中的 id,

有两种解决方案:

  1. 在后端实施更强大的系统,以检查 GET url 中引用的 id 是否与尝试访问该 URL 的用户关联/允许。基本上更加明确和深思熟虑地断言您的安全约束。如果您的用户是未经身份验证的用户,此方法将失败。 (无需登录)。

  2. 第二种解决方案是在 url 中公开 id 的加密和编码版本。不过,您应该使用双向加密。因此,当 POST 请求完成时,它会对 id 进行加密和编码,并将其附加到后续的 GET 请求中。当收到 GET 请求时,您解码和解密 url 参数以获取真实 id 并显示适当的内容。这种方法基本上意味着用户很难操纵一个加密的参数,这样它就可以被解密以产生一个有效的数字。我经常使用AES加密和Base 64编码。

希望这会有所帮助。

【讨论】:

  • 我将参数存储在会话中,这也为我做了加密。它还对参数名称进行加密,因此用户无法知道参数名称或传递的值。
  • 我想你错过了我的意思.. 使用会话中的 id,你可以在不同的浏览器中重新使用 url 并仍然看到真实的结果吗?如果你不能,那么提出请求 GET 真的没有任何好处吗?我的意思是在 url 中加密它,而不是 /app/product/123 它看起来像 /app/product/ASDASD323423SDASD
  • 我采用了您的第二种解决方法,并且成功地应用了参数值的加密。该网址确实看起来像 /app/product?id=%34&id=115&id=77&id=12 但是我如何在控制器中为这样的网址编写请求映射?
  • 等等,为什么你的 url 现在有多个 id?在任何情况下,您都可以使用 @RequestParam 注释将 url 参数映射到方法参数。如果您在使用特定类型的 url 和方法签名时遇到困难,我建议您单独提出一个问题,这样会更容易理解问题。
【解决方案2】:

如果您要重定向到同一应用程序中的页面,您可以将此信息存储在会话中使用@SessionAtrribute

【讨论】:

  • 完成后如何清除会话属性我想在向用户显示记录后立即清除它
  • 当我使用 session.setAttribute("recNo",0); recNo 仍然存在我必须关闭浏览器并重新打开它以使会话属性丢失值
  • 我什至尝试过 session.removeAttribute() 并没有运气。我需要删除它而不必关闭浏览器并重新打开它
  • 你可以使用 SessionStatus.setComplete() 检查这个链接vard-lokkur.blogspot.com/2011/01/…
  • @从 3.1 开始,我们可以使用 RedirectAttributes 并且可以使用 .addFlashAttribute 或 . addAttribute 方法
【解决方案3】:

假设:如果不强制使用“get”方法。

我认为,您可以使用“post”方法而不是“get”方法来隐藏URL中的参数。

在 HTML 表单中,您可以添加 method="post" 。下面是例子:

<form action="hello" method="post">
    <input type="text" name="name" /> <br>
    <input type="submit" title="Submit">
</form>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多