complileStatement如何帮助防止在android中注入SQL?

时间:2015-11-02 10:26:58

标签: android database sqlite android-sqlite sql-injection

在我的代码中,我必须使用单个插入查询插入多个值。对于 示例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如何帮助我的代码?

1 个答案:

答案 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注入的危险使用此代码时。