Язык 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.

sub quotedata {

my $incoming=shift;

$incoming=~s/[““]/’’/g;

return “‘$incoming’”; }

В процедуре для обработки входных данных используется функция подстановки языка Perl, которая в случае обнаружения одинарных или двойных кавычек подставляет вместо них две одинарные кавычки. Такой вариант обработки данных является допустимым способом размещения кавычек внутри данных запроса SQL. Другой вариант заключается в удалении всех кавычек, правда, при этом поток данных будет модифицирован. Обработанные данные заключаются в одинарные кавычки и возвращаются приложению, вызвавшему процедуру. В приложении функция quotedata должна быть использована следующим образом:

# … incoming user data is placed in $data

$quoted_data = quotedata($data);

$sql_query = “SELECT * FROM table WHERE column = $quoted_data”;

# … execute your SQL query

Таким образом, значение переменной $data будет правильно заключено в кавычки, а запрос – обработан системой управления базами данных без ошибки. Но только правильное заключение данных в кавычки не означает полную защиту от возможных проблем. Некоторые системы управления базами данных могут интерпретировать отдельные обнаруженные внутри данных символы как команды. Например, ядро базы данных Microsoft Jet до версии 4.0 распознавало среди данных внутренние команды VBA вне зависимости от того, правильно они были взяты в кавычки или нет.

Удалять неверные данные или сообщить об ошибке?

При обработке входных данных пользователя у разработчика есть два варианта. Первый – при обнаружении неверных входных данных удалить их, не сообщая об этом пользователю, и, оставив правильные данные без изменения, продолжить обработку оставшихся данных. И второй – сразу же прекратить обработку данных при обнаружении в них ошибки и сообщить о найденной ошибке. Каждый подход имеет свои «за» и «против».

Если приложение сообщает пользователю о найденных ошибках входных данных, то злоумышленник может воспользоваться сообщениями для поиска прорех в защите приложения. Он сможет быстро определить, какие символы приложение пытается использовать не по назначению, пересылая их приложению и отслеживая результаты. Эта методика незаменима для обнаружения уязвимостей в приложениях с недоступным исходным текстом.

Незаметная для пользователя фильтрация входных данных, основанная на удалении неверных данных без сообщения об ошибке и допускающая ввод только безопасных символов, не лишена недостатков. Во-первых, не ошибитесь, данные после проверки на допустимость могут измениться. Во-вторых, если при фильтрации нарушена целостность данных, то результат непредсказуем. Например, удаление символов из пароля может породить ошибки. И наконец, в-третьих, приложение может оказать неоценимую услугу злоумышленнику, если оно печатает переданные данные после их фильтрации: злоумышленник увидит, что в запросе было удалено.

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

Функции контроля непредвиденных данных

Централизованная выдача диагностических сообщений об ошибках входных данных приложения в одной функции позволит упростить контроль непредвиденных входных данных. Значение контроля входных данных огромно. Благодаря контролю можно узнать ошибки фильтрации входных данных пользователя и, что более важно, когда и каким образом злоумышленник попытается изменить логику работы приложения. Поэтому настоятельно рекомендуется использовать централизованные функции выдачи диагностических сообщений об ошибках при вводе данных.

В централизованной функции контроля входных данных удобно организовать регистрацию всех нарушений и передачу необходимой информации для дальнейшей обработки. Минимум реализованных в подобной функции действий – запись неверных данных в журнал регистрации и анализ ошибки: было ли это случайной ошибкой пользователя, который ввел неправильный символ, или это была целенаправленная атака злоумышленника, пытающегося извлечь выгоду из приложения. Можно предусмотреть сбор информации об ошибках для последующей статистической обработки с целью определения «профиля ввода»(«input profiling»), то есть выявления наиболее часто встречающихся ошибок. Полученные результаты используются для более тщательной «настройки» фильтров приложения.

Ошибки входных данных следует фиксировать c самого начала эксплуатации приложения. С течением времени в функцию контроля входных данных вносятся необходимые дополнения и исправления. Основываясь на накопленной информации об ошибках, можно предусмотреть в функции контроля дополнительные правила проверки или оставить приложение без изменений. Функция контроля и выявления нарушений позволяет централизованно обрабатывать выявленные нарушения во входных данных, при необходимости сообщая о неверном вводе и прекращая работу приложения.

Подмена значений

Подмена значений – уловка, основанная на замене одного значения (обычно случайного значения ключа сессии большой длины) другим, который каким-то образом связан с уязвимыми данными. В результате клиенту вместо пересылки по сети уязвимых данных пересылается подмененное значение, использование которого ограничено рамками приложения. При использовании подмены уязвимых данных каким-либо значением оно должно быть случайным и большим, чтобы злоумышленник не смог угадать алгоритм его порождения и получить доступ к уязвимым данным. Это очень похоже на разработку cookies в протоколе HTTP.

Загрузка...