0

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

4

1 回答 1

7

这实际上不是攻击。

执行“hack”与实际查看评论 #250 并对其进行投票之间没有区别。

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

简而言之:

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

始终验证输入是否有意义,并且允许用户执行操作。

于 2013-08-27T16:55:43.363 回答