使用隐藏字段进行帖子编辑的安全问题

时间:2012-07-27 21:49:56

标签: php codeigniter

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

我将帖子ID存储在隐藏字段中,这样我就可以更轻松地访问页面上的一些ajax组件。

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

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

我对此感到有些困惑,我现在无法想到更安全的替代品。有什么方法可以阻止这种情况吗?

如果有任何与此有关的建议,我正在使用Codeigniter构建。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

如果是用户页面,用户可以更改自己的帖子,那么您只需检查是否是首先发布帖子的经过身份验证的用户。

核心原则;有办法检查哪个用户始终发送请求,其余的由您的接收脚本验证。为此,您不能相信用户如实地说出他/她是谁(即您无法将用户ID保存在隐藏的后期字段中,因此如果您对请求使用ajax,请使用session-id或类似内容)

答案 2 :(得分:0)

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

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