Инъекция SQL

Инъекция SQL (англ. SQL injection) — один из распространённых способов взлома программ, работающих с базами данных. Атака типа инъекции SQL может случиться из-за некорректной обработки входящих данных, используемых в SQL-запросах. Инъекция SQL часто даёт возможность атакующему выполнить произвольный запрос к базе данных, например прочитать содержимое любых таблиц или удалить все данные.

Предположим, что код, генерирующий запрос (на языке программирования Delphi), выглядит так:

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.

Разработчик прикладных программ, работающих с базами данных, должен знать о такой уязвимости и принимать меры противодействия инъекции SQL.

 
Начальная страница  » 
А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ы Э Ю Я
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9 Home