在我的代码中,我必须使用单个插入查询插入多个值。对于
示例INSERT INTO table_name (column_1, column_2) VALUES (value1, val1),(value2,value)
。
为防止SQL注入,我找到了以下示例。
SQLiteDatabase db = dbHelper.getWritableDatabase();
SQLiteStatement stmt = db.compileStatement(“SELECT * FROM Country WHERE code = ?”);
stmt.bindString(1, “India”);
stmt.execute();
但是compileStatement
如何帮助我的代码?
答案 0 :(得分:1)
sql-injection的危险在于表示数据的字符串被解释为SQL代码。如果字符串是用户定义的,那么用户(或程序外部的其他人)可以以不可预测的方式更改数据库。
方法compileStatement
接收一个只包含sql代码的字符串,或者至少不包含在运行时更改的任何变量。
防止sql注入的真正帮助在bindString
,因为它需要用户定义的字符串,因此它确保转义其中的任何特殊字符,因此字符串的任何部分都不会被解释为SQL代码
例如,如果字符串是单独使用的话,使用"Indina\"; DROP TABLE some_important_table"
可能会删除some_important_table
,因为\";
结束了正在执行的当前语句。但是,在bindString
中使用时,\"
被视为文字"
,语句只会查找代码为Indina"; DROP TABLE some_important_table
的国家/地区。
当然,在您的示例中,您使用的是常量字符串,因此它不会产生太大的影响,但这是一种很好的做法,并确保未来的更改不会引入sql注入的危险使用此代码时。