我已经看到许多网站(包括SO和我的网站)将从数据库中提取的数据的行ID存储在HTML属性中。我知道它可以由客户端的用户编辑,也可以发送到服务器端以更新数据。以该查询为例,请记住,这是用于评论的:

SELECT comment_id, comment FROM comments

普通人将按照以下方式进行打印:

<td data-commentid="<?php echo $row['comment_id']; ?>"><?php echo $row['comment']; ?></td>

和输出:

<td data-commentid="1">+1, beat me to it.</td>
<td data-commentid="2">Damn! What is this?</td>
...


当将其显示给某些黑客类型的用户时,他将尝试使用250之类的内容编辑commentid,然后单击upvote按钮,我们的无辜脚本将接受它,并将对ID为250的其他评论进行投票,尽管它在视觉上是ID为的注释1或2

题:

有什么办法可以摆脱这个?您可以打开控制台并检查SO,当您更改其属性引用以注释重要信息时,它似乎使用更新的属性ID来更新数据库。

最佳答案

那实际上不是攻击。

执行您的“ hack”与实际查看注释250和对其进行评论之间没有区别。

如果用户将ID或操作更改为不允许执行的操作,则必须使用服务器端授权/访问控制来拒绝请求。

简而言之:

永远不要相信客户提供的任何信息。

始终验证输入是否合理,并允许用户执行操作。

关于php - 确保数据更新安全,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18471342/

10-09 15:37
查看更多