如何保护这个PHP表单

如何保护这个PHP表单,php,Php,我有一个用于编辑用户的表单。用户ID被传递给客户机(在一个隐藏字段中),这样我就知道在表单发回服务器时更新哪个用户。我的问题是,如何防止用户更改DOM中的ID,从而更新他们不应该访问的记录 我能想到的唯一办法是: 在会话中保存用户ID。(痛苦的) 在用户ID(可能还有其他表单元素)上运行salted散列,并将其作为隐藏表单元素包含。(不是特别安全?) 还有其他方法吗 谢谢 编辑:嘿,有一些很棒的回应。请注意,登录用户和正在编辑的用户可能是两个不同的用户,例如,经理正在编辑员工记录。这在某种程度上

我有一个用于编辑用户的表单。用户ID被传递给客户机(在一个隐藏字段中),这样我就知道在表单发回服务器时更新哪个用户。我的问题是,如何防止用户更改DOM中的ID,从而更新他们不应该访问的记录

我能想到的唯一办法是:

  • 在会话中保存用户ID。(痛苦的)
  • 在用户ID(可能还有其他表单元素)上运行salted散列,并将其作为隐藏表单元素包含。(不是特别安全?)
  • 还有其他方法吗

    谢谢


    编辑:嘿,有一些很棒的回应。请注意,登录用户和正在编辑的用户可能是两个不同的用户,例如,经理正在编辑员工记录。

    这在某种程度上取决于允许用户编辑记录的条件

    其核心是:

  • 对用户进行身份验证
  • 检查用户是否有权进行更改
  • 验证用户通常是“用户名和密码匹配吗?”或“是否存在与登录用户关联的活动会话?”

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


    在第一种情况下,在会话中存储用户id应该不会很痛苦。在第二种情况下,您只需在脚本中首先执行数据库查找。

    最好的方法是在提交后检查用户是否有权编辑该用户


    不要用这些数据污染会话,因为它可能会变得混乱,例如当用户多次打开同一页时。

    为什么要依赖隐藏字段来知道要更新哪个记录?如果用户已登录,您应该已经在会话中拥有了他的用户id。
    因此,您可以通过查找登录的用户来查找要更新的记录。

    如前所述,对其进行排序的最快、最简单的方法是在会话期间粘贴用户ID

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

    我在评论中注意到的另一件事是“检查用户是否有权编辑条目”,这意味着存在某种等级制度,这似乎不是真的


    正如您已经假设的那样,会话存储的替代方法是以某种方式混淆隐藏字段中的用户ID值。您可以对其进行加密,也可以不使用整数ID—您可以使用GUID,但这有其自身的含义,尽管这会让人很难“猜测”正确的GUID来混淆记录。

    在会话中保存用户ID绝对是唯一明智的选择。为什么会很痛苦?这不是您已经在会话中保存的信息吗?在您的情况下,Salted hash也是非常安全的。问题的含义是允许一个用户编辑其他用户,而不是他们自己(但不是所有用户),如果是这种情况,则在隐藏字段中有用户id是可以的,但是,请在服务器上执行另一次安全检查,以验证登录用户是否具有编辑表单提交的用户id的权限