Php 确保数据更新的安全性
我见过许多网站,包括SO和我的网站,它们将从数据库中提取的数据行id存储在HTML属性中。我知道它可以由客户端的用户编辑,也可以发送到服务器端根据需要更新数据。以此查询为例,请记住,它用于投票评论: 选择comment_id,comment FROM comments 正常人会这样打印: 以及输出:Php 确保数据更新的安全性,php,html,mysql,Php,Html,Mysql,我见过许多网站,包括SO和我的网站,它们将从数据库中提取的数据行id存储在HTML属性中。我知道它可以由客户端的用户编辑,也可以发送到服务器端根据需要更新数据。以此查询为例,请记住,它用于投票评论: 选择comment_id,comment FROM comments 正常人会这样打印: 以及输出: <td data-commentid="1">+1, beat me to it.</td> <td data-commentid="2">Damn! What
<td data-commentid="1">+1, beat me to it.</td>
<td data-commentid="2">Damn! What is this?</td>
...
当它显示给某个黑客类型的用户时,他将尝试编辑类似于250的commentid,并单击upvote按钮,我们的无辜脚本将接受它并将upvote另一条id为250的评论,尽管它在视觉上用于id为1或2的评论
问题:
有没有办法摆脱这个?您可以打开控制台并进行检查,因此当您将其属性引用更改为注释重要信息时,它似乎会使用更新的属性id更新数据库。这实际上不是攻击 进行黑客攻击与实际查看评论250并对其进行升级投票之间没有区别 如果用户将ID或操作更改为他不允许执行的操作,则必须使用服务器端授权/访问控制来拒绝该请求 简言之: 绝不信任客户提供的任何信息。
始终验证输入是否有意义,以及是否允许用户执行操作。验证?如果用户未发布评论250,则他们不应具有服务器端修改评论的权限。您不能阻止某人使用客户端工具来篡改其计算机上浏览器中存储的数据。这是一个疯狂的网络——永远不要相信来自客户的任何东西。如果不希望对注释250进行升级表决,则如果用户不在应升级注释250的页面上,则不允许对其进行升级表决。您可以选择对注释键使用GUID或其他不可增加的数据类型,或对提交的值实施安全检查,这对于匿名用户来说可能是不可能的。@ceejayoz我没有发布你的评论,但我可以投票,对吗?@Dexa如果我想手动更改ID并投票给错误的评论,谁在乎呢?从不信任的逻辑结果就是验证一切。