Форум о защите от: хакеров, взлом, раскрутка, хакер, вирусы, взлом программы, взлом паролей, взлом вконтакте, взлом icq, раскрутка сайта, взлом скачать, взлом почты, взлом ru, проги взлома, хакер, программа взлома, трояны, программирование http://forum.ahack.ru/ |
|
Защита от SQL-инъекций http://forum.ahack.ru/topic364.html |
Страница 1 из 1 |
Автор: | BECHED [ 23-10, 16:11 ] |
Заголовок сообщения: | Защита от SQL-инъекций |
Для защиты от инъекции SQL необходимо тщательно фильтровать входные параметры, значения которых будут использованы для построения SQL-запроса. Целочисленные параметры Возьмём другой запрос: statement := 'SELECT * FROM users WHERE id = ' + id + ';'; В данном случае поле id имеет числовой тип, и его нельзя брать в кавычки. Поэтому «закавычивание» и замена спецсимволов на escape-последовательности не проходит. В таком случае помогает проверка типа; если переменная id не является числом, запрос вообще не должен выполняться. Например, на Delphi для противодействия таким инъекциям помогает код: id_int := StrToInt(id); statement := 'SELECT * FROM users WHERE id = ' + IntToStr(id_int) + ';'; или query.Params[0].AsInteger := StrToInt(id); В случае ошибки функция StrToInt возбудит исключение EConvertError, и в его обработчике можно будет вывести сообщение об ошибке. Двойная конверсия (из числа в строку и обратно), выполняющаяся в первом фрагменте явно и во втором неявно, обеспечивает корректную реакцию на числа в формате 132AB (шестнадцатеричная система счисления). На стандартном Паскале, не умеющем обрабатывать исключения, код несколько сложнее. Фильтрация строковых параметров Предположим, что код, генерирующий запрос (на языке программирования Паскаль), выглядит так: statement := 'SELECT * FROM users WHERE name = "' + userName + '";'; Если в качестве значения переменной userName задать строку 'a"; DROP TABLE users; SELECT * FROM data WHERE name LIKE "%', то будет сгенерирована такая SQL-команда: SELECT * FROM users WHERE name = "a"; DROP TABLE users; SELECT * FROM DATA WHERE name LIKE "%"; Правильный, безопасный код должен проводить замену кавычки на \", апострофа на \', обратной косой черты на \\ (это называется «экранировать спецсимволы»). Это можно делать таким кодом: statement := 'SELECT * FROM users WHERE name = ' + QuoteParam(userName) + ';'; function QuoteParam(s : string) : string; { на входе — строка; на выходе — строка в кавычках и с заменёнными спецсимволами } var i : integer; Dest : string; begin Dest := '"'; for i:=1 to length(s) do case s[i] of '''' : Dest := Dest + '\'''; '"' : Dest := Dest + '\"'; '\' : Dest := Dest + '\\'; else Dest := Dest + s[i]; end; QuoteParam := Dest + '"'; end; Perl, PHP, Java, Delphi и другие языки, ориентированные на базы данных, имеют встроенные средства, автоматически выполняющие эту операцию: на Delphi — свойство TQuery.Params; на Perl — через DBI::quote или DBI::prepare; на Java — через класс PreparedStatement; на C# — свойство SqlCommand.Parameters; на PHP (при работе с MySQL) — функции mysql_escape_string, mysql_real_escape_string, addslashes. на Parser (ни при работе с SQL, ни с XML, ни с почтой) ничего делать не нужно, язык сам предотвращает атаки подобного рода. wikipedia.org |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |