gpt4 book ai didi

android - 在 Android 中使用准备好的语句进行查询?

转载 作者:IT王子 更新时间:2023-10-29 06:18:36 26 4
gpt4 key购买 nike

在 Android 中,android.database.sqlite.SQLiteStatement 允许我在 SQLite 中使用准备好的语句来避免注入(inject)攻击。它的execute方法适用于create/update/delete操作,但是好像没有返回游标之类的查询方法。

现在在 iOS 中,我可以创建类型为 sqlite3_stmt* 的准备好的语句,并将它们用于查询,所以我知道这不是 SQLite 的限制。如何在 Android 中使用准备好的语句执行查询?

最佳答案

准备好的语句允许你做两件事

  • 加快性能,因为数据库不需要每次都解析语句
  • 在语句中绑定(bind)和转义参数,这样您就可以免受注入(inject)攻击

我不确切知道 Android 的 SQLite 实现在何处/何时实际使用 sqlite3_prepare(不是 sqlite3_prepare_v2 - 参见 here)但它确实使用它,否则你可以没有得到 Reached MAX size for compiled-sql statement cache errors .

因此,如果你想查询数据库,你必须依赖于实现,我不知道如何使用 SQLiteStatement 来实现。

关于注入(inject)安全性,每个数据库查询、插入等方法都有(有时是替代的)版本允许您绑定(bind)参数。

例如如果你想从

中得到一个 Cursor
SELECT * FROM table WHERE column1='value1' OR column2='value2'

游标 SQLiteDatabase#rawQuery(

  • String sql, : 完整的 SELECT 语句,可以在任何地方包含 ?
  • String[] selectionArgs :替换 ? 的值列表,按它们出现的顺序

)

Cursor c1 = db.rawQuery(
"SELECT * FROM table WHERE column1=? OR column2=?",
new String[] {"value1", "value2"}
);

游标 SQLiteDatabase#query (

  • String table, : 表名,可以包含JOIN
  • String[] columns, : 所需列的列表,null = *
  • String selection, : WHERE 子句没有 WHERE 可以/应该包含 ?
  • String[] selectionArgs, : 替换 ? 的值列表,按它们出现的顺序
  • String groupBy, : GROUP BY 子句 w/o GROUP BY
  • String having, : HAVING 子句 w/o HAVING
  • String orderBy : ORDER BY 子句 w/o ORDER BY

)

Cursor c2 = db.query("table", null, 
"column1=? OR column2=?",
new String[] {"value1", "value2"},
null, null, null);

通过 ContentProviders - 这种情况略有不同,因为您与抽象提供者交互,而不是数据库。实际上不能保证有支持 ContentProvider 的 sqlite 数据库。因此,除非您知道有哪些列/提供商在内部如何工作,否则您应该坚持文档所说的内容。

游标 ContentResolver#query(

  • Uri uri, : 代表数据源的URI(内部翻译成表格)
  • String[] projection, : 所需列的列表,null = *
  • String selection, : WHERE 子句没有 WHERE 可以/应该包含 ?
  • String[] selectionArgs, : 替换 ? 的值列表,按它们出现的顺序
  • String sortOrder : ORDER BY 子句 w/o ORDER BY

)

Cursor c3 = getContentResolver().query(
Uri.parse("content://provider/table"), null,
"column=? OR column2=?",
new String[] {"value1", "value2"},
null);

提示:如果你想在此处LIMIT,你可以将其添加到ORDER BY子句中:

String sortOrder = "somecolumn LIMIT 5";

或根据 ContentProvider 的实现,将其作为参数添加到 Uri:

Uri.parse("content://provider/table?limit=5");
// or better via buildUpon()
Uri audio = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
audio.buildUpon().appendQueryParameter("limit", "5");

在所有情况下,? 都将替换为您在绑定(bind)参数中输入的内容的转义版本。

? + "hack'me" = 'hack''me'

关于android - 在 Android 中使用准备好的语句进行查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9857073/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com