如何防止id被修改?

4
我使用CodeIgniter、PHP和PDO for MySQL从头开始开发了一个公告板。现在我正在清理它并测试缺陷/安全漏洞。我遇到了一个小缺陷,我无法想出一个坚实的解决方案。用户可以用与任何论坛帖子都不相关的随机评论淹没我的数据库。为了更好地描述这个问题,让我简要解释一下我的系统。
当您登录查看帖子时,通过post_id从数据库中获取帖子对象以及任何相关评论。您可以选择阅读帖子并留下自己的评论。底部的评论表单有一个名为pid的隐藏字段,它存储我们正在查看的当前帖子的ID,以便在单击提交按钮时保持状态。然而,这也有一个缺点。在提交之前,隐藏字段可以被修改为任何整数值,正如您可能猜到的那样。
当您查看帖子时,URL方案看起来像这样; http://www.domain.com/forum/post/22 提交后,您将被重定向到一个类似于以下内容的URL; http://www.domain.com/forum/create_comment ...在那里,评论信息将与关联的用户ID和帖子ID一起插入到数据库中。
我尝试针对引用URL进行测试,但情况类似。我想出了几个解决方案,但不知道它们是否是理想的?强制使用JavaScript、将pid存储到会话中,和/或混淆隐藏在字段中的信息。

如果在评论表上的post_id上有一个FK约束,MySQL将不允许您插入一个不存在的post_id行。 - VBCPP
@VBCPP,这并不能解决猜测私有论坛中帖子ID的问题,因为你无法访问该论坛。 - ceejayoz
@ceejayoz 没错!这只会阻止评论一直停留在数据库中,直到具有该ID的帖子最终被创建。 - Codist
@W3Geek,我想我没有看到问题所在。如果他们有权限在第23篇文章上发布,那么如果他们将页面22的ID更改为23,这有什么关系呢?无论如何,请随意忽略,祝好运和玩得开心。 - VBCPP
@VBCPP 这个问题就像之前提到的那样很小,实际上更像是一种麻烦。我只是不希望用户编辑它的主键信息并留下垃圾邮件的痕迹,如果这有任何意义的话。 - Codist
显示剩余2条评论
1个回答

5
你无法强制执行 JavaScript,将 pid 存储在会话中会让使用多个选项卡的人感到烦恼,而混淆往往效果不佳。
一个可能的解决方案是使用加盐散列来验证数据。例如:
<input type="hidden" name="pid" value="<?= $pid ?>" />
<input type="hidden" name="pid_hash" value="<?= sha1('this is my salt' . $pid) ?>" />

提交时,您需要拒绝任何哈希与pid值不匹配的内容。由于盐永远不会暴露给用户的浏览器,所以他们应该很难为不存在的pid伪造它。

太棒了,谢谢你的提示 :) - Ravi Dhoriya ツ
这是我考虑过但不确定选项卡的情况。通过强制执行JavaScript,我的意思是如果使用noscript,则停止加载论坛。您的提示真的很有帮助!还有其他围绕后端的解决方案吗?出于某种原因,我无法理解任何一个。 - Codist
@W3Geek 永远不要依赖 JavaScript 来保护你。决心的用户可以绕过你尝试的任何客户端保护,因为他们拥有对执行的脚本的完全访问和控制权。 - ceejayoz
@ceejayoz 他们总是会这样做的。我根本不想这样做。它可能会减慢一些用户的速度,但它并不是完全的保护。这就是为什么我想依靠后端。编辑刚看到你帖子的结尾。 - Codist
此外,给字段随机命名可能会有所帮助,将它们偏移至 HTML 中的其他位置可能会使编辑值更加困难。 - Codist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接