【问题标题】:How to validate postback data in web applications如何在 Web 应用程序中验证回发数据
【发布时间】:2012-07-04 13:37:00
【问题描述】:

考虑一个假设的银行应用程序,其中我们有帐户和一些管理员组。每个管理员都对某些帐户具有修改权限。要保存对帐户所做的修改,应用程序会在编辑页面上发送帐户 ID。管理员可以使用 fiddler 等工具更改发布请求。如果他/她将帐户 ID 更改为他/她未授权的某个帐户 ID。那么检测它的最佳方法是什么。

我应该使用什么策略来重新验证每条数据以在回发时获得授权?我更关心的是设计,而不是代码。

换句话说,现实世界的应用程序如何确保即使用户从任何工具更改回发请求,应用程序也能够检测到它。

【问题讨论】:

    标签: asp.net security authentication web-applications authorization


    【解决方案1】:

    我是否应该在回发时重新验证每条数据以进行授权?

    是的,没错。您应该从“所有输入都是邪恶的”理念开始,然后通过验证每个数据点来证明该陈述不正确。如果您的整个数据没有通过您的验证,那么您的输入确实是邪恶的。

    智能网络应用程序同时使用客户端和服务器端验证。客户端验证可快速提醒用户有什么问题/缺失,而无需进行服务器往返和服务器端验证,以确保即使有人“摆弄”客户端验证代码,错误数据也不会漏掉(并覆盖它)。

    不幸的是,在客户端加密数据将不起作用,因为您在客户端(在 JS 代码中)也有密钥。这不会阻止恶意用户加密恶意负载。对于恶意攻击者来说,隐藏字段等混淆也是低效的。仅供参考,您甚至不需要 fiddler 更改字段/发布参数等 - 您只需要 firebug extension

    口头禅是“验证服务器端的每一件事”。期间。

    【讨论】:

    • 感谢您的回复,我了解客户端和服务器端数据验证的重要性。当您验证网页上的数据时,这非常快,但通常授权规则在数据库中,如果我必须重新验证授权,我必须在回发时再次点击 db。我之前问错了,我的问题是我应该如何重新验证每条数据。例如,我可以创建一个即时发送 guid 而不是实际帐户 ID 的 guid,并在会话中存储映射。如果用户修改 guid,则在回发时,我不会得到实际的帐户 ID。应用是安全的。
    • 如果您确实可以确定 guid 没有被篡改,并且如果 guid 是您想要防止篡改的唯一内容,则可以这样做。对 GUID 进行 HMAC 处理是可以保证这一点的一种方式。但是,我仍然不确定您要对每个请求授权什么。成功登录框架后,将为您进行会话管理。有一些会话变量在她登录后立即存储用户的授权/访问级别。在每次请求时,只需确保使用内存中的会话变量验证授权/访问。
    【解决方案2】:

    对于银行等关键应用程序,我建议遵循安全步骤

    1) 发送加密账户 ID 2)将该帐户ID保存在隐藏字段中,并且当用户发布数据时从隐藏字段中获取帐户ID,而不是形成文本框或标签。 3) 在回发时重新验证每条数据以进行授权。

    【讨论】:

      猜你喜欢
      • 2014-01-15
      • 2011-12-16
      • 2011-09-09
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 2018-10-18
      • 2021-03-21
      • 1970-01-01
      相关资源
      最近更新 更多