【发布时间】:2023-03-28 00:35:02
【问题描述】:
我使用 CodeIgniter、PHP 和 PDO for MySQL 从头开发了一个公告板。现在我正在清理它并测试缺陷/安全漏洞。我遇到了一个小缺陷,我想不出一个可靠的解决方案。用户可以用随机的 cmets 淹没我的数据库,这些 cmets 甚至与任何论坛帖子都没有关联。为了更好地描述这个问题,让我简要介绍一下我的系统。
当您登录查看帖子时,帖子对象以及通过 post_id 的任何相关 cmets 将从数据库中提取。您可以选择阅读帖子并留下自己的评论。底部的评论表单有一个名为 pid 的隐藏字段,它存储我们正在查看的当前帖子的 id,因此当您单击提交按钮时我可以保持状态。然而,这有一个垮台。正如您可能猜到的那样,隐藏字段可以在提交之前修改为任何整数值。
URL 架构类似于您查看帖子时的样子;
http://www.domain.com/forum/post/22
并且在按下提交后,您将被重定向到一个看起来像这样的 URL;
http://www.domain.com/forum/create_comment
...评论信息将与关联的用户ID和帖子ID一起插入到数据库中。
我尝试针对引用 URL 进行测试,但情况类似。我想出了几个解决方案,但我不知道其中是否有任何想法?强制执行 JavaScript,将 pid 存储到会话中,和/或隐藏隐藏在字段中的信息。
【问题讨论】:
-
如果您对 cmets 表的 post_id 有 FK 约束,mysql 将不允许您插入 post_id 不存在的行。
-
@VBCPP 不过,这不会涵盖诸如猜测您无法访问的私人论坛中帖子的 ID 之类的事情。
-
@ceejayoz 没错!这只会使评论停止在数据库中,直到最终创建具有该 ID 的帖子。
-
@ceejayoz 正确,但问题中没有提到这种担忧。我会在插入之前处理权限问题。如果 pid 是 23 并且用户有权在 23 上发布,我会让他们,不管他们是否改变它
-
@VBCPP 我已经设置了权限系统,因此如果用户尝试在私人帖子上发帖,除非他们是模组、管理员或受邀发表评论,否则不会让他们发帖。这不是问题,因为它不会让他们发布到私人帖子 ID,但问题是,他们仍然可以将 cmets 随机插入到来自不同帖子的帖子中。不过是个好主意!我可以将其与 ceejayoz 答案交织在一起。
标签: php mysql pdo primary-key spam-prevention