如何防止恶意用户更改URL或表单数据,尤其是记录ID。例如:
http://example.com/deleteproduct.php?id=34
用户可以将ID值从34更改为69,并且这样做会删除属于另一个客户的记录。我想明显的保护是在执行删除之前验证ID以确保用户可以访问该记录,但是可能有另一种方法考虑更好的做法吗?验证ID的缺点是需要更多的数据库查询,这是很好的避免。
答案 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/)