компьютерный форум
Вернуться   Компьютерный форум > Программирование и вебстроительство > Программирование > Заказы на разработку ПО и сайтов > Защита информации > Интернет ресурсы

Ответ
 
LinkBack Опции темы Опции просмотра
Старый 05.01.2011, 11:11   #1
Пользователи
 
Регистрация: 21.12.2007
Сообщений: 161
Thumbs up Защита от sql инъекции

Для защиты от данного типа атак необходимо тщательно фильтровать входные параметры, значения которых будут использованы для построения SQL-запроса.

Фильтрация строковых параметров

Предположим, что код, генерирующий запрос , выглядит так:
Код:
statement := 'SELECT * FROM users WHERE name = "' + userName + '";';
Чтобы внедрение кода было невозможно, для некоторых СУБД, в том числе, для MySQL, требуется брать в кавычки все строковые параметры. В само́м параметре заменяют кавычки на \", апостроф на \', обратную косую черту на \\ (это называется «экранировать спецсимволы»). Это можно делать таким кодом:
Код:
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;
Для PHP фильтрация может быть такой:
Код:
<?
$query = "SELECT * FROM users WHERE user='".mysql_real_escape_string($user)."';";
?>
Фильтрация целочисленных параметров

Возьмём другой запрос:
Код:
statement := 'SELECT * FROM users WHERE id = ' + id + ';';
В данном случае поле id имеет числовой тип, и его нельзя брать в кавычки. Поэтому «закавычивание» и замена спецсимволов на escape-последовательности не проходит. В таком случае помогает проверка типа; если переменная id не является числом, запрос вообще не должен выполняться.

Например, на Delphi для противодействия таким инъекциям помогает код:
Код:
 id_int := StrToInt(id);
 statement := 'SELECT * FROM users WHERE id = ' + IntToStr(id_int) + ';';
В случае ошибки функция StrToInt вызовет исключение EConvertError, и в его обработчике можно будет вывести сообщение об ошибке. Двойное преобразование обеспечивает корректную реакцию на числа в формате $132AB (шестнадцатеричная система счисления). На стандартном Паскале, не умеющем обрабатывать исключения, код несколько сложнее.

Для PHP этот метод будет выглядеть так:
Код:
 $query = 'SELECT * FROM users WHERE id = ' . intval($id);
Усечение входных параметров

Для внесения изменений в логику выполнения SQL-запроса требуется внедрение достаточно длинных строк. Так, минимальная длина внедряемой строки в вышеприведённых примерах составляет 8 символов («1 OR 1=1»). Если максимальная длина корректного значения параметра невелика, то одним из методов защиты может быть максимальное усечение значений входных параметров.

Например, если известно, что поле id в вышеприведённых примерах может принимать значения не более 9999, можно «отрезать лишние» символы, оставив не более четырёх:
Код:
statement := 'SELECT * FROM users WHERE id = ' + LeftStr(id, 4) + ';';
Использование параметризованных запросов

Многие сервера баз данных поддерживают возможность отправки параметризованных запросов. При этом параметры внешнего происхождения отправляются на сервер отдельно от самого запроса либо автоматически экранируются клиентской библиотекой. Для этого используются

-на Delphi — свойство TQuery.Params;

Например
Код:
var
  sql, param : string;
begin
  sql := 'select :text as value from dual';
  param := 'alpha';  
  Query1.Sql.Text := sql;
  Query1.ParamByName('text').AsString := param;
  Query1.Open;
  ShowMessage(Query1['value']);  
end;
- Perl — через DBI::quote или DBI
-на Java — через класс PreparedStatement;
-на C# — свойство SqlCommand.Parameters;
-на PHP (при работе с MySQL) — функции mysql_escape_string, mysql_real_escape_string, addslashes.
-на Parser — язык сам предотвращает атаки подобного рода.




семенчик вне форума  
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
05.01.2011, 11:11
Техник
реклама
Thumbs up Защита от sql инъекции

Ответ


Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Вкл.



Текущее время: 00:19. Часовой пояс GMT.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Content Relevant URLs by vBSEO 3.5.0 RC2