2010-08-05 57 views
6

我只是有这个想法,我不知道我是否慢。网络应用程序:存储ID隐藏字段安全吗?

通常,我将我正在编辑的项目的ID存储在隐藏字段中。然后在后端(我使用PHP/Zend框架btw),我知道它确定哪些项目被编辑。但后来我想,在更安全的情况下,例如。编辑配置文件,用户可以以某种方式编辑隐藏的字段吗?然后他可以编辑其他人的个人资料。我知道编辑配置文件,我可以得到ID形式的会话变量,但是如果我有什么需要我将ID存储在某处?

我得到ACL(Zend_Acl)我这样做。基本上从请求中获取参数params

$id = $req->getParam('id'); 

然后检查是否允许登录的用户编辑该项目。但事情是我不知道这个网址是不是像/users/edit/1其中1是id。但不知何故,隐藏字段变为2,请求参数是什么?

你会如何处理这个问题?

回答

10

您必须在客户端存储某种id,否则您如何知道要编辑哪个项目?
这并不免费从强制检查服务器上当前用户有权编辑/查看编辑的项目。
除此之外,你为什么会在乎他如何编辑项目(无论是通过合法使用Web工具,还是编辑隐藏/任何字段)。

+0

我想知道如果id参数在GET和POST中都设置,我会得到什么值?哪些将被使用? – 2010-08-05 13:22:32

+0

它是在php.ini – 2010-08-05 13:46:06

+0

中定义的那么当然,这取决于你实际调用的是哪一个。 $ _POST或$ _GET。然后,您可以选择使用哪一个,并且据我所知,使用全局变量并不是一个好主意。 – webnoob 2010-08-05 13:56:14

1

将ID存储在隐藏值中并不十分安全。通常,我们在会话变量中存储ID。

+1

没有必要使用会话变量。它在语义上更合理(更容易)检查用户发布数据是否有权编辑他们发布数据的记录。 – meagar 2010-08-05 13:57:02

+0

啊。 meagar,你说了我的想法!有2个变量,据说shld存储相同的值,是凌乱的,也许容易出错 – 2010-08-05 14:12:05

+0

该OP是问如何确定正在编辑的记录是什么没有被改变,即他们如何存储ID然后回发到服务器查询记录,因此ppshein的声明是正确的。您可以将ID存储在会话中,以便无法更改,然后检查该记录的权限。如果您不知道正在编辑什么文档,则无法检查权限。 – webnoob 2010-08-05 14:35:09

0

它不应该基于用户提交的任何内容。 您应该始终检查服务器端的用户权限。 攻击者可以准备任何请求到您的服务器。

1

正如ppshein所说,将敏感ID存储在隐藏变量中并不安全。你会在隐藏的变量中存储密码吗?即使是新手黑客也很容易获得这些数据。

您需要确保所有访问控制都由服务器强制执行。

对于您的情况,您需要确保登录的用户(会话中的用户)是正在编辑的配置文件的所有者。或者正在进行编辑的用户有权编辑该配置文件(例如管理员)

0

同意上述所有要点,但如果您确实需要为任何原因存储客户端,则始终可以加密数据和解密,当你需要使用它时,但使用会话将是处理它的最佳方式,因为它们不可访问客户端。

+0

这不会改变用户可以更改值tho的事实。 – 2010-08-05 14:13:52

+0

当然这就是服务器端验证的地方。如果黑客更改了加密ID中的值,那么它将不再正确解密,因此您会知道有什么地方出错。 – webnoob 2010-08-05 14:32:29

+0

然后我认为在这种情况下加密可能不太有用,因为id不是秘密。加密与否,我仍然需要检查用户是否有权访问请求的资源。 – 2010-08-06 06:40:19