2013-08-27 70 views
0

我见过很多网站(包括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更新数据库。

+1

身份验证?如果用户没有发表评论#250,他们就不应该在服务器端访问来修改它。 – ceejayoz

+0

您无法阻止某人使用客户端工具来篡改THEIR计算机上THEIR浏览器中存储的数据。这是Wild Wild Web - 永远不要相信任何来自客户端的东西。如果你不希望评论#250被提高,那么如果用户不在评论#250应该被提升的页面上,则不要允许提高评论。 –

+0

您的选择是为注释密钥使用GUID或其他不可增量的数据类型,或对提交的值执行安全检查,这对匿名用户可能不可行。 – Grax

回答

7

这实际上并不是一次攻击。

执行“破解”和实际查看注释#250并将其加上之间没有区别。

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

总之:

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

总是验证输入是否有意义,并允许用户采取措施。

+0

永不相信的逻辑结果是**验证所有内容**。 – tadman