Есть ли более чистый способ сделать это?(Подготовленные SQL-запросы в Qt C ++) - PullRequest
2 голосов
/ 04 сентября 2010

Я использую QSqlQuery :: prepare () и :: addBindValue () для своих запросов в проекте Qt, над которым я работаю. Там много повторяющегося кода, и хотя я думаю, что это «правильный» способ, я хотел убедиться. Возможно, у кого-то есть альтернативные идеи? Пример:

QSqlQuery newQuery;
newQuery.prepare("INSERT INTO table "
                 "(foo,bar,baz,"
                 "herp,derp,biggerp,"
                 "alpha,beta,gamma,"
                 "etc) VALUES "
                 "(?,?,?,"
                 "?,?,?,"
                 "?,?,?,"
                 "?)");
newQuery.addBindValue(this->ui->txtFoo->text());
newQuery.addBindValue(this->ui->txtBar->text());
newQuery.addBindValue(this->ui->txtBaz->text());
newQuery.addBindValue(this->ui->txtHerp->text());
newQuery.addBindValue(this->ui->txtDerp->text());
newQuery.addBindValue(this->ui->txtBiggerp->text());
newQuery.addBindValue(this->ui->txtAlpha->text());
newQuery.addBindValue(this->ui->txtBeta->text());
newQuery.addBindValue(this->ui->txtGamma->itemText(0));
newQuery.addBindValue(this->ui->txtEtc->text());
newQuery.exec();

Вы можете видеть, что есть куча одного и того же "newQuery.addBindValue (this-> ui -> __________") снова и снова. Это «лучший» способ сделать это?

Кроме того, я спросил в #qt на freenode прошлой ночью, но не получил окончательного ответа; будет ли вышеизложенное (:: подготовить с помощью :: addBindValue) защитить от внедрения SQL? Ссылка на самом деле не сказал.

Ответы [ 2 ]

4 голосов
/ 04 сентября 2010

Может показаться немного более уместным, если вы сначала создадите QMap или QStringList с привязками, а затем выполните итерацию по этой структуре данных и вызовете addBindValue() для каждого элемента в списке / карте.

3 голосов
/ 04 сентября 2010

Что касается вашего подвопроса о внедрении SQL, эта комбинация ::prepare и ::addBindValue действительно полностью защищает от него.Это потому, что связанные значения никогда не анализируются механизмом SQL;это просто значения, которые вставляются в после компиляции (этап подготовки) и перед выполнением.

Конечно, вы должны быть осторожны, когда вынимаете значения и из БД, но этоне защита базы данных, а скорее обеспечение того, чтобы значения не использовались для причинения другого вреда (например, вставка неожиданных вредоносных тегов <script> в HTML или, что еще хуже, <blink> или <marquee> чудовище).Но это еще одна проблема, и она не распространяется на все виды использования;размещение значений в строго текстовом поле графического интерфейса обычно не представляет проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...