使用隐藏字段进行后期编辑的安全问题


Security concerns of using hidden fields for post edits

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

我将post-id存储在一个隐藏字段中,这样我就可以更容易地访问页面上的一些ajax组件。

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

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

我对此有点困惑,我现在真的想不出比这更"安全"的替代方案了。有什么办法可以防止这种情况发生吗?

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

为了使变量更加安全,可以使用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

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

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

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

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

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