php - 保持数据更新安全

标签 php html mysql

我见过许多网站(包括 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 之类的东西编辑 commentid,然后单击“upvote”按钮,我们无辜的脚本会接受它并会 upvote id 为 250 的其他评论,尽管它在视觉上是用 id 1 或 2 评论。

问题:

有什么办法可以解决这个问题吗?您也可以打开控制台并检查 SO,当您更改其引用评论重要信息的属性时,它似乎会使用更新后的属性 ID 更新数据库。

最佳答案

这实际上不是攻击。

执行您的“破解”与实际查看评论 #250 并点赞之间没有区别。

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

简而言之:

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

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

关于php - 保持数据更新安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18471342/

相关文章:

php - 如何检测浏览器/选项卡是否关闭

php - 将变量数据从 jQuery 保存到 PHP 并在页面重新加载后获取它

html - 页脚未粘在页面底部

PHP:将时间转换为设备时区

Mysql计数器字段。计数器+1

mysql - 大查询 : how to retrieve values in field 1 corresponding to field 2

php - 调试 Drupal 的白屏死机?

php - 使用 DateTime 设置日期时 Symfony2 格式错误

html - 在具有固定父背景的同时查看完整的子 div

javascript - ngOninit 变量在 html angular 4 中没有绑定(bind)