android developer tiny share-20170306

来源:互联网 发布:中国的农作物产量知乎 编辑:程序博客网 时间:2024/05/16 14:10

今天继续讲android的Content Provider,讲SQL注入,以及如何防止SQL注入,防止的方法是使用? 作为可替换参数的选择子句和一个选择参数数组。

以下是android developer官网的讲解:


防止恶意输入


如果内容提供程序管理的数据位于 SQL 数据库中,将不受信任的外部数据包括在原始 SQL 语句中可能会导致 SQL 注入。

考虑此选择子句:

// Constructs a selection clause by concatenating the user's input to the column nameString mSelectionClause =  "var = " + mUserInput;

如果您执行此操作,则会允许用户将恶意 SQL 串连到 SQL 语句上。 例如,用户可以为 mUserInput 输入“nothing; DROP TABLE *;”,这会生成选择子句 var = nothing; DROP TABLE *;。 由于选择子句是作为 SQL 语句处理,因此这可能会导致提供程序擦除基础 SQLite 数据库中的所有表(除非提供程序设置为可捕获 SQL 注入尝试)。

要避免此问题,可使用一个用于将 ? 作为可替换参数的选择子句以及一个单独的选择参数数组。 执行此操作时,用户输入直接受查询约束,而不解释为 SQL 语句的一部分。 由于用户输入未作为 SQL 处理,因此无法注入恶意 SQL。请使用此选择子句,而不要使用串连来包括用户输入:

// Constructs a selection clause with a replaceable parameterString mSelectionClause =  "var = ?";

按如下所示设置选择参数数组:

// Defines an array to contain the selection argumentsString[] selectionArgs = {""};

按如下所示将值置于选择参数数组中:

// Sets the selection argument to the user's inputselectionArgs[0] = mUserInput;

一个用于将 ? 用作可替换参数的选择子句和一个选择参数数组是指定选择的首选方式,即使提供程序并未基于 SQL 数据库。

0 0
原创粉丝点击