我见过很多网站(包括SO和我的网站),用于将从数据库中提取的数据的行ID存储在HTML属性中。我知道它可以由客户端的用户编辑,并可能发送到服务器端以根据更新数据。就拿这个查询为例,记住,它是upvoting评论:保持数据更新安全
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,当你改变它的属性引用来评论重要信息时,它似乎用更新属性的ID更新数据库。
身份验证?如果用户没有发表评论#250,他们就不应该在服务器端访问来修改它。 – ceejayoz
您无法阻止某人使用客户端工具来篡改THEIR计算机上THEIR浏览器中存储的数据。这是Wild Wild Web - 永远不要相信任何来自客户端的东西。如果你不希望评论#250被提高,那么如果用户不在评论#250应该被提升的页面上,则不要允许提高评论。 –
您的选择是为注释密钥使用GUID或其他不可增量的数据类型,或对提交的值执行安全检查,这对匿名用户可能不可行。 – Grax