【问题标题】:Enforcing / Securing POST parameters强制/保护 POST 参数
【发布时间】:2014-08-17 13:07:41
【问题描述】:

我的标题可能含糊不清,请在下面查看我的情况。

我有一个 Web 应用程序来管理员工列表。该应用程序以轮辐模式设置,从员工列表中单击员工会重定向到一个新窗口,该窗口显示所选员工的个人详细信息以进行可能的更新。

应用程序使用 HTTPS。员工列表和详细信息通过 GET 检索,而详细信息通过 POST 更新。该应用程序使用 HTTPS,所有用户(我们只有少数人)都有权检索和更新员工详细信息。

我的问题是,在更新/发布操作期间是否仍需要或建议检查员工 ID(主键)?一个老练的用户理论上可以在 POST 之前更改员工 ID 并更新另一个员工的详细信息,即使不提取第二个员工的记录。尽管如此,即使该用户以某种方式欺骗了界面,他的任何“黑客行为”都是可以接受的,因为用户无论如何都可以检索和更新任何员工。

所以在我的情况下,您是否仍然认为有必要强制执行一种机制,以便只有当前显示的记录是可更新的?如果是,那么实施这一点的公认做法是什么?谢谢

【问题讨论】:

    标签: security post


    【解决方案1】:

    许多基于 Web 的系统都设计为无状态的。主要原因是允许多个会话/窗口。

    您可以将当前编辑的员工 ID 存储在会话变量中,并且只允许更改该员工 ID,但是,如果用户在同一会话中打开了两个浏览器窗口怎么办?现在,您必须为每个窗口保留当前编辑的员工 ID。好吧,您没有这些信息,因此您必须将员工 ID 存储在表单本身中,而这一切都可以由客户编辑。

    因此,只需在服务器上强制执行规则,如果他们有权编辑该员工,就让他们。

    确保您的系统使用 HTTPS 来防止中间人攻击,转义所有输出以防止跨站点脚本 (XSS),并要求 POST 进行所有更新以及使用会话和表单令牌来防止跨站点请求伪造(CSRF)。完成此操作后,任何员工 ID 操作都可能是自己造成的,而您的工作不是保护用户免受自己的伤害。

    【讨论】:

    • 谢谢马库斯!您已经清楚地描述了我没有考虑过的多个会话的场景。我将听从您的建议,并专注于我们可以控制的服务器端安全性。感谢其他关于加强浏览器安全的建议,尤其是 CSRF,这对我来说也是新的。
    【解决方案2】:

    您通常做的是 - 单击一行,获取员工 ID 并将其发送到服务器,按 ID 检索信息并将其发布给用户。通常您将 ID 保留为某种隐藏值,因此当您更新时,您会更新 ID。而且,通常情况下,您不允许更改 ID。 IMO不需要检查ID,但是如果您认为有人可以跳过,只需检查页面的ID是否与您在隐藏值中的ID相同。

    【讨论】:

    • 感谢您的输入 Thrash Bean。你很好地隐藏了身份证。但是,即使 ID 被隐藏,它仍然可以在 POST 之前更改,服务器会认为它是有效的 POST。因此实现(例如用户界面)失败但业务规则得到满足(即任何用户都可以更新任何记录)。我希望有人可以提供一种情况,即保护/强制 ID 是必须的,或者根本不需要,因为用户操作是无法控制和不可预测的。
    • 如何更改ID?编辑页面的来源?所以黑客。偏执 - 在将数据发送回浏览器之前散列 ID 并在再次发布散列 ID 并检查有效性。如果不等于 - 不保存修改的记录。当然,这有点愚蠢。并且不需要“重新散列”发布,我不认为有人会更改散列数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    相关资源
    最近更新 更多