【问题标题】:can model attributes be altered by a hacker? Spring, Java黑客可以更改模型属性吗?春天,Java
【发布时间】:2019-12-15 23:08:10
【问题描述】:

在我的 approute /edit RequestMethod.GET

我将值 customerId 放入模型中 model.addAttribute("customerId",customerId);

然后视图(form method="POST")将数据发送到approute /edit RequestMethod.POST

我在 post approute 中需要 customerId,因此在表单中我有一个 customerId 的隐藏输入。我发现我什至不需要隐藏输入。 (实际上,如果我使用隐藏输入,它会被忽略。POST approute 将获取我从 GET approute 传递给视图的原始 customerId)

假设用户有权编辑 customerId 36 但没有 customerId 45。customerId 36 被发送到视图。黑客是否可以将 customerId 更改为 45 并编辑他无权编辑的内容,或者我可以确保 customerId 仍然是 36?当我使用隐藏输入时,我在 post approute 中进行了检查,以检查用户是否有权编辑该客户。现在我不确定是否有必要。

如果我没有将它作为隐藏输入,我基本上不知道 post approute 从哪里获取 customerId。它已加载到模型中,因此模型是否存在于服务器端并且它是安全的,还是 customerId 从用户那里收到并且他可以操纵它?

【问题讨论】:

  • 你所说的“黑客”是什么意思? smb谁能拦截和修改前后端的通信?或者 smb 攻击了您的服务器并访问了您的应用程序和数据库?或谁可以访问前端代码,例如正常访问前端并尝试对数据进行一些恶意操作的普通用户?
  • 您似乎需要意识到 Spring 被无数不同的项目以无数不同的方式使用。什么是“approute”?为什么您需要进行 GET 以获得您需要然后 POST 的视图?详细说明您正在使用的技术。
  • 您需要首先了解 HTTP 在基本级别(请求和响应)上的工作原理,然后应用可以编写自定义 HTTP 客户端向您发送任何东西的规则而且你永远不能相信客户的意见。

标签: java spring parameters model


【解决方案1】:

如果您所说的“黑客”是指对应用程序具有合法访问权限但试图对数据进行一些恶意修改的用户...

在服务器端,您应该期望您的用户可以向您的应用程序发送请求中的任何数据。不仅这些可以更改您之前发送的数据,而且用户可以向服务器发送任何数据,即使他之前没有从服务器收到此类数据。

在服务器端你不应该关心之前发生了什么,你向用户发送了什么数据,数据如何存储在客户端,一些元素如何在客户端互操作等等。你应该识别 每个请求中的用户,并检查该用户是否有权限对请求的数据执行请求的操作。

【讨论】:

  • 谢谢。主要是我只是不知道 customerId 来自哪里。我有这个:@RequestMapping(value = "edit", method = RequestMethod.POST) public String overwriteCustomer(@ModelAttribute @Valid Customer customer, Errors errors, Model model, @RequestParam(value = "customerId") Integer customerId, 表单中没有隐藏输入或任何内容来发送 customerId,所以我不知道 approute 从哪里得到它。我不知道它是否从用户那里发回,或者它是否安全可靠地返回服务器或模型或会话或什么。
  • 你为什么关心隐藏字段或不关心隐藏字段?在服务器端,您不知道客户端如何构造请求。用户不仅可以在浏览器中创建此请求,还可以通过 curl 工具、通过浏览器中的 postman 扩展程序甚至开发发送此类请求的 Java/Python/C# 等客户端.如果您对用户可以做什么和不能做什么做任何假设,这是很危险的。用户可以向您的服务器发送任何数据。检查谁是当前用户(取决于您使用的身份验证机制:OAuth2,...),然后检查此用户是否有权对这些特定数据执行此操作。
  • 我想知道 customerId 来自哪里。当用户单击确定并提交表单时,它是否从用户发送回服务器?还是在服务器上,spring 检查用户并从会话中获取 customerId 或其他什么?
  • 您最初的问题是黑客是否可以更改数据。答案是:是的,他可以。现在您在询问客户端是如何生成请求的。请为此创建一个单独的问题。还要准确描述您在前端使用的技术/框架。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多