防止记录ID操作

时间:2016-01-28 17:55:03

标签: php database security

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

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

用户可以将ID值从34更改为69,并且这样做会删除属于另一个客户的记录。我想明显的保护是在执行删除之前验证ID以确保用户可以访问该记录,但是可能有另一种方法考虑更好的做法吗?验证ID的缺点是需要更多的数据库查询,这是很好的避免。

3 个答案:

答案 0 :(得分:1)

  

我想明显的保护措施是在执行删除之前验证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为无效。

答案 1 :(得分:0)

他们是否有权删除商品?如果是的话,这有关系吗? 如果是每次记录授权...只需检查他们是否拥有所请求ID的授权。简短答案:检查他们是否获得授权,绝不相信用户输入。

答案 2 :(得分:0)

你所说的非常危险。

安全

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

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

第二,使用内部id的公共信息并不是一种正确的方法。

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

数据访问

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

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

你明白这个想法吗?

内部标识

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

  

Hashids是一个小型开源库,可以从数字生成简短,独特,非顺序的ID。 (http://hashids.org/php/