我见过许多网站(包括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之类的东西编辑评论,然后单击向上投票按钮,我们无辜的脚本会接受它,并向上投票给id为250的其他评论,尽管它在视觉上是id为1或2的评论。
问题:
有什么办法摆脱这种情况吗?当您将SO的属性引用更改为注释重要信息时,您也可以打开控制台并检查SO。它似乎会用更新后的属性id更新数据库。
这实际上不是一次攻击。
执行您的";破解";并实际查看评论#250并对其进行投票。
如果用户将ID或操作更改为不允许执行的操作,则必须使用服务器端授权/访问控制来拒绝请求。
简而言之:
永远不要相信客户提供的任何信息
始终验证输入是否合理,以及是否允许用户执行操作。