Android: как я могу заменить SQLite execSQL (), чтобы избежать атаки инъекций? - PullRequest
0 голосов
/ 19 ноября 2018

У меня в методе MainActivity resetSortIndexes есть метод, который выполняет save () в классе модели, который выполняет метод execSQL () базы данных SQLite. Теперь я прочитал, что я не должен использовать execSQL (), чтобы избежать атак SQL-инъекций, и что я не должен использовать rawQuery () для любой операции INSERT. Так я должен использовать ContentValues ​​() и insert ()?

MainActivity.java
...
public static void resetSortIndexes() {

    int index = allList.size();
    for (ListItem s : allList) {
        s.setSortorder(index);
        s.save(sqLiteDB); 
        index--;
    }
}   

ListItem.java
...
public void save(SQLiteDB helper){

    String sql = "INSERT OR REPLACE INTO " + TABLE_NAME + "(_id,type,typecolor,todo,note1,note2," +
            "duedatentime,timestamp,notiftime,notiftime2,randint,sortorder,listone,listtwo," +
            "listthree,listfour,listfive,listsix,listseven,listeight,listnine,listten,listeleven," +
            "listtwelve,listthirteen,listfourteen,listfifteen,listsixteen,listseventeen," +
            "listeighteen,listnineteen,listtwenty) VALUES" +
            "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
    // The object parameters from the ListItem class.
    Object[] params = new Object[]{_id,_type,_typecolor,_todo,_note1,_note2,_duedatentime,
            _timestamp,_notiftime,_notiftime2,_randint,_sortorder,_listone,_listtwo,
            _listthree,_listfour,_listfive,_listsix,_listseven,_listeight,_listnine,
            _listten,_listeleven,_listtwelve,_listthirteen,_listfourteen,_listfifteen,
            _listsixteen,_listseventeen,_listeighteen,_listnineteen,_listtwenty};
    // A method in the SQLiteDB class.
    helper.executeQuery(sql,params);
}

SQLiteDB.java
...
public void executeQuery(String sql, Object[] params) {

    SQLiteDatabase db = getReadableDatabase();

    db.beginTransaction();
    try {
        **db.execSQL(sql, params);**

    db.setTransactionSuccessful();
    } finally {
        db.endTransaction();
    }
    if(db.isOpen()) {
        db.close();
    }
} 

1 Ответ

0 голосов
/ 19 ноября 2018

Вы можете использовать метод insertWithOnConflict(TABLE_NAME,null,contentvalues,SQLiteDatabase.CONFLICT_REPLACE);

Где contenvalues ​​- это ContenValues, заполняемые с использованием метода put (column_name, value) для каждого вставляемого значения.

Код будет выглядеть следующим образом: -

ContentValues cv = new Contentvalues();
cv.put("_id",the_id);
cv.put("type",the_type);
..... etc
long result =  helper.insertWithOnConflict(TABLE_NAME,null,cv,SQliteDatabase.CONFLICT_REPLACE);
  • результатом будет идентификатор строки вставленной строки или -1.

insertWithOnConflict

CONFLICT_REPLACE

P.S. использование execSQL , как у вас, обеспечит защиту от внедрения SQL, поскольку сам SQL не подлежит вводу пользователем, а значения связаны / передаются в качестве аргументов.

...