Есть ли преимущество использования метода привязки строк SQLitestatement вместо простой конкатенации строк для выполнения операторов SQL - PullRequest
0 голосов
/ 08 июня 2019

Я хотел вставить значения в таблицу базы данных SQLite в Android Studio. Я хотел спросить, какой метод мне лучше выбрать из приведенных ниже двух методов. Я изучил первый метод из курса, но я хочу использовать второй метод. Вот почему я задаю вопрос

articleId, articleContent и articleTitle имеют тип string.

ПОЖАЛУЙСТА, ОБЪЯСНИТЕ СВОЙ ОТВЕТ, ДАВАЯ ПРИМЕР.

Пожалуйста, укажите плюсы и минусы каждого метода, если можете. Вы можете предложить другой метод, если хотите.

String sql = "INSERT INTO articles (articleId, title, content) VALUES (?, ?, ?)";
SQLiteStatement statement = articlesDB.compileStatement(sql);
statement.bindString(1, articleId);
statement.bindString(2, articleTitle);
statement.bindString(3, articleContent);
statement.execute();

ИЛИ просто используя конкатенацию строк:

sqliteDatabase.execSQL("INSERT INTO articles (articleId, title, content) VALUES ("+articleId+","+articleTitle+","+articleContent+")");

1 Ответ

0 голосов
/ 08 июня 2019

Да, всегда рекомендуется использовать bindString(), чтобы избежать возможных атак на вашу базу данных через SQL-инъекцию.В вашем конкретном случае, если вы жестко программируете оператор вставки только в своем коде и если значения, которые вы передали через него, получены из любого статического источника, это означает, что значения передаются только из вашего кода, а не из какого-либо динамического входного источника, тогда онможет быть безопасно использовать любой из методов, упомянутых в вашем вопросе.

В вашем случае вы также можете использовать insert() из SQLiteDatabase класса, который безопасен для любой синтаксической ошибки:

SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("articleId", articleId);
values.put("title", articleTitle);
values.put("content", articleContent);
db.insert("articles", null, values);

Возвращает идентификатор строки вновь вставленной строки или -1, если произошла ошибка.

Однако, если вы берете значения из пользовательского ввода, то простое использование конкатенации строк делает вашу базу данных полностьюуязвимы для потенциальных злоумышленников.Вот почему всегда рекомендуется использовать bindString() метод класса SQLiteProgram, который расширен классом SQLiteStatement для выполнения sql, где нам нужно передать значения.

Другая причина в том, что bindString() может вызыватьjava.lang.IllegalArgumentException.Таким образом, использование этого метода может быть полезным для целей отладки в случае возникновения любой синтаксической ошибки.

...