【问题标题】:Insecure Object Reference in java web applicationjava web应用程序中的不安全对象引用
【发布时间】:2016-06-29 11:40:39
【问题描述】:

我正在用 Java 创建一个 Web 应用程序。它处理在应用程序中建模的几个业务对象。每个对象在数据库中都有与之关联的表。我想显示特定对象的详细信息,例如。学生到用户。为此,我向服务器发出 ajax 请求并将 UserId 作为输入参数传递。伪代码如下所示:

1) Get StudentId from request.
2) Fetch Student details from db for given studentId
3) Send the student data as response to the user

我想要的是,不得使用 StudentId,而是可以使用随机数或其他任何东西,可以将其映射到服务器端的学生 ID,从而获取学生详细信息并将其发送到客户端。我想要这样,即使 studentId 被用户篡改/修改,作为查询字符串的一部分,用户也不会获得任何其他学生数据,因此会显示错误消息。

【问题讨论】:

标签: java security spring-security


【解决方案1】:

如果没有某种形式的身份验证,攻击者将能够简单地尝试不同的 StudentId 值,直到他们找到一个有效的值。通过重复此操作,他们将能够枚举不同的 StudentId 并检索所有学生数据。用户应该只能访问他们有权访问的记录。我强烈建议实施可靠的身份验证方法。

但是,如果您无法实现身份验证机制,则可以尝试使枚举过程更加困难。做到这一点的一种方法是随机分配 StudentId(为了避免German Tank Problem),并使它们尽可能长。像一个长的随机字符串这样的东西会成为一个很好的 ID。请注意,您拥有的用户越多,“保护”您的数据的效果就越差。此外,这种方法实际上并不能保护您的数据,它只会(理论上)使攻击者更难检索所有数据。如果他们猜对了 ID,他们仍然可以获得他们不应该得到的数据。

另外,由于你使用的是Java,所以可以使用PreparedStatements和参数绑定来避免SQL注入攻击。

【讨论】:

  • 请注意GUIDs are unique, not random。 UUID 也是如此 - 规范实际上并未说明它们必须由加密安全的伪随机数生成器生成。
【解决方案2】:

一次性解决方案是使用 owasp esapi 访问参考地图,你会喜欢的 :)

https://owasp-esapi-java.googlecode.com/svn/trunk_doc/latest/org/owasp/esapi/AccessReferenceMap.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-19
    • 2015-10-26
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    相关资源
    最近更新 更多