Я пишу программу, которая работает с sqlite на QT 5.1. Только что с удивлением обнаружил, что вопреки документации, не происходит вообще никакого экранирования символов при подготовке запросов. То есть если случайно в тексте поставить запятую, кавычки или вообще подставить SQL код, QT никаким образом за этим не следит.
Пример кода для иллюстрации:
QSqlQuery injectTest(db);
QString test("asdasd, asd,' , ");
injectTest.prepare("UPDATE testtable SET text = :text WHERE id = 0");
injectTest.bindValue(":text", QVariant(test));
injectTest.exec();
При этом пытается выполниться следующий запрос (и естественно, он не может пройти):
UPDATE testtable SET text = asdasd, asd,' ,
В
документации QT написано следующее: «Besides performance, one advantage of placeholders is that you can easily specify arbitrary values without having to worry about escaping special characters.»
В чём может быть дело? Я где-то лажаю, или это какой-то невероятный баг в QT?