我試圖內的Android做下面的SQL查詢:IN子句和佔位符
String names = "'name1', 'name2"; // in the code this is dynamically generated
String query = "SELECT * FROM table WHERE name IN (?)";
Cursor cursor = mDb.rawQuery(query, new String[]{names});
然而,Android不正確的值替換問號。我可以做到以下幾點,但是,這並不能防止SQL注入:
String query = "SELECT * FROM table WHERE name IN (" + names + ")";
Cursor cursor = mDb.rawQuery(query, null);
我怎樣才能解決這個問題,可以使用IN子句?
是的,這是在SQLite和幾乎任何其他SQL數據庫中使用參數化IN()查詢的唯一方法。 –
使用這種方法,我增加了我使用的ContentProvider,並在query()方法中添加了邏輯來測試存在:「IN?」如果找到了,則計算「?」的出現次數在原始選擇中,與傳遞的參數的長度相比,組裝「?,?,...?」爲了區別並取代原來的「IN?」與生成的問號集合。這使得邏輯幾乎可以用於全球,對我的使用來說,它似乎運行良好。我不得不添加一些特殊的配置來過濾空的IN列表,在這些情況下,「IN?」現在替換爲「1」。 – SandWyrm
當然,這個愚蠢的事情是,如果你打算用N個問號來創建你自己的字符串,那麼你可能直接對數據進行編碼。假設它已經過消毒。 – Christopher