dcsimg

保护您的Web应用程序免受不安全的直接对象引用-页面2

 By 保罗·鲁本斯
第2页,共2页  |  返回第1页

避免不安全的直接对象引用

避免不安全的直接对象引用漏洞的最佳方法是根本不公开私有对象引用,但是,如果使用了私有对象引用,那么在提供对它们的访问权限之前,必须确保已授权任何用户,这一点很重要。 OWASP www.owasp.org 建议建立一种引用应用程序对象的标准方法,如下所示:

  • 避免在任何可能的情况下向用户公开您的私有对象引用,例如主键或文件名
  • 使用“公认的良好”方法广泛验证任何私有对象引用。这意味着确定应允许用户访问哪些文件,并仅授予他们对这些文件的访问权限
  • 验证对所有引用对象的授权

OWASP还提供了第三点的说明,该示例来自代码示例,黑客可以在其中将电子商务购物车ID参数更改为任何值:

int cartID = Integer.parseInt(request.getParameter(“ cartID”));

字符串查询=“ SELECT * FROM table WHERE cartID =” + cartID;

通过仅允许显示授权记录可以防止此情况:

int cartID = Integer.parseInt(request.getParameter(“ cartID”));
User user = (User)request.getSession().getAttribute( "user" );
String query = "SELECT * FROM table WHERE 
   cartID=" + cartID + " AND userID=" + user.getID();

 

直接对象引用的替代方法(应尽可能使用)是按用户或会话使用间接对象引用。

在前面的示例中,要求用户从公开了对信用卡数据库的直接引用的两个选项中选择一个信用卡。更好的方法是获取两个信用卡记录,并将它们存储在特定于该用户的阵列中。信用卡选择框的编码如下:

    <select name=" choosecreditcard">
           <option value="1">
               XXXXXXXXXXXX6002
           </option>
           <option value="2">
               XXXXXXXXXXXX1516
           </option>
       </select>
    

这样,只有该用户的数组直接引用,仅包含该用户的数据。将选项值更改为大于2的值不会导致使用任何其他用户的信用卡详细信息。然后,应用程序会将用户特定的间接对象引用(选项值= 1或选项值= 2)映射回基础数据库密钥(在先前的示例中为35或67)。

测试不安全的直接对象引用

不幸的是,漏洞扫描程序在发现不安全的直接对象引用漏洞方面不是很有效,因此最好的选择是:

  • 代码审查以识别重要参数是否易受操纵
  • 渗透测试
本文最初于2011年3月8日发布
通过网络更新新闻获取最新消息