我正在尝试将port=[9010,9011]
ArrayList
插入sqlite数据库中的表。
我编写了一个循环,使用String
将String
中的ArrayList
添加到sqlite数据库查询中。
查询易受sql注入攻击,并不是最佳选择。我找到了这些链接
using PreparedStatement,using 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) + ")";
}
}
ArrayList
或String
添加到sqlite数据库的最安全的解决方案是什么?
答案 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
之内的对象数组!