我正在尝试阻止我的触发器中的注入(创建与否取决于首选项)。
我正在使用
public void execSQL(String sql,Object [] bindArgs)
我的触发器有一个“?”并在bindArgs中传递我的值。
问题是我在创建触发器期间收到错误
03-13 13:43:49.136: E/SQLiteLog(21865): (1) trigger cannot use variables
03-13 13:43:49.137: W/System.err(21865): android.database.sqlite.SQLiteException: trigger cannot use variables (code 1): , while compiling:
CREATE TRIGGER IF NOT EXISTS
my_trigger
INSERT ON table_1 BEGIN DELETE
FROM table_2
WHERE col1 = new.col1
AND col2 = ?
END;
看起来我不能在创建触发器查询中使用参数但我不明白为什么。如果我更换“?”我自己在String中使用了一个值并使用
public void execSQL(String sql)
这项工作很好,但我想创建一个带有String值的触发器,我不想检查SQLInjection。
任何人解释为什么我不能使用
public void execSQL(String sql,Object [] bindArgs)
触发器(即使android documentation另有说明)
例如,以下是使用此方法的理想选择:
CREATE或DROP table / trigger / view / index / virtual table
...
答案 0 :(得分:1)
错误消息非常明确:
触发器不能使用变量
即。你不能在触发器中使用?
变量。
只使用没有变量的字符串格式。由于参数是一个整数,因此无需对其进行消毒以进行注射,假设您将其作为整数传递。
对于字符串,有DatabaseUtils.sqlEscapeStrings()
。
"以下是使用此方法的理想选择:CREATE或DROP触发器"
这实际上意味着execSQL()
重载中的任何一个应该像这样用于SQL,并且在Android SQLite包装器中没有更好的替代方案。这并不意味着变量绑定特别适合与这种SQL一起使用。
Android sqlite的文档不是很好。
是不是Android会"取代" '?向SQLite发送正确的查询?
不,the ?
parameters绑定在sqlite中。