Android 如何通过值防止循环中的sql注入

Android 如何通过值防止循环中的sql注入,android,sqlite,Android,Sqlite,我试图在sqlite数据库的表中插入一个Strings的ArrayList 我编写了一个循环,使用android.database.sqlite.SQLiteOpenHelper将Strings从ArrayList添加到sqlite数据库查询中 查询易受sql注入攻击,且不是最佳查询。我找到了这些链接 , . 我还没有发现在这样的循环中阻止sql注入的例子。为了演示起见,我将ArrayList的初始化放在示例中 ArrayList<String> descriptions = new

我试图在sqlite数据库的表中插入一个
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 (?, ?), (?, ?), ...