SQL-инъекция

Материал из [k0d.cc] Hack Wiki

Перейти к: навигация, поиск

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

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

Строковые параметры

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

   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 si of
         ' : Dest := Dest + '\;
         '"' : Dest := Dest + '\"';
         '\' : Dest := Dest + '\\';
       else Dest := Dest + si;
       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.

nnMOSt <a href="http://eafsdqzlfjqc.com/">eafsdqzlfjqc</a>, [url=http://ovmilrnsvejg.com/]ovmilrnsvejg[/url], [link=http://ixiceypivsqk.com/]ixiceypivsqk[/link], http://zkxgcanlenim.com/

Личные инструменты