|
Оглавление
|
Пакет django.contrib.csrf защищает от атак типа «подделка HTTP запросов» (Cross-Site Request Forgery), далее CSRF. CSRF, также известная как «session riding» FIXME, является дырой в системе безопасности веб сайта. Она случается когда вредоносный сайт заставляет пользователя, незаметно для него, загрузить URL с сайта, на котором пользователь уже авторизован. Это непросто понять сначала, поэтому мы разберём пару примеров. Допустим вы зашли в свою почту на сайте example.com. Интерфейс почтовой системы имеет кнопку , которая вызывает URL example.com/logout. Таким образом для того, чтобы выйти из своей почты достаточно посетить страницу example.com/logout. Вредоносный сайт может заставить вас посетить URL example.com/logout с помощью скрытого тега <iframe> на своей странице. Таким образом, если вы были авторизованы на почтовом интерфейсе example.com и посетили вредоносную страницу, которая выполнила через <iframe> обращение к example.com/logout, ваша авторизация на почтовом интерфейсе будет прекращена. Очевидно, что выход из почтового интерфейса вопреки вашей воли не является ужасающем нарушением безопасности, но этот же подход может использоваться для любого сайта, который «доверяет» своим посетителям, например, сайт банка или электронного алгоритма. В предыдущем примере сайт example.com был частично скомпрометирован, потому что он позволял изменять состояние (т.е. отменять авторизацию пользователя) через GET запрос. Более практично требовать POST запрос для изменения состояния на сайте. Но даже это не спасёт полностью от CSRF. Предположим, что на сайте example.com провели обновление функциональность и теперь для отмены авторизации пользователя требуется нажать кнопку на форме, которая отправит POST запрос к example.com/logout. Более того, форма содержит скрытое поле: <input type="hidden" name="confirm" value="true" />
Это даёт гарантию, что обычный POST запрос к
example.com/logout не отменит авторизацию
пользователя, для этого ещё должна передаваться переменная
Несмотря на дополнительную безопасность этот механизм всё ещё может быть скомпрометирован CSRF — вредоносной странице просто потребуется сделать чуть больше работы. Атакующие могут создать целую форму для вашего сайта, спрятав её в невидимом <iframe>, а затем использовать JavaScript для автоматической отправки этой формы. Как может ваш сайт защитить себя от этого типа атак? Первым шагом будет проверка того, что все GET запросы не содержат побочные эффекты. Затем, если вредоносный сайт включает одну из ваших страниц в <iframe>, это не будет приводить к негативному эффекту. Остались POST запросы. Вторым шагом будет добавление в каждую форму скрытого поля, значение которого генерируется из идентификатора пользователя. Затем, при обработки формы на стороне сервера, следует проверять это поле и выдавать ошибку, если проверка не удастся. Именно это и делает Django для предотвращения CSRF. А подробности далее.
Пакет django.contrib.csrf содержит только один модуль —
Для активации защиты от CSRF следует добавить django.contrib.csrf.middleware.CsrfMiddleware в параметр MIDDLEWARE_CLASSES вашего файла конфигурации. Этот модуль нужен для обработки отклика после SessionMiddleware, таким образом CsrfMiddleware должен быть помещён до SessionMiddleware в списке (потому что классы при обработки отклика применяются от конца списка к началу). Также следует обрабатывать отклик до его компрессии или других изменений. Таким образом, CsrfMiddleware должно быть указано после GZipMiddleware. Обратитесь к секции «Порядок в MIDDLEWARE_CLASSES».
Если вам интересно, то вот как класс
Такой подход гарантирует, что будут приняты во внимание только формы с вашего сайта. Данный класс умышленно нацелен только на POST запросы (и соответствующие формы с методами POST). Как мы объясняли, GET запросы не могут иметь побочных эффектов, проверить это — ваша задача. POST запросы, не использующие механизм сессий, не защищаются. Их и не надо защищать, потому что вредоносные сайты могут выполнить такой запрос в любом случае. Чтобы исключить внесение изменений в не-HTML запросы класс проверяет заголовок Content-Type отклика перед его модификацией. Только страницы с типами text/html или application/xml+xhtml подвергаются обработке.
Класс
Если ваше приложение создаёт HTML страницы и формы необычным
способом (т.е., если оно отправляет фрагменты HTML в
JavaScript оператор document.write), вы
можете пропустить фильтр, который добавляет скрытое поле к
форме. В этом случае отправка формы всегда будет
неудачна. (Это будет происходить, потому что класс
Для получения информации по CSRF обратитесь к http://en.wikipedia.org/wiki/CSRF. |
Увидели ошибку?
Выделите её мышкой и нажмите
-
Обработано:
1049
49
130
71
Версия книги
1.0
2.0
Версия 2.0 в процессе перевода!
Мой луч
Многообразие света
Полезное
Актуальные вакансии,
Python работа
для python-разработчиков.
Скачать в формате
CHM от 2 сентябряЗаказать PDF файл можно через почту, чат, джаббер. Всего 2WMZ. Содержимое точно соответствует содержимому сайта. Чем чаще заказываете — тем больше перевожу. Русская группа
Ускорить процесс перевода!
R130494980980
Z425285133788 E112528079659 U327380922061 Книга помогла реализовать:
|
| © 2008-2009 Ruslan Popov @ gmail.com | Powered by Django 1.1 beta 1 SVN-11114 |