Работа с компонентов ADOQuery
ADOQuery1->SQL->Params[0] = "test'test\bv";
ADOQuery1->SQL->PrepareStatement();
Суть этого процесса вот в чем: допустим, если встречаются знаки sql, такие как ',\," итп он подставляет \ перед ними...
Можно конечно сесть и написать свою функцию, которая будет это делать, но зачем изобретать велосипед, если он уже изобретен:-)
Есть ли такая возможность или нет?
А в С++ объявишь параметр ntabl как String и все.
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Text ="SELECT * FROM "+ntabl+" WHERE ...."
ADOQuery1->Open();
Или что-то не то?
А в С++ объявишь параметр ntabl как String и все.
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Text ="SELECT * FROM "+ntabl+" WHERE ...."
ADOQuery1->Open();
Или что-то не то?
не то однозначно:-)
я уже вроде как нашел решение, сча его
Выкладываю правильный запрос к БД, с точки зрения безопасности:
ADOQuery1->SQL->Text = "SELECT * from table where table.param1 = :param1 or table.param2 = :param2"; // создаем параметризированный запрос к БД
ADOQuery1->Parameters->ParamValues["param1"] = "'/\/'"; //значение 1го параметра
ADOQuery1->Parameters->ParamValues["param2"] = "'' asg''''"; //значение 2го параметра
Преимущество такого построения запроса является неуязвимость кода к разным кавычкам, слешам итп.
ЗЫ: Модераторы: добавьте это в ФАК. Очень облегчает жизнь против разных видов sql иньекций:-)
я уже вроде как нашел решение, сча его
Выкладываю правильный запрос к БД, с точки зрения безопасности:
ADOQuery1->SQL->Text = "SELECT * from table where table.param1 = :param1 or table.param2 = :param2"; // создаем параметризированный запрос к БД
ADOQuery1->Parameters->ParamValues["param1"] = "'/\/'"; //значение 1го параметра
ADOQuery1->Parameters->ParamValues["param2"] = "'' asg''''"; //значение 2го параметра
Преимущество такого построения запроса является неуязвимость кода к разным кавычкам, слешам итп.
ЗЫ: Модераторы: добавьте это в ФАК. Очень облегчает жизнь против разных видов sql иньекций:-)
мммм. сильно сказано. Но ИМХО относительную неуязвимость кода может обеспечить - первое - проверка размера передаваемых данных в программу. Второе - очистка данных от "опасных" символов.
Идея автора не очень понятна. Т.е. параметры вроде как должны быть получены от пользователя? тогда какое преимущество мы получаем? если параметры забиты в код - то тогда вобще смысл? Или может я чтото упустил?
Попробуйте запрос сделать таким образом:
А потом попробуйте моим параметром, и произведите простую sql иньекцию...и тогда вы поймете, в чем подвох. в этой случае sql иньекция пройдет, а в том случае, что я предлогаю, все ' заменяться на \', " заменяться на \" и \ на \\. Это основное условия от sql иньекций (самый простой способ взлома).
Вот ответ: строковые параметры надо заключать в двойные ковычки используя метод
AnsiQuotedStr ( str, '"' );
Попробуйте запрос сделать таким образом:
А потом попробуйте моим параметром, и произведите простую sql иньекцию...и тогда вы поймете, в чем подвох. в этой случае sql иньекция пройдет, а в том случае, что я предлогаю, все ' заменяться на \', " заменяться на \" и \ на \\. Это основное условия от sql иньекций (самый простой способ взлома).
Из всего напоминает только первое:-)
Но ошибку понял, признаю. Тему можно закрыть:-)
Но ошибку понял, признаю. Тему можно закрыть:-)
Кстати надо учитывать - что параметры тоже не панацея - конкретный пример привести не могу - лень. но думаю что существует возможность создать уязвимость даже на первый взляд в защищенном коде. поэтому любое получение данных о пользователя должно:
1. Проверяться на размер введенных данных
2. На наличие недопустимых символов
3. Наличие паттернов командной строки
1. Проверяться на размер введенных данных
2. На наличие недопустимых символов
3. Наличие паттернов командной строки
Ок. Спасибо, учту.