防止记录 ID 操纵


Protecting against record ID manipulation

如何防止恶意用户更改 URL 或表单数据,特别是记录 ID。例如:

http://example.com/deleteproduct.php?id=34

用户可以将 ID 值从 34 更改为 69,并在此过程中删除属于另一个客户的记录。我想明显的保护措施是在执行删除之前验证 ID,以确保用户有权访问该记录,但也许还有另一种方法可以考虑更好的做法?验证 ID 的缺点需要更多的数据库查询,这将非常容易避免。

我想明显的保护措施是在执行删除之前验证 ID,以确保用户有权访问该记录。

这是确保您的用户有权删除这些行的唯一方法。

验证 ID 的缺点需要更多的数据库查询,这将非常容易避免。

不一定。您只需检查何时删除即可仅删除属于您的用户的行。

例如,假设表结构类似于:

users
-----
id | username
1  | Dave
2  | John
products
-----
id | name | user_owner
1  | Milk | 1
2  | Cake | 2

因此,如果 Dave 访问了 deleteproduct.php?id=2,将执行以下查询:

DELETE FROM products WHERE id = 2 AND user_owner = 1;

它不会删除任何内容,$mysqli->affected_rows将返回零。

当受影响的行为零时,这意味着产品 ID 无效或产品不属于用户,无论哪种方式:您都会显示一条消息,告知用户产品 ID 无效。

他们是否有权删除项目? 如果是这样,有关系吗?如果是按记录授权...只需检查他们是否对请求的ID具有授权即可。 长话短说:检查他们是否获得授权,永远不要相信用户输入。

你说的很危险。

安全

首先,您需要保护数据并使其仅对所选用户可用。请使用角色和权限创建或微调访问列表。

  • 仅显示(登录)用户可以访问的元素的链接/按钮
  • 在访问(登录)用户访问元素之前检查权限(和角色)。不仅是行动,还有数据
  • 身份验证(用户
  • 是否登录?),授权(用户是否具有访问(数据)元素的正确权限?

其次,使用内部 id 的公共不是正确的方法。

隐藏内部 ID 总是好的,因为它使您的应用程序更安全。

数据访问

您必须访问您的数据。最简单的想法是在查询中检查它,如下所示:

DELETE FROM table WHERE id = 34 AND user_id = 1 // Delete only if id = 34 and user is 1

你明白这个想法吗?

内部 ID 的

您可以使用现有算法对 id 进行编码。只有使用您的密钥才能进行解码。有许多解决方案和软件包。

Hashids 是一个小型开源库,可从数字生成短、唯一、非顺序 ID。(http://hashids.org/php/)