Android 如何通过值防止循环中的sql注入
我试图在sqlite数据库的表中插入一个Android 如何通过值防止循环中的sql注入,android,sqlite,Android,Sqlite,我试图在sqlite数据库的表中插入一个Strings的ArrayList 我编写了一个循环,使用android.database.sqlite.SQLiteOpenHelper将Strings从ArrayList添加到sqlite数据库查询中 查询易受sql注入攻击,且不是最佳查询。我找到了这些链接 , . 我还没有发现在这样的循环中阻止sql注入的例子。为了演示起见,我将ArrayList的初始化放在示例中 ArrayList<String> descriptions = new
String
s的ArrayList
我编写了一个循环,使用android.database.sqlite.SQLiteOpenHelper
将String
s从ArrayList
添加到sqlite数据库查询中
查询易受sql注入攻击,且不是最佳查询。我找到了这些链接
, . 我还没有发现在这样的循环中阻止sql注入的例子。为了演示起见,我将ArrayList
的初始化放在示例中
ArrayList<String> descriptions = new ArrayList<>();
SQLiteDatabase db = this.getWritableDatabase();
String addBulkQuery = "INSERT INTO " + TABLE_DESCRIPTIONS + "(" + KEY_ID + ", " + KEY_DESCRIPTION + ") VALUES";
if (descriptions.size() > 0) {
addBulkQuery += "(" + id + ", " + descriptions.get(0) + ")";
for (int i = 1; i < descriptions.size(); i++) {
addBulkQuery += ", (" + id + ", " + descriptions.get(i) + ")";
}
}
ArrayList descriptions=new ArrayList();
SQLiteDatabase db=this.getWritableDatabase();
String addBulkQuery=“插入“+表描述+”(“+KEY\u ID+”,“+KEY\u描述+”)值”;
如果(descriptions.size()>0){
addBulkQuery+=“(“+id+”,“+descriptions.get(0)+”);
对于(inti=1;i
将
字符串的数组列表
或对象
s添加到sqlite数据库中最安全的解决方案是什么?尝试使用sqlite语句,如下所示:
ArrayList<String> descriptions = new ArrayList<>();
ArrayList<String> bindArgs = new ArrayList<>(descriptions.size() * 2);
String values = "";
if (descriptions.size() > 0) {
values += "(?,?)";
bindArgs.add(id);
bindArgs.add(descriptions.get(0));
for (int i = 1; i < descriptions.size(); i++) {
values += ",(?,?)";
bindArgs.add(id);
bindArgs.add(descriptions.get(i));
}
}
String addBulkQuery = String.format("INSERT INTO %s (%s, %s) VALUES %s", TABLE_DESCRIPTIONS, KEY_ID, KEY_DESCRIPTION, values);
SQLiteStatement statement = db.compileStatement(addBulkQuery);
statement.bindAllArgsAsStrings( bindArgs.toArray(new String[0]) );
statement.executeInsert();
然后,您需要将ArrayList展平为一个对象数组,其中散布着id
是什么 @GavinHarris我知道如果我插入一行,它会如何工作。这就是我文章中的两个超链接和你文章中的超链接所解释的。我不希望为插入的每一行执行单独的insert语句。我更愿意把我想插入的所有行放在VALUES
子句中。这个答案有用吗?实际上,您可以创建任何用户可以输入绑定参数的内容。您可以构造SQL以接受n
参数的数量,只需跟踪参数的数量并根据execSQL
()的文档在execSQL上传递正确的数量即可。您可以/t/不应该使用execSQL()
执行插入查询。你是指android.database.sqlite.SQLiteDatabase.execSQL()
还是其他API?你是对的,我回答得太快了。我将在AM中编辑答案。
INSERT INTO <tableName> (<key_id>, <key_description>)
VALUES (?, ?), (?, ?), ...