2011-03-04 101 views
0

我有一个用于编辑用户的表单。将用户标识传递给客户端(在隐藏字段中),以便我知道在表单发回服务器时要更新哪个用户。我的问题是,如何防止用户更改DOM中的ID,从而更新他们不应访问的记录?如何保护这个PHP表格

我能想到的唯一方法是:

  1. 保存在会话的用户ID。 (痛苦)。
  2. 在用户标识(也可能包含其他表单元素)上运行盐渍散列,并将其也作为隐藏的表单元素包含在其中。 (不是特别安全吗?)

还有其他方法吗?

谢谢!

编辑:嘿,一些伟大的响应进来。请注意,登录的用户和正在编辑的用户可能是两个不同的用户,例如,经理正在编辑员工记录。

+8

保存会话中的用户ID绝对是唯一的理智选择。为什么会很痛苦?这是不是你已经保存在会话中的信息? – 2011-03-04 13:41:07

+0

您的案例中的盐渍散列也相当安全。 – Ivan 2011-03-04 13:47:55

回答

3

要做到这一点,最好的方法是在提交后检查用户是否有权编辑该用户。

请勿使用此数据污染会话,因为它会变得混乱,例如,当用户多次打开同一页面时。

0

它在某种程度上取决于允许用户编辑它的条件。

在它的心脏,把它归结为:

  1. 验证用户
  2. 检查用户是否被授权进行改变

验证用户,通常的情况下, “请输入用户名和密码?”或“是否有与其关联的登录用户进行活动会话?”

授权取决于您的业务逻辑。它可能是“登录的用户是否与正在编辑的用户相同?”或“正在编辑的用户是否拥有包含登录用户的ID的管理员字段?”等等。

在第一种情况下,在会话中存储用户标识不应该很痛苦。在第二种情况下,您只需将数据库查找作为您在脚本中执行的第一件事情之一。

0

为什么你依靠隐藏的领域来知道哪些记录要更新?如果用户登录,您应该在会话中拥有他的user_id。 所以你可以通过查找哪个用户登录来找到更新哪个记录。

+0

这个问题的含义是允许一个用户编辑自己以外的用户(但不是所有用户) – Quentin 2011-03-04 13:50:31

+0

如果是这种情况,可以在隐藏字段中使用user_id,但是要在服务器上进行另一个安全检查以验证登录的用户有权编辑由表单提交的user_id – guru 2011-03-04 13:55:43

-1

如前所述,排序的最快速和无痛的方法是将USER_ID粘贴在会话期间。

评论说你用这些信息“污染”会话显然没有受过教育,忽略它们。

我在评论中注意到的另一件事是“检查用户是否有权修改条目”,这意味着存在某种分层系统,这似乎并非如此。

正如您所假设的那样,会话存储的替代方法可能会以某种方式混淆隐藏字段中的USER_ID值。你可以对它进行加密,或者不用整数ID--你可以使用GUID,但这会影响它自己,这使得人们很难“猜测”正确的GUID来处理记录。