0

我正在开发一个具有多个数据库插入/更新查询的应用程序,并且在我使用过的整个应用程序中

SQLiteDatabase.insert(String table, String nullColumnHack, ContentValues values)

将任何数据插入任何表的方法。我的意思是我创建了一个 ContentValues 对象并将我的所有值作为键/值对放在这个对象中,并将它传递给这个这个方法。

contentValues.put("col1", valueCol1);
contentValues.put("col2", valueCol2);
contentValues.put("col3", valueCol3);

所以只是想检查这种向sqlite表插入记录的方式是否更好,或者使用executeSQL更好[从SQLinjection的角度来看]。我确实按照这里的文档理解

[http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#execSQL(java.lang.String)][1]

它建议在 execSQL 上使用插入。但是,如果有的话,哪个更容易发生 SQLInjections。任何输入/建议。

4

1 回答 1

1

正如您链接的页面中所建议的那样

“相反,我们鼓励您尽可能使用 insert(String, String, ContentValues)、update(String, ContentValues, String, String[]) 等。”

你应该insert()尽可能使用。

为了避免 SQL 注入请求,您需要清楚地划分 SQL 语句和它包含的数据。ContentProvider 的 query()、update()、delete() 方法和 Activity 的 managedQuery() 方法都支持参数化。这些方法都采用“String[] selectionArgs”参数,一组值被替换到查询字符串中以代替“?” 字符,按问号出现的顺序。这在“选择”参数中的 SQL 语句的内容和包含的数据之间提供了清晰的分离。[移动应用安全]

因此,insert()类似update()delete()应该是无 sql 注入的方法。

您应该始终使用 Content Provider 支持的参数化查询方法:

访问内容提供者时,请使用参数化查询方法,例如 query()、update() 和 delete(),以避免来自不受信任来源的潜在 SQL 注入。请注意,如果选择参数是通过在将用户数据提交给方法之前连接用户数据来构建的,则使用参数化方法是不够的。

参考这里

于 2013-08-09T08:10:05.537 回答