Сохранение веб-пользователей безопасным дезинфекции ввода данных

На мой последний article, о котором я говорил несколько распространенных ошибок, которые отображаются в веб-приложениях.

Из них тот, который вызывает наибольшие затруднения недостаточной проверки входных данных / санитарную обработку.В этой статье I’ м присоединился мой коллега Петр (evilops) Ellehauge глядя на входную фильтрацию более подробно во время уборки на нескольких реальных примерах, что we’ видел в сети.Как you’ увидите на примерах ниже, недостаточной проверки входных может привести к различным видам внедрения кода в том числе XSS, а в некоторых случаях может быть использована для фишинга учетных данных пользователя или распространению malware.

Начнем с того, we’ возьму example [ 1] одной из самых обсуждаемых современных веб-сайтов.Этот пример с сайта на котором размещена WikiLeaks материалов.Обратите внимание, что обратный код конце представлено не фактический код, но то, что мы думаем, что это может быть основан на том, как эксплойт работает.HTML был взят с их сайта.Мы считаем, что it’ S справедливо предположить, что it’ S написана на PHP, как form’ действие с является index.php.

<form method='get' action='index.php'>
<input name="search" value="<?php echo $_GET['search'];?>" />
<input type=submit name='getdata' value='Search' /></form>

В этом коде параметр строки запроса search вторит обратно к пользователю без санитарной обработки.Злоумышленник может электронной почты или чата ничего не подозревающих пользователей созданный URL, что уходит из <input> и делает гадости с JavaScript.Самый простой способ проверить этот подвиг, не делая ничего вредоносного является использование URL вроде этого:

http://servername/index.php?search="><script>alert(0)</script>

Этот эксплойт работает, потому что PHP по умолчанию не имеет вход filtering, и разработчики haven’ т сделать любое из своих фильтрации.Этот подвиг будет работать так же хорошо и в большинстве других языков программирования, поскольку большинство из них также не хватает ввода по умолчанию фильтрации.Более безопасный способ, чтобы написать этот код выглядит следующим образом:

<?php
$search = filter_input(INPUT_POST | INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
?>
<form method='get' action='index.php'>
<input name="search" value="<?php echo $search;?>” />
<input type=submit name='getdata' value='Search' /></form>

Это менее удобно, хотя и требует код для каждого входного параметра используется, поэтому оно часто является хорошим выбором для установки special_chars, как PHP’ по умолчанию фильтр, а затем изменить при необходимости.Мы делаем это в PHP’ файл INI с, следующую директиву:

filter.default="special_chars"

We’ повторно не известно о подобных фильтров по умолчанию на других языках, но если вы знаете, любой, дайте нам знать в comments.

It’ Важно отметить, что простое добавление этого параметра PHP’ с INI-файл автоматически не делает ваше приложение безопасным.Это только берет по умолчанию случай, когда входной параметр передаваться обратно в HTML контекста.Тем не менее, веб-страница содержит много различных контекстах и ​​каждый из этих контекстов требует ввода быть подтверждено в различных way.

Является проверки входных данных достаточно

Недавно we’ ве наткнулся на следующееКод:

<?php
$name = "";
if ($_GET['name']) {
    $name = filter_input(INPUT_POST | INPUT_GET, 'name', FILTER_SANITIZE_SPECIAL_CHARS);
}
echo "<a href=login?name=$name>login</a>";
?>

Разработчик правильно применяет фильтрации входных данных, и этот код был рассмотрен и сделал в прямом эфире.Тем не менее, что-то маленькое, кажется, проскользнула.Разработчик hasn’ T использовал кавычки вокруг значения href атрибут, чтобы браузер предполагается, что его значение простирается до первого пробела.Созданный URL свидетельствует о проблеме:


http://servername/login.php?name=foo+onmouseover=alert(/bar/)

Все символы в имени являются безопасными и проходят через фильтр нетронутой, но в результате HTML выглядит следующим образом:

<a href=login?name=foo onmouseover=alert(/bar/)>login</a>

Отсутствие кавычек получается значение атрибута в onmouseover обработчик событий.Когда ничего не подозревающий пользователь мыши на ссылку, чтобы нажать на вход, onmouseover триггеров обработчик.Цитируя стоимость href атрибут решает проблему здесь.Это достаточно хорошая причина, чтобы привести все значения атрибутов, даже если они являются обязательными в соответствии с HTML spec.

<?php
$name = "";
if ($_GET['name']) {
    $name = filter_input(INPUT_POST | INPUT_GET, 'name', FILTER_SANITIZE_SPECIAL_CHARS);
}
echo "<a href=\"login?name=$name\">login</a>";
?>

Для данной конкретной ситуации, хотя, мы также должны смотреть на контекст.href атрибут принимает URL в качестве значения, поэтому значение передается она должна быть urlencoded, а также quoted.

http://xkcd.com/327/
Полная image (от XKCD)

Часто забывают sections

В то время как многие веб-разработчики правильно цитировать и проверки входных данных в содержимое страницы, мы находим, что некоторые разделы страницы по-прежнему забывают, возможно, потому, что они aren’ T воспринимается как проблема, или, возможно, they’ нас только что была упущена.Вот пример с сайта словаре Web:

<title><?php echo $word; ?> - Definitions and more ...</title>

Сейчас по умолчанию, браузер выполняет код в теги, поэтому разработчик, вероятно, думал, что это было безопасно для отображения данных необработанных в названии.Тщательно ввод данных может избежать теги заголовков и ввести скрипт что-то вроде this


http://servername/dictionary?word=</title><script>alert(/xss/)</script>

Другие часто забывают страниц ошибки страниц и сообщений об ошибках.Имеет ли ваша страница 404 эхом на экране неправильного URL, который был набран в?Если это так, то она должна относиться, что вход в первую очередь.Банковские сайте недавно был код, похожий на following [ 2] (они использовали ASP в данном случае):

<%
if Request.Querystring("errmsg") then
    Response.Write("<em>" & Request.QueryString("errmsg") & "</em>")
end if
%>

errmsg Параметр didn’ T поступают из формы, но с серверной перенаправление.Разработчики предполагали, что так как эта URL пришло с сервера было бы safe.

Реклама / аналитика разделов в нижней части страницы также часто не обрабатываются корректно.Может быть, потому, что шаблонный код предоставляется и он просто работает.Как показывает следующий пример из шоу туристический сайт, вы не должны доверять никому, в том числе и шаблонный код:

<script type="text/javascript">
google_afs_query = "<?php echo $_GET['query'];?>";
.
.
</script>

Это уязвимы к следующей строке атаки:

http://servername/?query=";alert(0)//

В этом случае ввод данных должно быть подтверждено для использования вНаличие контексте, поскольку that’ S, где данные эхом, чтобы.Что мета-символы вы сканировать в этом случае?Вы бы процитировать их или лишить их?Ответ на этот вопрос зависит от контекста, и только вы разработчик или владелец страницы знает, что правильный контекст is.

Различные contexts

Сейчас, как мы упоминали ранее, вход может быть использован в различных контекстах, и его нужно относиться по-разному в зависимости от контекста, что она будет использоваться дюйма Иногда данные будут использоваться в различных контекстах и ​​может потребовать, чтобы относиться по-разному длякаждом конкретном случае.Let’ посмотрим на несколько cases.

HTML Context

В контексте HTML, данные записываются в HTML-страницы как часть содержания, например, в <p> тег.Примеры включают в себя страницы результатов поиска, блогов системе комментариев, dictionary.com’ Слово дня и т.д. В этом контексте все символы HTML мета должны быть закодированы или удаляться.That’ S прежде всего < и >, но с использованием PHP’ S FILTER_SANITIZE_SPECIAL_CHARS, вероятно, безопаснее и FILTER_SANITIZE_STRIPPED, вероятно, самый безопасный.Убедитесь, что вы знаете, какой набор символов ваши данные в прежде чем пытаться кодировать it.

Там могут быть случаи, когда вы хотите, чтобы некоторые HTML-теги, например, в CMS инструмента или системе комментариев.Это вообще плохая идея, потому что есть другие способы получить это неправильно, чем получить это право.Например, let’ S сказать, что ваш блог система позволяет комментаторы для разметки свои комментарии с некоторыми простыми тегами, как <q> и <em>.Теперь счастливый комментатор приходит и добавляет следующий код в свой комментарий:

<q onmouseover="alert('xss')">...</q>

You’ нас только что была XSSed.Если вы собираетесь, чтобы подмножество тегов, а затем удалить все атрибуты из этих тегов.Лучше идея заключается в использовании CMS синтаксис, как BBCode, что ваша задняя часть можно перевести в безопасное tags.

Характеристики Context

В атрибута контекста, пользовательские данные включены в качестве значения атрибута HTML тегов.В зависимости от атрибута в вопросе, контекст может быть различным.Для не-обработчиков событий, все символы HTML мета должны быть закодированы.FILTER_SANITIZE_SPECIAL_CHARS работает и здесь.Кроме того, все значения атрибутов должны быть указаны использование одинарных или двойных кавычках или you’ буду бить, как в примерах above.

Для обработки событий атрибуты, как onmouseover onclick onfocus onblur или аналогичных, вам нужно быть более осторожным.Самый лучший совет, чтобы никогда не ставить входные данные непосредственно в обработчик событий.Let’ посмотрим на example.

<?php
  $n = filter_input(INPUT_GET, 'n', FILTER_SANITIZE_SPECIAL_CHARS);
?>
<input type="text" value="" name="n" onfocus="do_something('<?php echo $n; ?>');">

Выглядит безопасным, doesn’ ли?Что произойдет, если злоумышленник пытается выбраться из приведенных области с помощью одной цитаты, т. е. они используют URL like


http://servername/?n=foo');alert('xss

Вход продезинфицировать и все одинарные кавычки преобразуются в &#39;.К сожалению, это isn’ т достаточно.Обработчик событий выполняется в двух контекстах одна за другой.Данные на странице первый HTML декодируется, и результат передается в JavaScriptконтекста.Так, насколько обработчик JavaScript, то, ' и &#39; точно такие же, и это приводит к XSS hole.

Самое лучшее, что нужно сделать, это никогда не передавать входные данные непосредственно в событии handler — даже если она была обработана.It’ лучше хранить его в качестве значения скрытого поля, а затем пусть ваш обработчик вытащи …

Если вы хотите прочитать полностью статью, посетите сайт наших спонсоров

Comments are closed.