2015-03-13 106 views
1

我试图阻止注入在我的触发器(创建或不依赖于首选项)。使用SQLite触发器与参数

我使用

公共无效execSQL(SQL字符串,对象[] 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; 

它看起来像我不能使用参数以创建触发器查询,但我不明白为什么的过程中收到错误。如果我替换“?”我在字符串的值,并使用

公共无效execSQL(SQL字符串)

这项工作得很好,但我想创建一个字符串值,触发了我不想检查SQLInjection。

任何人解释为什么我不能使用

公共无效execSQL(SQL字符串,对象[] bindArgs)

的触发(即使android documentation说,否则)

例如,以下是使用此方法的好候选者:

  • 创建或删除表/触发/视图/索引/虚拟表

  • ...

回答

1

错误消息是十分明了:

触发器不能使用变量

i .e。您不能在触发器中使用?变量。

只需使用不带变量的字符串格式。由于参数是一个整数,因此不需要为注入进行清理,假设您将它作为整数传递。

对于字符串有DatabaseUtils.sqlEscapeStrings()


“以下是较好的选择使用此方法:创建或删除触发”

这确实意味着,execSQL()重载的一方应该用于像SQL,和Android SQLite包装中没有更好的选择。这并不意味着变量绑定特别适合用于这种SQL。

Android sqlite的文档不是很好。

是不是Android“替换”?以向SQLite发送正确的查询?

不,the ? parameters绑定在sqlite中。

+0

那么,我只是要创建一个很好的方法来防止注射,我会很好。再次感谢! – AxelH 2015-03-13 13:30:56