【问题标题】:How to prevent an id from being modified?如何防止id被修改?
【发布时间】: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 存储到会话中,和/或隐藏隐藏在字段中的信息。

【问题讨论】:

  • 如果您对 cme​​ts 表的 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


【解决方案1】:

您无法强制执行 JavaScript,将 pid 存储在会话中会令任何人陷入多个标签疯狂,并且混淆永远不会奏效。

一种可能的解决方案是使用加盐哈希来验证数据。例如:

<input type="hidden" name="pid" value="<?= $pid ?>" />
<input type="hidden" name="pid_hash" value="<?= sha1('this is my salt' . $pid) ?>" />

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

【讨论】:

  • 太棒了,谢谢你的提示:)
  • 这是我想过但不确定标签的情况。通过强制执行 JavaScript,我的意思是在使用 noscript 时停止加载论坛。你的建议真的很有帮助!是否还有旋转后端的解决方案?出于某种原因,我无法绕开任何一个。
  • @W3Geek 永远不要依赖 JavaScript 来保护你。坚定的用户可以绕过您尝试的任何客户端保护,因为他们可以完全访问和控制正在执行的脚本。
  • @ceejayoz 他们总是会在其中。我根本不想这样做。它可能会减慢一些用户的速度,但它并没有完全保护。这就是为什么我想依赖后端。 编辑刚刚看到你帖子的结尾。
  • 同时为字段提供随机名称可能会有所帮助,并且在 HTML 中的其他位置偏移它们可能会使它们无法编辑值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-11
相关资源
最近更新 更多