SQLiteDatabase#rawQuery 是否转义了 selectionArgs(安全吗)?
Does SQLiteDatabase#rawQuery escape the selectionArgs (is it safe)?
查看 rawQuery(sql, selectionArgs) 文档,我没有看到任何关于 selectionArgs
转义的明确声明。
所以我应该提前清理 selectionArgs
,还是假设 rawQuery 将以安全的方式使用任何 selectionArgs
值,避免 SQL 注入是否安全?
我对 Android API 14+ 实现感兴趣,我不关心旧 1.x 和 2.x ROM 中的任何安全漏洞。
(我不是在谈论第一个 String sql
参数,它看起来显然很脆弱,但我希望 args 被清除,但 developer.android.com 上没有关于它的文档)
选择参数使用 sqlite 的 variable binding,它们从来不是 SQL 本身的一部分。无需消毒。
这里的Android documentation实际上是误导:
You may include ?
s in where clause in the query, which will be replaced by the values from selectionArgs
. The values will be bound as Strings.
第一句话表示发生了某种字符串替换,而实际上并没有进行字符串替换。后一句指的是正确的(变量)绑定,例如SQLiteProgram
及其在 SQLiteDatabase
和 sqlite C API 之间的 bindAllArgsAsStrings()
。
查看 rawQuery(sql, selectionArgs) 文档,我没有看到任何关于 selectionArgs
转义的明确声明。
所以我应该提前清理 selectionArgs
,还是假设 rawQuery 将以安全的方式使用任何 selectionArgs
值,避免 SQL 注入是否安全?
我对 Android API 14+ 实现感兴趣,我不关心旧 1.x 和 2.x ROM 中的任何安全漏洞。
(我不是在谈论第一个 String sql
参数,它看起来显然很脆弱,但我希望 args 被清除,但 developer.android.com 上没有关于它的文档)
选择参数使用 sqlite 的 variable binding,它们从来不是 SQL 本身的一部分。无需消毒。
这里的Android documentation实际上是误导:
You may include
?
s in where clause in the query, which will be replaced by the values fromselectionArgs
. The values will be bound as Strings.
第一句话表示发生了某种字符串替换,而实际上并没有进行字符串替换。后一句指的是正确的(变量)绑定,例如SQLiteProgram
及其在 SQLiteDatabase
和 sqlite C API 之间的 bindAllArgsAsStrings()
。