Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用隐藏字段进行后期编辑的安全问题_Php_Codeigniter - Fatal编程技术网

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

Php 使用隐藏字段进行后期编辑的安全问题,php,codeigniter,Php,Codeigniter,所以我有一个编辑文章的页面。假设用户访问site.dev/post/edit/104,从数据库中获取一个包含该帖子所有数据的表单 我将post id存储在一个隐藏字段中,以便更容易访问页面上的一些ajax组件 现在,我可以打开FireBug并在隐藏字段中更改帖子id,没问题。怎样才能阻止恶意用户编写一个简单的脚本,只更改帖子id,并用他们在表单中填写的内容覆盖数据库中的每个帖子id 当然,用户访问页面确实需要经过身份验证,我在服务器端进行验证,以确保post ID和其他字段包含可接受的值,但只要

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

我将post id存储在一个隐藏字段中,以便更容易访问页面上的一些ajax组件

现在,我可以打开FireBug并在隐藏字段中更改帖子id,没问题。怎样才能阻止恶意用户编写一个简单的脚本,只更改帖子id,并用他们在表单中填写的内容覆盖数据库中的每个帖子id

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

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


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

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

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


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

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

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


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

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


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

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


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

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

$id = 1;
$encrypted_id = $this->encrypt->encode($id);
因此,当您打印URL时,不要直接将id打印为整数,而是打印加密的\u id。用户将不知道这意味着什么,并且,只要它没有您的密钥,它就无法解码id:D

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

有关更多信息,请访问:

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

$id = 1;
$encrypted_id = $this->encrypt->encode($id);
因此,当您打印URL时,不要直接将id打印为整数,而是打印加密的\u id。用户将不知道这意味着什么,并且,只要它没有您的密钥,它就无法解码id:D

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

有关更多信息,请访问: