我正在开发一个具有多个数据库插入/更新查询的应用程序,并且在整个应用程序中我使用了
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]
它建议使用insert over execSQL。 但是如果有的话,哪个更容易出现SQLInjections。任何输入/建议。
答案 0 :(得分:1)
根据您关联的页面中的建议
“相反,我们鼓励你使用insert(String,String, ContentValues),update(String,ContentValues,String,String [])等 al,如果可能的话。“
你应该尽可能使用insert()
。
为避免SQL注入请求,您需要在两者之间进行清晰描述 SQL语句及其包含的数据。 ContentProvider的 query(),update()和delete()方法以及Activity的managedQuery() 方法全部支持参数化。这些方法都采取了 “String [] selectionArgs”参数,获取的一组值 替换为查询字符串代替“?”字符,在 命令出现问号。这提供了明确的分离 在“selection”参数中的SQL语句的内容之间 并包含数据。 [移动应用安全]
因此,像insert()
或update()
这样的delete()
方法应该是免费的。
您应始终使用Content Provider提供的参数化查询方法:
访问内容提供商时,请使用参数化查询方法 例如query(),update()和delete()以避免潜在的SQL 从不受信任的来源注入。注意使用参数化 如果选择参数是由构建的,则方法是不够的 在将用户数据提交给方法之前连接用户数据。
参考here