数据库访问水平越权(横向越权)和垂直权限(纵向越权)有啥好的方法?

"与其靠表示层来限制用户输入的值,还不如在应用程序和数据库层上进行 access control。任何情况下都不允许用户在没有取得相应权限的情况下获取或修改数据库中的记录。每个涉及数据库的查询都必须遵守这个原则,这可以通过把当前被授权的用户名作为查询语句的一部分来实现。

<IfNotDef var=""ConditionalDescriptions"">
示例 3:
以下代码实现的功能与Example 1 相同,但是附加了一个限制,以验证清单是否属于当前经过身份验证的用户。

...
userName = ctx.getAuthenticatedUserName();
id = Integer.decode(request.getParameter(""invoiceID""));
String query =

    ""SELECT * FROM invoices WHERE id = ? AND user = ?"";

PreparedStatement stmt = conn.prepareStatement(query);
stmt.setInt(1, id);
stmt.setString(2, userName);
ResultSet results = stmt.execute();
...

</IfNotDef>
<IfDef var=""ConditionalDescriptions""></IfDef>

下面是 Android 的等同内容:

...

    PasswordAuthentication pa = authenticator.getPasswordAuthentication();

String userName = pa.getUserName();

String id = this.getIntent().getExtras().getString(""invoiceID"");

String query = ""SELECT * FROM invoices WHERE id = ? AND user = ?"";

SQLiteDatabase db = this.openOrCreateDatabase(""DB"", MODE_PRIVATE, null);

Cursor c = db.rawQuery(query, new Object[]{id, userName});

...

"

----------------------
"

Database access control 错误在以下情况下发生:

  1. 数据从一个不可信赖的数据源进入程序。
  2. 这个数据用来指定 SQL 查询中主键的值。

<IfNotDef var=""ConditionalDescriptions"">
示例 1:
以下代码使用可转义元字符并防止出现 SQL 注入漏洞的参数化语句,以构建和执行用于搜索与指定标识符 [1] 相匹配的清单的 SQL 查询。您可以从与当前被授权用户有关的所有清单中选择这些标识符。

...
id = Integer.decode(request.getParameter(""invoiceID""));
String query = ""SELECT * FROM invoices WHERE id = ?"";
PreparedStatement stmt = conn.prepareStatement(query);
stmt.setInt(1, id);
ResultSet results = stmt.execute();
...

</IfNotDef>
<IfDef var=""ConditionalDescriptions""></IfDef>

问题在于开发者没有考虑到所有可能出现的 id 值。虽然界面生成了属于当前用户的清单标识符列表,但是攻击者可以绕过这个界面,从而获取所需的任何清单。由于此示例中的代码没有执行检查以确保用户具有访问所请求清单的权限,因此它会显示任何清单,即使此清单不属于当前用户。

有些人认为在移动世界中,典型的 Web 应用程序漏洞(如 Database access control 错误)是无意义的 -- 为什么用户要攻击自己?但是,谨记移动平台的本质是从各种来源下载并在相同设备上运行的应用程序。恶意软件在银行应用程序附近运行的可能性很高,它们会强制扩展移动应用程序的攻击面(包括跨进程通信)。

<IfDef var=""ConditionalDescriptions""></IfDef>
<IfNotDef var=""ConditionalDescriptions"">
示例 2:
以下代码会调整Example 1 以适应 Android 平台。

...

    String id = this.getIntent().getExtras().getString(""invoiceID"");

String query = ""SELECT * FROM invoices WHERE id = ?"";

SQLiteDatabase db = this.openOrCreateDatabase(""DB"", MODE_PRIVATE, null);

Cursor c = db.rawQuery(query, new Object[]{id});

...

许多现代 Web 框架都会提供对用户输入执行验证的机制(包括 Struts 和 Spring MVC)。为了突出显示未经验证的输入源,Fortify 安全编码规则包会对 Fortify Static Code Analyzer(Fortify 静态代码分析器)报告的问题动态重新调整优先级,即在采用框架验证机制时降低这些问题被利用的几率并提供指向相应证据的指针。我们将这种功能称之为上下文敏感排序。为了进一步帮助 Fortify 用户执行审计过程,Fortify 软件安全研究团队开发了 Data Validation(数据验证)项目模板,该模板根据应用于输入源的验证机制按文件夹对问题进行了分组。
</IfNotDef>
"

以上是 数据库访问水平越权(横向越权)和垂直权限(纵向越权)有啥好的方法? 的全部内容, 来源链接: utcz.com/p/944459.html

回到顶部