0

所以我有一个用于编辑帖子的页面。假设用户访问 site.dev/post/edit/104 以获取一个表单,其中填充了数据库中该帖子的所有数据。

我将帖子 ID 存储在一个隐藏字段中,以便更容易访问我在页面上拥有的一些 ajax 组件。

现在,我可以打开 FireBug 并在隐藏字段中更改帖子 ID 没问题。如何阻止恶意用户编写一个简单的脚本来更改帖子 ID 并用他们在该表单中填写的任何内容覆盖数据库中的每个帖子 ID?

当然,用户必须经过身份验证才能访问该页面,并且我在服务器端进行验证以确保帖子 ID 和其他字段具有可接受的值,但只要帖子 ID 是整数,它就会更新商场。我想这仍然是一个问题,它是由 URL 中的查询字符串传递的,但是页面至少会加载所有内容。

我对此有点困惑,我现在真的想不出一个更“安全”的替代方案。有什么方法可以防止这种情况吗?

如果有任何与之相关的建议,我正在使用 Codeigniter 进行构建。

4

3 回答 3

2

为了使您的变量更安全,您可以使用 CI 的加密类。您只需在配置文件中设置加密密钥,在控制器中加载库并使用以下代码加密 ID:

$id = 1;
$encrypted_id = $this->encrypt->encode($id);

因此,当您打印 URL 时,不是直接将 id 打印为整数,而是打印 encrypted_id。用户将不知道这意味着什么,只要它没有您的密钥,它就无法解码 id:D

当您收到编码后的 id 时,您可以使用加密类的 decode() 方法对其进行解码。

欲了解更多信息,请访问: http ://codeigniter.com/user_guide/libraries/encryption.html

于 2012-07-28T05:33:53.920 回答
1

如果您谈论的是管理员页面,那么就没有真正的安全问题,如果管理员想要更改任何帖子,他/她无论如何都可以这样做。

如果它是一个用户页面,用户可以在其中更改他/她自己的帖子,那么您可以简单地检查是否是经过身份验证的用户首先发布了帖子。

核心原则;有一种方法可以随时检查哪个用户发送了请求,其余的取决于您的接收脚本来验证。为此,您不能相信用户如实说出他/她是谁(即,您不能将用户 ID 保存在隐藏的帖子字段中,因此如果您使用 ajax 请求,请使用会话 ID 或类似名称) .

于 2012-07-27T21:58:52.903 回答
0

一般来说,用户输入是不可信的。没有任何机制可以阻止用户更改发送到服务器的内容。必须为每个请求验证所有数据。在这种情况下,这意味着检查帖子 ID 是否有效以及用户是否有权对其进行编辑。只要您执行这些检查,用户是否发送手工制作的请求实际上并不重要,因为他无法通过正常使用您的网站做任何事情。

当然,这意味着您需要一种方法来识别哪个用户发送了特定请求。如果您为此目的使用会话 ID,则必须确保它们是随机生成的,以便用户无法猜测属于其他用户的有效 ID。

于 2012-07-27T22:18:18.370 回答