我见过许多网站(包括 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,然后单击 upvote 按钮,我们无辜的脚本将接受它并投票支持 id 为 250 的其他评论,尽管它在视觉上是带有 id 的评论1 或 2。
问题:
有没有办法摆脱这个?当您更改其属性引用以评论重要信息时,您也可以打开控制台并检查 SO,它似乎使用更新后的属性的 id 更新数据库。