使用SQLite触发器和参数

时间:2015-03-13 12:52:24

标签: android sqlite

我正在尝试阻止我的触发器中的注入(创建与否取决于首选项)。

我正在使用

  

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

  •   
  • ...

  •   

1 个答案:

答案 0 :(得分:1)

错误消息非常明确:

  

触发器不能使用变量

即。你不能在触发器中使用?变量。

只使用没有变量的字符串格式。由于参数是一个整数,因此无需对其进行消毒以进行注射,假设您将其作为整数传递。

对于字符串,有DatabaseUtils.sqlEscapeStrings()


  

"以下是使用此方法的理想选择:CREATE或DROP触发器"

这实际上意味着execSQL()重载中的任何一个应该像这样用于SQL,并且在Android SQLite包装器中没有更好的替代方案。这并不意味着变量绑定特别适合与这种SQL一起使用。

Android sqlite的文档不是很好。

  

是不是Android会"取代" '?向SQLite发送正确的查询?

不,the ? parameters绑定在sqlite中。