我使用CodeIgniter,PHP和PDO for MySQL从头开发了一个公告板。现在我正在清理它并测试缺陷/安全漏洞。我遇到了一个小缺陷,我无法想到一个可靠的解决方案。用户可以使用甚至与任何论坛帖子无关的随机评论来充斥我的数据库。为了更好地描述这个问题,让我简要解释一下我的系统。
当您登录查看帖子时,将从数据库中提取帖子对象以及post_id
之后的任何相关评论。您可以选择阅读帖子并留下您自己的评论。底部的注释表单有一个名为pid
的隐藏字段,它存储了我们正在查看的当前帖子的ID,因此当您单击提交按钮时我可以保持状态。然而,这是一个垮台。隐藏字段可以在提交之前修改为任何整数值,您可能会猜到。
网址方案看起来就像您正在查看帖子一样;
http://www.domain.com/forum/post/22
按下提交后,您将被重定向到一个看起来像的网址
http://www.domain.com/forum/create_comment
...评论信息将与相关的用户ID和帖子ID一起插入数据库。
我尝试针对引用网址进行测试,但案例类似。我提出了几个解决方案,但我不知道他们中是否有任何想法?执行JavaScript,将pid
存储到会话中,和/或隐藏在该字段中隐藏的信息。
答案 0 :(得分:5)
您无法强制执行JavaScript,将pid
存储在会话中会驱动任何拥有多个标签的人,并且混淆也无法正常运行。
一种可能的解决方案是使用salted哈希来验证数据。例如:
<input type="hidden" name="pid" value="<?= $pid ?>" />
<input type="hidden" name="pid_hash" value="<?= sha1('this is my salt' . $pid) ?>" />
提交时,您拒绝哈希不符合pid
值的任何内容。由于盐从未暴露给用户的浏览器,因此他们应该很难将其伪造为不存在的pid。