Интернет магазин китайских планшетных компьютеров |
|
Компьютеры - Внедрение SQL-кода - Защита от атак типа внедрение SQL-кода23 января 2011Оглавление: 1. Внедрение SQL-кода 2. Методика атак типа внедрение SQL-кода 3. Защита от атак типа внедрение SQL-кода Для защиты от данного типа атак необходимо тщательно фильтровать входные параметры, значения которых будут использованы для построения SQL-запроса. Фильтрация строковых параметровПредположим, что код, генерирующий запрос, выглядит так: statement := 'SELECT * FROM users WHERE name = "' + userName + '";'; Чтобы внедрение кода было невозможно, для некоторых СУБД, в том числе, для MySQL, требуется брать в кавычки все строковые параметры. В самом параметре заменяют кавычки на \", апостроф на \', обратную косую черту на \\. Это можно делать таким кодом: statement := 'SELECT * FROM users WHERE name = ' + QuoteParam + ';'; function QuoteParam : string; { на входе — строка; на выходе — строка в кавычках и с заменёнными спецсимволами } var i : integer; Dest : string; begin Dest := '"'; for i:=1 to length do case s of '''' : Dest := Dest + '\'''; '"' : Dest := Dest + '\"'; '\' : Dest := Dest + '\\'; else Dest := Dest + s; end; QuoteParam := Dest + '"'; end; Для PHP фильтрация может быть такой: <? $query = "SELECT * FROM users WHERE user='".mysql_real_escape_string."';"; ?> Фильтрация целочисленных параметровВозьмём другой запрос: statement := 'SELECT * FROM users WHERE id = ' + id + ';'; В данном случае поле Например, на Delphi для противодействия таким инъекциям помогает код: id_int := StrToInt; statement := 'SELECT * FROM users WHERE id = ' + IntToStr + ';'; В случае ошибки функция Для PHP этот метод будет выглядеть так: $query = 'SELECT * FROM users WHERE id = ' . $id; Усечение входных параметровДля внесения изменений в логику выполнения SQL-запроса требуется внедрение достаточно длинных строк. Так, минимальная длина внедряемой строки в вышеприведённых примерах составляет 8 символов. Если максимальная длина корректного значения параметра невелика, то одним из методов защиты может быть максимальное усечение значений входных параметров. Например, если известно, что поле statement := 'SELECT * FROM users WHERE id = ' + LeftStr + ';'; Использование параметризованных запросовМногие сервера баз данных поддерживают возможность отправки параметризованных запросов. При этом параметры внешнего происхождения отправляются на сервер отдельно от самого запроса либо автоматически экранируются клиентской библиотекой. Для этого используются
Например var sql, param : string; begin sql := 'select :text as value from dual'; param := 'alpha'; Query1.Sql.Text := sql; Query1.ParamByName.AsString := param; Query1.Open; ShowMessage; end;
Просмотров: 3829
|