如何通过VALUES阻止循环中的sql注入

时间:2017-02-20 00:28:53

标签: android sqlite

我正在尝试将port=[9010,9011] ArrayList插入sqlite数据库中的表。

我编写了一个循环,使用StringString中的ArrayList添加到sqlite数据库查询中。

查询易受sql注入攻击,并不是最佳选择。我找到了这些链接 using PreparedStatementusing SQLiteStatement。我还没有找到在这样的循环中阻止sql注入的例子。为了演示,我在示例中放置了android.database.sqlite.SQLiteOpenHelper的初始化。

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) + ")"; } } ArrayListString添加到sqlite数据库的最安全的解决方案是什么?

1 个答案:

答案 0 :(得分:1)

尝试使用SQLiteStatement,如下所示:

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();

我假设id是一个字符串,因此我可以使用statement.bindAllArgsAsStrings方法将变量绑定到语句。 (对不起,我还重写了你的字符串以使用String.format,我觉得它更容易阅读,你可以忽略,如果你喜欢)

老人回答:

看看使用Bind Variables。重写您的SQL,以便在您接受用户输入的任何地方,输入&#34;?&#34;然后使用db.execSQL(sqlString, Arguments);

所以你希望SQL看起来像(在你执行之前):

INSERT INTO <tableName> (<key_id>, <key_description>)
VALUES (?, ?), (?, ?), ...

然后,您需要将ArrayList展平为一个散布在id之内的对象数组!