2015-03-13 107 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