我正在用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被用户修改/修改,作为查询字符串的一部分,用户也不会获得任何其他学生数据,因此会显示错误消息。
答案 0 :(得分:1)
如果没有某种形式的身份验证,攻击者可以简单地为StudentId尝试不同的值,直到找到有效的值。通过重复这一点,他们将能够枚举不同的StudentIds并检索所有学生数据。用户应该只能访问他们有权访问的记录。我强烈建议实施一种可靠的身份验证方法。
但是,如果无法实现身份验证机制,则可以尝试使枚举过程更加困难。一种方法是随机分配StudentIds(避免German Tank Problem),并在实际可行的情况下制作它们。类似长而随机的字符串会成为一个优秀的ID。请注意,您拥有的用户越多,保护""保护"你的数据。此外,这种方法实际上并不保护您的数据,它只会使(理论上)攻击者更难以检索所有数据。如果他们猜对了正确的ID,他们仍然可以得到他们不应该的数据。
此外,由于您使用的是Java,因此可以使用PreparedStatements和参数绑定来避免SQL注入攻击。
答案 1 :(得分:1)
一次性解决方案是使用owasp esapi访问参考地图,你会喜欢它:)
https://owasp-esapi-java.googlecode.com/svn/trunk_doc/latest/org/owasp/esapi/AccessReferenceMap.html