Распространенные ошибки безопасности в приложениях laravel

«Непростые» запросы

Мы можем использовать любой HTTP-метод: не только , но и , и другие.

Некоторое время назад никто не мог даже предположить, что веб-страница способна делать такие запросы. Так что могут существовать веб-сервисы, которые рассматривают нестандартный метод как сигнал: «Это не браузер». Они могут учитывать это при проверке прав доступа.

Поэтому, чтобы избежать недопониманий, браузер не делает «непростые» запросы (которые нельзя было сделать в прошлом) сразу. Перед этим он посылает предварительный запрос, спрашивая разрешения.

Предварительный запрос использует метод , у него нет тела, но есть два заголовка:

  • содержит HTTP-метод «непростого» запроса.
  • предоставляет разделённый запятыми список его «непростых» HTTP-заголовков.

Если сервер согласен принимать такие запросы, то он должен ответить без тела, со статусом 200 и с заголовками:

  • должен содержать разрешённые методы.
  • должен содержать список разрешённых заголовков.
  • Кроме того, заголовок может указывать количество секунд, на которое нужно кешировать разрешения. Так что браузеру не придётся посылать предзапрос для последующих запросов, удовлетворяющих данным разрешениям.

Этот запрос не является простым по трём причинам (достаточно одной):

  • Метод
  • не один из: , , .
  • Содержит «непростой» заголовок .

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

  • Метод: .
  • Путь – точно такой же, как в основном запросе: .
  • Особые заголовки:
    • – источник.
    • – запрашиваемый метод.
    • – разделённый запятыми список «непростых» заголовков запроса.

Сервер должен ответить со статусом 200 и заголовками:

  • .

Это разрешит будущую коммуникацию, в противном случае возникает ошибка.

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

Теперь, когда браузер видит, что есть в , а – в списке , он посылает наш основной запрос.

Кроме того, ответ на предзапрос кешируется на время, указанное в заголовке (86400 секунд, один день), так что последующие запросы не вызовут предзапрос. Они будут отосланы сразу при условии, что соответствуют закешированным разрешениям.

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

Основной запрос имеет заголовок (потому что он идёт на другой источник):

Сервер не должен забывать о добавлении к ответу на основной запрос. Успешный предзапрос не освобождает от этого:

После этого JavaScript может прочитать ответ сервера.

Предзапрос осуществляется «за кулисами», невидимо для JavaScript.

JavaScript получает только ответ на основной запрос или ошибку, если со стороны сервера нет разрешения.

6 ответов

Лучший ответ

Нет, Greasemonkey не устанавливает этот заголовок (хотя вы, конечно, можете добавить его).

Запрос по умолчанию, отправленный , выглядит так же, как обычный запрос браузера. Например:

Для моего сниффера пакетов это выглядит так:

3

Brock Adams
30 Июл 2010 в 16:57

Решение для удаления заголовка в jQuery, предложенное @vamp, находится на правильном пути, но, как утверждали другие, оно все равно приведет к отправке пустого заголовка X-Requested-With.

Обратный вызов beforeSend получает объект XHR jQuery (jqXHR), а не фактический объект XMLHttpRequest (xhr), который даже не создается до тех пор, пока не будет вызван beforeSend.

Метод setRequestHeader в jqXHR добавляет заголовки к объекту, который затем повторяется позже с использованием метода xhr с тем же именем, сразу после добавления записи X-Requested-With в объект заголовков.

Вот часть jQuery, где это происходит:

Это приводит к проблеме: если вы не укажете заголовок X-Requested-With, тогда jQuery будет (если параметр crossDomain не оценивает false, но это может быть не желаемое решение). Затем он немедленно устанавливает заголовки xhr, которые нельзя сбросить.

Чтобы предотвратить отправку заголовка X-Requested-With с помощью jQuery.ajax:

JQuery.ajax предоставляет параметр xhr, который переопределяет встроенный фабричный метод jQuery для создания объекта XMLHttpRequest. Обернув этот фабричный метод, а затем обернув собственный метод браузера setRequestHeader, можно игнорировать вызов из jQuery для установки заголовка X-Requested-With.

29

Synexis
13 Июл 2014 в 03:58

Почему нет? пытаться:

Удачи!

7

vamp
9 Мар 2011 в 06:48

Чтобы сделать это с помощью jQuery, установите ваш запрос как междоменный. Пример:

server.php

client.js

7

f.ardelian
8 Мар 2014 в 23:08

JQuery на данный момент не предоставляет метода для этого, некоторое время назад был тикет связаны с ошибками Firefox, но вместо того, чтобы сделать это опцией, они исправили проблему с ошибкой в ​​Firefox.

Если вам интересно, вы можете увидеть, где он здесь добавлен, но вы не можете удалить его, не отредактировав / переопределив ядро ​​jQuery: .

Nick Craver
30 Июл 2010 в 15:31

Вы можете подумать об этом:

-2

Marin Purgar
17 Ноя 2011 в 09:52

Принцип CSRF

Следующий рисунок кратко иллюстрирует идею атаки CSRF

Рисунок 9.1 Процесс атаки CSRF

Как видно из приведенного выше рисунка, для завершения атаки CSRF жертва должна выполнить два шага по порядку:

  • 1. Войдите на доверенный веб-сайт A и создайте файлы cookie локально.

  • 2. Посетите опасный веб-сайт B, не выходя из A.

Видя это, читатели могут спросить: «Если я не выполню ни одно из двух вышеуказанных условий, CSRF не подвергнется нападению». Да, это так, но вы не можете гарантировать, что следующее не произойдет:

  • Вы не можете гарантировать, что после входа на веб-сайт вы больше не будете открывать вкладку и посещать другой веб-сайт, особенно теперь, когда браузеры поддерживают мульти-вкладки.

  • Вы не можете гарантировать, что после того, как вы закроете свой браузер, ваши локальные куки-файлы немедленно истечут и ваш последний сеанс завершится.

  • Так называемый сайт атаки на изображении выше может быть надежным и часто посещаемым сайтом с другими уязвимостями.

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

CSRF-атака в основном происходит из-за неявного механизма аутентификации в Интернете. Хотя механизм аутентификации в Интернете может гарантировать, что запрос поступает из браузера пользователя, он не может гарантировать, что запрос был отправлен с одобрения пользователя.

X-Frame-Options

Clickjacking — это метод, при котором злоумышленник обманывает вашего пользователя, заставляя его щелкнуть на что-то на вашем сайте. Обычно это делается путем встраивания вашего сайта в <iframe> на сайте злоумышленника.

Например, см. пост в блоге Троя Ханта. В нем описывается банковское приложение, прозрачно размещенное в рамке перед кнопкой «Win an iPad». Когда пользователь пытается получить приз, он нажимает кнопку «перевести деньги» на веб-сайте банка.

Существуют различные методы предотвращения clickjacking, но лучше всего добавить параметр X-Frame-Options в заголовке. Это позволит отключить ваш сайт в случае использование его в <iframe> или только в списке разрешенных доверенных доменов.

Этот заголовок также встроен в Django. Вы увидите security.W002, если у вас нет middleware, или security.W019, если у вас значение этого параметра не установлено в DENY.

Включение X-Frame-Options:

  1. Вам нужно прописать django.middleware.clickjacking.XFrameOptionsMiddleware в настройках MIDDLEWARE как можно выше. По умолчанию это уже прописано в шаблоне startproject.
  2. Установите X_FRAME_OPTIONS = ‘DENY’ в вашем settings.py

Существуют дополнительные параметры для включения определенных доменов в <iframe> вашего сайта или для отключения защиты для определенных вьюх. Смотрите подробнее в документации по Django Clickjacking Protection.

Как работает подделка межсайтовых запросов

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

Вот пример 4 шага в атаке «подделка межсайтовых запросов»:

  1. Злоумышленник создает поддельный запрос, который при запуске переводит $10 000 из определенного банка на его счет.
  2. Злоумышленник вставляет поддельный запрос в гиперссылку и отправляет его в массовых электронных письмах, а также встраивает его в веб-сайты.
  3. Жертва нажимает на электронную почту или ссылку на веб-сайте, размещенную злоумышленником, в результате чего жертва обращается в банк с просьбой перевести $10,000.
  4. Банковский сервер получает запрос, и поскольку жертва должным образом авторизована, он рассматривает запрос как законный и переводит средства.

CSRF-атаки различаются по методологии, но обычно имеют следующие характеристики:

  • Они используют веб-сайты, которые полагаются на удостоверение пользователя;
  • Они обманом заставляют браузер пользователя отправлять HTTP-запросы на целевой сайт;
  • Они включают использование запросов HTTP, которые имеют побочные эффекты и не имеют надлежащей защиты CSRF на сайте.

Различные команды HTTP имеют различную уязвимость к атакам CSRF, что приводит к различным стратегиям защиты. Это связано с тем, как веб-браузеры обрабатывают запросы.

Запросы HTTP GET имеют встроенные параметры, такие как внутренние теги изображений, которыми можно управлять и использовать. Как правило, запросы GET не изменяют состояние, что делает их неэффективными как цели CSRF для должным образом реализованного веб-приложения или другого ресурса.

HTTP POST используется для изменения состояния, что приводит к увеличению потребности в защите. С этой целью веб-браузеры реализуют меры безопасности, называемые одной и той же исходной политикой (SOP) и общим доступом к ресурсам (CORS), который содержит политику безопасности перекрестного источника. SOP позволяет только запросы от того же источника и CORS позволяет только определенные типы запросов, чтобы прибыть из другого источника. Сочетание этих реализаций помогает предотвратить атаки CSRF (среди прочих), ограничивая способность запроса или веб-страницы взаимодействовать с другим источником.

Другие команды HTTP, такие как PUT и DELETE, могут быть запущены только с помощью SOP и CORS, что уменьшает количество межсайтовых атак. Хотя это редко, некоторые веб-сайты будут явно отключать эти меры безопасности, и их также можно отключить внутри веб-браузера.

КЭШИРОВАНИЕ ДИНАМИЧЕСКОГО СОДЕРЖИМОГО С ПОМОЩЬЮ VARNISH

Varnish – один из самых популярных HTTP-ускорителей и обратных прокси-серверов, используемых сегодня. Он ориентирован исключительно на HTTP и предназначен для ускорения динамических веб-сайтов с большим количеством контента. 

Varnish Cache использует язык конфигурации, зависящий от предметной области, который называется Varnish Configuration Language (VCL) . Если вы знакомы с языком программирования C, вы обнаружите, что VCL похож. Это очень гибкий язык, который дает вам возможность тестировать и внедрять Varnish так, как вы хотите.

Например, если вы хотите, чтобы Varnish Cache игнорировал запросы AJAX, вот как вы это реализуете:

Точно так же, если вы хотите указать Varnish Cache пропускать кэширование экранов администратора WordPress и редактировать страницы, вам необходимо добавить следующий фрагмент кода VCL в свой файл конфигурации.

Давайте начнем с лакирования вашего сайта WordPress!

Если ваш веб-сервер работает на Ubuntu, вот краткое руководство по установке и настройке Varnish . Кроме того, вы также можете пройти это пошаговое руководство, чтобы  . 

После того, как вы настроили свой сервер для использования Varnish для кэширования контента, вы можете указать WordPress позаботиться обо всем остальном. Сайты WordPress со статическим контентом не нуждаются в особой настройке. Существует множество вспомогательных плагинов, которые помогут вам еще больше оптимизировать конфигурацию Varnish Cache. Вот некоторые из моих любимых: 

Очистка кеша прокси

Каждый раз, когда вы изменяете сообщение или страницу на своем веб-сайте, Proxy Cache Purge автоматически отправляет запрос PURGE от имени URL-адреса. Например, когда вы редактируете, публикуете или удаляете сообщение, Proxy Cache Purge автоматически очищает старый кеш. То же самое относится к комментированию сообщения или изменению темы вашего сайта. 

Вы можете изменить конфигурацию вашего Varnish Cache, чтобы пропустить определенные страницы из кеша.

Кэш WPBase

WPBase Cache – это специальный плагин, который оптимизирует развертывание WordPress на серверном стеке, состоящем из varnish + nginx + php-fpm + php-apc . Он использует три типа кеша для перезарядки вашего веб-сайта: кеш полной страницы, кеш БД и кеш кода операции. 

Этот плагин также интегрирует код из вспомогательных плагинов nginx-compatibility и db-cache-reloaded-fix . Это исправления для nginx и кеша базы данных соответственно.  

WPBase Cache также поддерживает настройку Varnish Cache с помощью предоставленного файла default.vcl . Вы можете узнать больше о функциях и преимуществах WPBase Cache на его веб-сайте.

Дополнение WP Rocket + Varnish

Надстройка WP Rocket Varnish позволяет одновременно очищать кеш Varnish и WP Rocket. Помимо обеспечения взаимодействия без возникновения каких-либо конфликтов, надстройка также гарантирует, что контент, предоставляемый вашим пользователям, всегда актуален.

Дополнение Varnish для WP Rocket

Установив надстройку Varnish, вы можете расслабиться, зная, что и Varnish, и WP Rocket совместимы друг с другом и могут работать вместе.

Мы закончили настройку Varnish Cache для кеширования и обслуживания статического контента. Но как насчет кеширования динамического контента? Решение состоит в том, чтобы использовать модули Varnish (VMOD) для расширения возможностей Varnish Cache.

Новые XBody и Edgestash VMOD от Varnish 6.0 позволяют с легкостью кэшировать и ускорять динамический контент. 

XBody VMOD собирает весь динамический контент с веб-страницы и анализирует его в формате обмена данными JSON и веб-шаблоне Mustache. 

Позже Edgestash VMOD собирает данные JSON и шаблон Mustache, а затем повторно объединяет их в новый ответ. Вы можете ознакомиться с документацией Varnish Software по  чтобы узнать больше о том, как это делается. 

Входной фильтр

Обнаружение всех вводимых пользователем данных, таких как фильтрация специальных символов, таких как «<», «>» и «/», которые могут вызвать внедрение сценария, или фильтрация ключевых слов сценария, таких как «сценарий», «javascript» или ввод Длина данных ограничена и так далее. В то же время мы также должны учитывать, что пользователи могут обходить код ASCII и использовать шестнадцатеричную кодировку для входа в сценарий. Следовательно, нам также необходимо отфильтровать шестнадцатеричный код, вводимый пользователем. Пока каждая точка взаимодействия может быть строго обнаружена, и все возможные действия пользователя могут быть обнаружены и отфильтрованы XSS, атаки XSS могут быть эффективно предотвращены.

Фишинговые атаки

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

После введения приведенного выше кода на исходную страницу будет вставлена ​​форма, в которой пользователю будет предложено ввести свое имя пользователя и пароль, и когда пользователь нажмет кнопку «Войти», функция hack () будет выполнена для отправки ввода пользователя. Перейдите на сайт, указанный злоумышленником. Таким образом, злоумышленник успешно украл данные учетной записи пользователя. В отличие от обычных фишинговых атак, фишинговые атаки под управлением XSS изменяют веб-страницы, которым доверяют пользователи.

Anti-CSRF токены для формы входа

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

  1. Злоумышленник создает учетную запись на вашем сайте.
  2. Злоумышленник обманом заставляет жертву войти на ваш сайт, используя свои учетные данные (это возможно, если для формы входа нет защиты CSRF).
  3. Жертва использует ваш веб-сайт и может не осознавать, что вошла в систему под другим пользователем.
  4. Злоумышленник может следить за жертвой с помощью функции истории или каким-либо другим способом и таким образом получить выгоду от использования жертвой вашего сайта.

По этим причинам рекомендуется также включать anti-CSRF токены на все страницы входа.

Ответ (Response)

class Cake\Http\Response

Cake\Http\Response — это класс ответа по умолчанию в CakePHP. Он объединяет в себе определенный функционал для генерации HTTP ответов приложения. Cake\Http\Response также помогает при тестировании, поскольку его можно обойти/пропустить, для проверки заголовков, которые будут отправлены. Подобно Cake\Http\ServerRequest, Cake\Http\Response объединяет ряд методов, ранее относящихся к контроллеру: RequestHandlerComponent и Dispatcher. Старые методы устарели в пользу использования Cake\Http\Response.

Response предоставляет интерфейс для объединения задач, связанных с ответом, таких как:

  • Отправка заголовков для перенаправления;
  • Отправка content type заголовков;
  • Отправка прочих заголовков;
  • Отправка тела ответа.

Работа с типами контента

Cake\Http\Response::withType($contentType = null)

Вы можете управлять Content-Type в ответах приложения с помощью Cake\Http\Response::withType(). Если приложению нужно иметь дело с Content-Types, которые не встроены в Response, их можно также сопоставить с type():

Обычно необходимо отображать дополнительные Content-Type в обратном вызове beforeFilter() контроллера, для этого можно использовать функции автоматического переключения вида , при его использовании.

Отправка файлов

Cake\Http\Response::withFile($path, $options = [])

Бывают случаи, когда необходимо отправлять файлы в качестве ответов на запросы. Это можно делать, используя Cake\Http\Response::withFile():

Как показано в приведённом выше примере, необходимо в метод передать путь к файлу. CakePHP отправит соответствующий заголовок типа контента, если это известный тип файла, указанный в Cake\Http\Reponse::$_mimeTypes. Вы можете добавлять новые типы до вызова Cake\Http\Response::withFile() с помощью метода Cake\Http\Response::withType().

Также можно принудительно загрузить файл вместо отображения страницы в браузере, указав параметры:

Поддерживаемые параметры:

  • name — позволяет указать альтернативное имя файла для отправки пользователю;
  • download — логическое значение, указывающее, следует ли устанавливать заголовки для принудительной загрузки.

Отправка строки в виде файла

Так же, можно ответить файлом, который не существует на диске, например, pdf или ics, сгенерированным «на лету» из строки:

Обратные вызовы также могут возвращать тело в виде строки:

Настройка заголовков

Cake\Http\Response::withHeader($header, $value)

Настройка заголовков выполняется с помощью метода Cake\Http\Response::withHeader(). Как и все методы интерфейса PSR-7, этот метод возвращает экземпляр new с новым заголовком:

Заголовки не отправляются при установке. Вместо этого они сохраняются до тех пор, пока не будет получен ответ Cake\Http\Server.

Теперь вы можете использовать удобный метод Cake\Http\Response::withLocation(), чтобы напрямую установить или получить заголовок местоположения перенаправления.

Настройка body

Cake\Http\Response::withStringBody($string)

Чтобы установить строку в качестве тела ответа, необходимо выполнить следующие действия:

Кодировка multipart/form-data

Кодировка urlencoded за счёт замены символов на может сильно «раздуть» общий объём пересылаемых данных. Поэтому для пересылки файлов используется другая кодировка: multipart/form-data.

В этой кодировке поля пересылаются одно за другим, через строку-разделитель.

Чтобы использовать этот способ, нужно указать его в атрибуте и метод должен быть POST:

Форма при такой кодировке будет выглядеть примерно так:

…То есть, поля передаются одно за другим, значения не кодируются, а чтобы было чётко понятно, какое значение где – поля разделены случайно сгенерированной строкой, которую называют «boundary» (англ. граница), в примере выше это :

Сервер видит заголовок , читает из него границу и раскодирует поля формы.

Такой способ используется в первую очередь при пересылке файлов, так перекодировка мегабайтов через urlencoded существенно загрузила бы браузер. Да и объём данных после неё сильно вырос бы.

Однако, никто не мешает использовать эту кодировку всегда для POST запросов. Для GET доступна только urlencoded.

FileResponseобъекты ¶

class ( open_file , as_attachment = False , filename = » , ** kwargs )

является подклассом,
оптимизированным для двоичных файлов. Оно использует если предоставляется сервером wsgi, в противном случае он передает файл небольшими порциями.
Если установлен заголовок
, который просит браузер предложить файл пользователю для загрузки. В противном случае заголовок со значением
(по умолчанию для браузера) будет установлен только в том случае, если имя файла доступно.
Если имени нет или имя не подходит, укажите пользовательское имя файла с помощью параметра

Обратите внимание, что если вы передадите объект в виде файла, например , это ваша задача, прежде чем передать его в .
И заголовки автоматически устанавливается , когда они могут быть угаданы от содержания .

принимает любой файловый объект с двоичным содержимым, например файл, открытый в двоичном режиме, например:

>>> from django.http import FileResponse
>>> response = FileResponse(open('myfile.png', 'rb'))

Файл будет закрыт автоматически, поэтому не открывайте его с помощью диспетчера контекста.

Что такое кликджекинг?

Цель атаки с использованием кликджекинга — заставить ничего не подозревающих посетителей сайта выполнить действия на другом сайте (целевом сайте). Например, пользователя может привлечь веб-сайт, который обещает ему исключительный приз. Когда пользователь нажимает кнопку, чтобы принять приз, его щелчок вместо этого используется для покупки товара на веб-сайте электронной коммерции. Обычно эта атака выполняется путем сокрытия пользовательского интерфейса целевого веб-сайта и организации видимого пользовательского интерфейса таким образом, чтобы пользователь не знал, что щелкнул целевой веб-сайт. Из-за такого расположения пользовательского интерфейса этот вид атаки также известен как атака UI redressing или UI redress attack.

Из-за этого обмана пользователь невольно выполняет такие операции, как перевод денег, покупка продуктов, загрузка вредоносных программ, предоставление лайков в социальной сети и т. д. Но как это работает?

ЗАКЛЮЧЕНИЕ

Кэширование больше не только для статических или событийно-ориентированных сайтов. Выше вы видели множество вариантов кеширования высокодинамичных сайтов WordPress. Хотя изначально требуется некоторая настройка и доработка, конечный результат стоит затраченных усилий. Кэширование динамического контента помогает вам улучшить время до первого байта вашего сайта (TTFB), снизить расходы на хостинг, улучшить SEO и повысить коэффициент конверсии.

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

И если вы хотите пойти дальше, WP Rocket готов к работе с большинством решений кэширования на уровне сервера, обсуждаемых в этой статье. Пришло время зарядить ваш сайт WP Rocket!

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: