Коллектив авторов - Защита от хакеров корпоративных сетей
request.querystring(“name”) & “‘”
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.Open “ DSN=websql;UID=webserver;PWD=w3bs3rv3r;DATABASE=data”
Set rec = Server.CreateObject(“ADODB.RecordSet”)
rec.ActiveConnection=Conn
rec.Open SQLquery %>Видно, что перед выполнением запроса SQL введенные пользователем данные не проверяются. Например, никак не контролируется значение параметра name перед включением его в запрос, поэтому злоумышленнику будет очень просто заставить приложение пропустить запрос SQL и выполнить нужные ему команды.
Контроль данных
Лучший способ борьбы с не предусмотренными разработчиком данными – проверка их на допустимые значения. Помня о принципе сведения проверок к минимуму, следует оценить диапазон значений тех или иных символов для каждого сообщения, передаваемого пользователем.
Например, в почтовом индексе должны присутствовать только числа и, возможно, символ дефиса для США. Телефонный номер состоит из чисел и символов форматирования (круглых скобок и дефиса). Для адреса требуются цифры и буквы, для имени – только буквы. Конечно, можно считать символы форматирования допустимыми, но с каждым символом возрастает потенциальный риск возникновения уязвимости. Хотя числа и буквы в общем-то безобидны, но тем не менее вполне возможно включение во входные данные приложения дополнительных команд SQL с использованием только букв, чисел и символа пробела. На это не потребуется много усилий, так что задумайтесь лучше об ограничении входного потока данных.
Пропуск символов
При просмотре документации по интерфейсу CGI для программистов поражает количество советов избегать применения управляющих символов командного процессора. Зачем их избегать, если они не вообще не нужны? К тому же возможны случаи, когда недостаточно просто пропустить без обработки символы командного процессора.
Например, нельзя в строке пропустить символ возврата каретки, поместив перед ним символ обратной косой черты «». В результате действие символа возврата каретки отменено не будет, а строка закончится символом «», который имеет особое значение для командного процессора UNIX. С символом NULL та же история. Если NULL пропустить в строке, то строка закончится символом обратной косой черты «». В языке Perl функция open выполняется по-особенному, если имя файла завершается символом со специальным значением «I», невзирая на наличие символа обратной косой черты «» перед ним.
Лучше удалить опасные символы данных, чем попытаться их пропустить или обезвредить. Не всегда понятно, как будут восприняты те или иные символы, поэтому с точки зрения обеспечения безопасности сомнительные символы лучше удалить.
Естественно, в каждом языке предусмотрены свои собственные средства контроля опасных символов данных. Рассмотрим некоторые популярные языки и встроенные в них средства контроля.
Язык Perl
В языке Perl оператор замены строк с ключом удаления (tr///d) хорошо справляется с удалением символов из обрабатываемой строки. Совместное использование ключей удаления и инверсии (tr///cd) позволяет удалить из обрабатываемой строки все символы, кроме указанных. Оператор замены строк не использует нотацию регулярных выражений regex, а обрабатывает строку посимвольно. Например, чтобы оставить в строке только цифры, следует выполнить следующий оператор:$data =~ tr/0-9//cd
Диапазон чисел /0-9 / совместно с ключами дополнения и инверсии cd, заданными в операторе замены строк tr, указывают на необходимость удаления любых нечисловых символов из обрабатываемой строки (вместо замены их на другой символ). Оператор подстановки текста (s///) языка Perl хотя и медленнее, но предоставляет программисту больше возможностей. Он позволяет использовать всю мощь регулярных выражений regex для изощренной обработки строк по шаблонам в соответствии с форматом. Например, чтобы в строке сохранить только цифры, следует выполнить следующий оператор:
$data =~ s/[^0-9]//g
Ключ g указывает на необходимость обработки всех, в том числе и одинаковых, символов строки. В состав модуля интерфейса базы данных DBI (Database Interface) входит функция работы с кавычками quote, которой передается строка запроса SQL и которая возвращает ее копию с правильно расставленными с точки зрения запроса кавычками, в том числе расставляя корректные кавычки по концам строки:
$clean = $db->quote($data)
Следует подчеркнуть, что функция обрамляет строку одинарными кавычками, так что правильный запрос SQL выглядит таким образом:
SELECT * FROM table WHERE x=$data,
а не так:
SELECT * FROM table WHERE x=’$data’
Язык разметки COLD Fusion
Для удаления нежелательных символов из строки данных можно использовать функции языка разметки COLD Fusion (CFML–COLD Fusion Markup Language), поддерживающие регулярные выражения regex. К их числу принадлежит функция REReplace.REReplace(data, “regex pattern”, “replace with”, “ALL”)
Параметр «ALL» указывает функции на необходимость выполнить замену символов во всей строке в соответствии с шаблоном. Например, чтобы оставить в строке data только числа, следует вызвать функцию:
REReplace(data, “[^0-9]”, “”, “ALL”)
В языке разметки CFML предусмотрена функция, которая, в отличие от функции REReplace, заменяет только один символ на другой или одну строку на другую (но не группу символов). Реже используется функция replacelist. Она применяется для замены одних известных символов на другие:
ReplaceList(data, “|,!,$”, “X,Y,Z”)
В этом примере символы «1!$» заменяются символами «XYZ».
Технология ASP
В новейшей технологии ASP (Active Server Pages), разработанной корпорацией Microsoft, представлен новый regex-объект регулярных выражений. Его используют для замены данных по шаблону, например:set reg = new RegExp
reg.pattern = “[^a-zA-Z0-9]”
data = reg.replace(data, “”)Для замены символов можно использовать системную настраиваемую функцию replace, но для этого нужен навык обращения с функцией посимвольной замены. Например, следующий код используется для оставления в строке только чисел:
function ReplaceFunc(MatchedString) {
return “”;}
var regex = /[^0-9]/g;
data = data.replace(regex, ReplaceFunc);В фрагменте кода задана функция ReplaceFunc, которая вызывается для каждого заменяемого символа функцией replace в соответствии с шаблоном regex. В ранних версиях ASP единственным способом проверки символов в строке было сравнение каждого символа строки с заданными ограничениями: проверяемый символ принадлежит или не принадлежит заданному диапазону значений величин ASCII, либо удовлетворяет или не удовлетворяет заданным логическим условиям. Излишне говорить, что метод регулярных выражений regex стал долгожданным нововведением.
Язык PHP
В языке программирования PHP предусмотрен ряд функций, полезных для обработки непредвиденных данных и данных неверного формата. Для фильтрации данных в соответствии с заданным набором символов можно использовать функцию замены ereg_replace языка PHP, основанную на регулярных выражениях regex:
ereg_replace(“regex string”, “replace with”, $data)
Ниже приведен вариант вызова функции для удаления из строки всех нечисловых символов:
ereg_replace(“[^0-9]”, “”, $data)
Вспомните, что шаблон «[^0–9]» означает, что надо заменить все, что не является числом на строку «», которая является пустой строкой, а значит, нечисловой символ удаляется. Для пропуска символов из небольшого набора метасимволов (символов специального назначения) в PHP включена функция quotemeta:
$clean = quotemeta($data)
При использовании функции нужно быть внимательным, потому что число обрабатываемых функцией символов невелико, не больше следующего списка символов (.+?[^](*)$) . Функция addslashes – другая полезная функция, которая часто используется в запросах SQL:
$clean = addslashes($data)
Функция addslashes добавляет символ обратной косой черты () перед всеми символами одинарных кавычек (), двойных кавычек ("), обратной косой черты () и NULL-символами. Это серьезная защита от действий злоумышленника, пытающегося использовать SQL-запрос пользователя в своих целях. В SQL-запросах некоторых систем управления базами данных (например, Sybase или Oracle) для пропуска одинарных кавычек () используются их дублирование («), а не символ обратной косой черты (»). Для этого используется функция ereg_replace в следующем виде:
ereg_replace(“‘”, “‘’”, $data)
Защита запросов SQL
Пользователь может успешно противостоять атакам злоумышленника даже при всем богатстве арсенала средств использования злоумышленником SQL-запросов пользователя в своих преступных целях. На самом деле при правильном использовании SQL-запросов у злоумышленника почти нет шансов получить доступ к приложению пользователя.
Повсеместно используемый современный метод защиты от атак злоумышленника на SQL-запросы называется заключением в кавычки (quoting) и по существу основан на правильном заключении в кавычки передаваемых данных и контроле над отсутствием лишних кавычек. Многие средства программного интерфейса с базами данных (например, модули DBI языка Perl) предлагают использовать различные функции заключения строк в кавычки. Тем не менее, чтобы не было недопонимания по этому вопросу, рассмотрим процедуру quotedata на языке Perl.