2015-08-20 8 views
1

Во второй половине дня всехПередача параметров с апострофом и групповыми символами из C++ в SQL

Я работал над расширением длл для приложения, это отчет о деятельности клиента и первой секции поиск пользователя для поиска клиента ,

Сам запрос работает нормально, но когда я попытался выполнить его SQL-инъекцию при передаче параметров, я не смог заставить его работать.

Я пробовал использовать апострофы и подстановочные знаки в основном запросе, но когда я сделал q-> Params-> ParamByName ("ID") -> AsString = param, бросил исключение, заявив, что не может найти параметр, который Я подтвердил действие апострофов. Когда я передаю апострофы и подстановочные знаки как часть параметра, как показано ниже, ошибки нет, но запрос ничего не возвращает.

Я попытался убежать как от апострофа, так и от подстановочных знаков, но это не имело значения.

Пожалуйста, дайте мне знать, если мне нужно предоставить дополнительную информацию.

TStringList* SQLString = new TStringList; 
SQLString->Add("select p.id, p.givenName, p.surname, p.dateOfBirth, vm.MaxRowDate "); 
SQLString->Add("from ( "); 
SQLString->Add(" select pid, customer_systemID, customer_dbID, max(datetime) as MaxRowDate "); 
SQLString->Add(" from Visit "); 
SQLString->Add(" group by pid, customer_systemID, customer_dbID"); 
SQLString->Add(" ) vm "); 
SQLString->Add("inner join Customer p "); 
SQLString->Add("ON vm.pid = p.pid "); 
SQLString->Add("and vm.customer_systemID = p.systemID "); 
SQLString->Add("and vm.customer_dbID = p.databaseID "); 

AnsiString joiningTerm("where "); 

if(id != "") 
{ 
    SQLString->Add(joiningTerm+"id like :ID "); 
    joiningTerm = "and "; 
} 

SQLString->Add("order by surname "); 

TMSQuery* q; 

try 
{ 

    try 
    { 
     q = new TMSQuery(NULL); 
     q->Connection = _db; 


     q->SQL->Assign(SQLString); 

     if(id != "") 
     { 
      AnsiString param("'%"+id+"%'"); 
      q->Params->ParamByName("ID")->AsString = param; 
     } 

     q->Open(); 

Вот мой сырая SQL-запрос:

SELECT p.id, p.givenName, p.surname, p.dateOfBirth, vm.MaxRowDate 
FROM 
( 
    SELECT pid, customer_systemID, customer_dbID, MAX(DATETIME) AS MaxRowDate 
    FROM Visit 
    GROUP BY pid, customer_systemID, customer_dbID 
) vm 
INNER JOIN Customer p 
ON vm.pid = p.pid AND vm.customer_systemID = p.systemID AND vm.customer_dbID = p.databaseID 

Edit: Это было предложено мне, что, возможно, это ограничение библиотеки. Я собираюсь размещать сообщения на форумах Devart и сообщать об ответах, если получаю ответ.

+0

Попробуйте это ... 'AnsiString param (« '%' "+ id +" '%' ");' –

+0

Я знаю, что это не ваш вопрос здесь, но поскольку это связано, вы уверены, что вам нужно создать запрос полностью динамически? Возможно, это не полный случай использования, но похоже, что эта логика достаточно проста, может быть инкапсулирована в хранимую процедуру, и тогда вам даже не придется беспокоиться об инъекции. – Xedni

+0

@ M.Ali Я пробовал это, но все равно не повезло – Crackerjack55

ответ

1

Один из вариантов заключается в проверке ввода пользователем. Пройдите через вход и удалите все недопустимые символы или верните ошибку и отбросьте весь ввод/транзакцию.

+0

Спасибо за ваш ответ, но проблема заключается не в том, что пользователь пропускает недопустимые символы, проблема в том, что запрос нужно искать с использованием диких карт, а значение должно быть заключено в апострофы. – Crackerjack55