【问题标题】:How to prevent user to access other users' data?如何防止用户访问其他用户的数据?
【发布时间】:2013-12-04 05:02:53
【问题描述】:

问题

  • 用户通过应用程序验证
  • 简单的数据库架构:用户 ---> 文档 ---> 项目
  • 用于访问文档项的 API

如果登录的用户知道属于其他用户的项目的 ID,他就可以访问它。 我想阻止这种行为。

解决方案

我找到的第一个解决方案是在每个表中的每个记录中添加一个 userid 字段,以便在每次查询时检查该记录是否属于已登录的用户。

这是一个好的解决方案吗?你知道一些更好的设计模式来防止用户访问其他用户的数据吗?

谢谢

【问题讨论】:

  • 您不应该允许用户输入他们的“ID”作为参数。这应该存储在会话或其他内部数据存储中,并且不应被允许对其进行编辑。
  • 我认为更好的解决方案是:我将用户 ID 存储在会话中,并为每个表添加字段用户 ID。这样在每次查询时我都可以检查记录的所有权
  • 您无需更改存储数据的方式即可实现此目的。我不确定您使用的是哪个数据库。请考虑使用视图而不是更改架构。
  • 我使用的是 NOSql 数据库
  • 我现在明白为什么您更喜欢将 UserId 添加到每个项目。我不确定 NOSql 是否适合这种架构,但我不是这方面的专家。祝你好运。

标签: database design-patterns database-design data-structures architecture


【解决方案1】:
  1. 如果文档属于某个用户,请调整您的查询,以便只检索属于该用户文档的项目。无需将用户 ID 添加到项目本身。
  2. 如果您需要向用户公开 ID,请将这些 ID 设为 GUID,而不是连续数字。虽然不是一个完美的解决方案,但它让猜测其他用户物品的 ID 变得更加困难,
  3. 如果您使用的是 Oracle,则有 VPD,即虚拟专用数据库。您可以使用它来限制用户的访问。

【讨论】:

  • 我不同意为此使用 GUID。只是不要在系统之外公开 SQL ID。它应该是一个内部字段。但我知道这可能是一个比你想要的更大的变化。
  • 我必须公开记录ID,因为对象是在不同的时间加载的
  • @samyi 已在回答中注明并解决。
猜你喜欢
  • 1970-01-01
  • 2020-05-21
  • 2018-11-06
  • 2018-04-27
  • 2016-07-05
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多