Как найти csrf токен

Как получить CSRF токен с сайта https://fix-price.ru/personal/ для парсинга данных из личного кабинета?

import requests
from bs4 import BeautifulSoup
import fake_useragent


HOST = 'https://fix-price.ru/'
link = 'https://fix-price.ru/ajax/auth_user.php'

HEADERS = {
    'accept': 'application/json, text/javascript, */*; q=0.01',
    'accept-encoding': 'gzip, deflate, br',
    'accept-language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
    'referer': 'https://fix-price.ru/personal/',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36',
    'x-kl-ajax-request': 'Ajax_Request'
}

# session = requests.Session()
# resp = session.get(link, headers=HEADERS)
# soup = BeautifulSoup(resp.text, 'lxml')
# csrf = soup.find('input', {'name': 'csrfToken'})

client = requests.Session()

html = client.get(link)
soup = BeautifulSoup(html.text, 'lxml')
# soup = BeautifulSoup(client.get(link).text, "html.parser")
csrf = soup.find('input', {'name': 'csrfToken'})

data = {
    'AUTH_FORM': 'Y',
    'TYPE': 'AUTH',
    'backurl': '/personal/',
    'auth_method': 'phone',
    'login': '*****',
    'password': '*****',
    'CSRF': csrf
}

session = requests.Session()
user = fake_useragent.UserAgent().random

header = {
    'user-agent': user
}

response = session.post(link, data=data, headers=header).text

В общем это мой первый код,столкнулся с проблемой,что на сайте где мне нужна авторизация есть csrf токен
Строка в HTML выглядит так:

<meta name="csrf-token" content="LEHb0gOOweqUBc6dBfMmqAW5VN9y9tTXEep1AGIhsL1OMYyfQvqtvtlu-MdKhm3nbcktiiagnockvgBjGm3jzw==">

мне нужно эту строку с токеном найти в моем коде и вставить

import requests
from bs4 import BeautifulSoup






file = open('1.txt').read().split('n')



url = 'https://fastmoney.ru/auth/login'


headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}

session = requests.Session()
session.headers.update(headers)


r = session.get(url)
soup = BeautifulSoup(r.content, 'html.parser')


csrf = soup.find('meta', {'name': 'csrf-token'})['content']



for account in file:
	username = account.split(":")[0]
	password = account.split(":")[1]

	resp = requests.post(url, data = {'_csrf': csrf, 'LoginForm[login]': username, 'LoginForm[password]': password,})

Первый раз занимаюсь этим,поэтому не бейте сильно.Думаю для знающих будет очень просто помочь мне)

  • Введение
  • Предотвращение запросов CSRF

    • Исключение URI из защиты от CSRF
  • Токен X-CSRF
  • Токен X-XSRF

Введение

Межсайтовая подделка запроса – это разновидность вредоносного эксплойта, при котором неавторизованные команды выполняются от имени аутентифицированного пользователя. К счастью, Laravel позволяет легко защитить ваше приложение от Межсайтовой подделки запроса (Cross Site Request Forgery – CSRF).

Объяснение уязвимости

Если вы не знакомы с Межсайтовой подделкой запросов, то давайте обсудим пример того, как можно использовать эту уязвимость. Представьте, что ваше приложение имеет маршрут /user/email, который принимает POST-запрос для изменения адреса электронной почты аутентифицированного пользователя. Скорее всего, этот маршрут ожидает, что поле ввода email будет содержать адрес электронной почты, который пользователь хотел бы начать использовать.

Без защиты от CSRF вредоносный веб-сайт может создать HTML-форму, которая указывает на маршрут вашего приложения /user/email и отправляет собственный адрес электронной почты злоумышленника:

<form action="https://your-application.com/user/email" method="POST">
    <input type="email" value="malicious-email@example.com">
</form>

<script>
    document.forms[0].submit();
</script>

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

Чтобы предотвратить эту уязвимость, нам необходимо проверять каждый входящий запрос POST, PUT, PATCH, или DELETE на секретное значение сессии, к которому вредоносное приложение не может получить доступ.

Предотвращение запросов CSRF

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

К CSRF-токену текущей сессии можно получить доступ через сессию запроса или с помощью глобального помощника csrf_token:

use IlluminateHttpRequest;

Route::get('/token', function (Request $request) {
    $token = $request->session()->token();

    $token = csrf_token();

    // ...
});

Каждый раз, когда вы создаете HTML-форму «POST», «PUT», «PATCH» или «DELETE» в своем приложении, вы должны включать в форму скрытое поле _token CSRF, чтобы посредник CSRF мог проверить запрос. Для удобства вы можете использовать директиву Blade @csrf для создания скрытого поля ввода, содержащего токен:

<form method="POST" action="/profile">
    @csrf

    <!-- Эквивалентно ... -->
    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>

Посредник AppHttpMiddlewareVerifyCsrfToken, который по умолчанию стоит в группе посредников web, автоматически проверяет соответствие токена во входном запросе и токен, хранящийся в сессии. Когда эти два токена совпадают, мы знаем, что запрос инициирует аутентифицированный пользователь.

CSRF-токены и SPA-приложения

Если вы создаете SPA, который использует Laravel в качестве серверной части API, вам следует обратиться к документации Laravel Sanctum для получения информации об аутентификации с помощью вашего API и защите от уязвимостей CSRF.

Исключение URI из защиты от CSRF

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

Как правило, вы должны размещать эти виды маршрутов вне группы посредников web, которую AppProvidersRouteServiceProvider применяет ко всем маршрутам в файле routes/web.php. Однако, вы также можете исключить маршруты, добавив их URI в свойство $except посредника VerifyCsrfToken:

<?php

namespace AppHttpMiddleware;

use IlluminateFoundationHttpMiddlewareVerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware
{
    /**
     * URI, которые следует исключить из проверки CSRF.
     *
     * @var array
     */
    protected $except = [
        'stripe/*',
        'http://example.com/foo/bar',
        'http://example.com/foo/*',
    ];
}

Для удобства посредник CSRF автоматически отключается для всех маршрутов при выполнении тестов.

Токен X-CSRF

В дополнение к проверке токена CSRF в качестве параметра POST-запроса посредник AppHttpMiddlewareVerifyCsrfToken также проверяет заголовок запроса X-CSRF-TOKEN. Вы можете, например, сохранить токен в HTML-теге meta:

<meta name="csrf-token" content="{{ csrf_token() }}">

Затем, вы можете указать библиотеке, такой как jQuery, автоматически добавлять токен во все заголовки запросов. Это обеспечивает простую и удобную защиту от CSRF для ваших приложений с использованием устаревшей технологии JavaScript на основе AJAX:

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

Токен X-XSRF

Laravel хранит текущий токен CSRF в зашифрованном файле Cookies XSRF-TOKEN, который содержится в каждом ответе, генерируемым фреймворком. Вы можете использовать значение Cookies для установки заголовка запроса X-XSRF-TOKEN.

Этот файл Cookies, в первую очередь, отправляется для удобства разработчика, поскольку некоторые фреймворки и библиотеки JavaScript, такие, как Angular и Axios, автоматически помещают его значение в заголовок X-XSRF-TOKEN в запросах с одним и тем же источником.

По умолчанию файл resources/js/bootstrap.js включает HTTP-библиотеку Axios, которая автоматически отправляет заголовок X-XSRF-TOKEN.

How to use Django’s CSRF protection¶

To take advantage of CSRF protection in your views, follow these steps:

  1. The CSRF middleware is activated by default in the MIDDLEWARE
    setting. If you override that setting, remember that
    'django.middleware.csrf.CsrfViewMiddleware' should come before any view
    middleware that assume that CSRF attacks have been dealt with.

    If you disabled it, which is not recommended, you can use
    csrf_protect() on particular views
    you want to protect (see below).

  2. In any template that uses a POST form, use the csrf_token tag inside
    the <form> element if the form is for an internal URL, e.g.:

    <form method="post">{% csrf_token %}
    

    This should not be done for POST forms that target external URLs, since
    that would cause the CSRF token to be leaked, leading to a vulnerability.

  3. In the corresponding view functions, ensure that
    RequestContext is used to render the response so
    that {% csrf_token %} will work properly. If you’re using the
    render() function, generic views, or contrib apps,
    you are covered already since these all use RequestContext.

Using CSRF protection with AJAX¶

While the above method can be used for AJAX POST requests, it has some
inconveniences: you have to remember to pass the CSRF token in as POST data with
every POST request. For this reason, there is an alternative method: on each
XMLHttpRequest, set a custom X-CSRFToken header (as specified by the
CSRF_HEADER_NAME setting) to the value of the CSRF token. This is
often easier because many JavaScript frameworks provide hooks that allow
headers to be set on every request.

First, you must get the CSRF token. How to do that depends on whether or not
the CSRF_USE_SESSIONS and CSRF_COOKIE_HTTPONLY settings
are enabled.

Acquiring the token if CSRF_USE_SESSIONS and CSRF_COOKIE_HTTPONLY are False

The recommended source for the token is the csrftoken cookie, which will be
set if you’ve enabled CSRF protection for your views as outlined above.

The CSRF token cookie is named csrftoken by default, but you can control
the cookie name via the CSRF_COOKIE_NAME setting.

You can acquire the token like this:

function getCookie(name) {
    let cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        const cookies = document.cookie.split(';');
        for (let i = 0; i < cookies.length; i++) {
            const cookie = cookies[i].trim();
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
const csrftoken = getCookie('csrftoken');

The above code could be simplified by using the JavaScript Cookie library to replace getCookie:

const csrftoken = Cookies.get('csrftoken');

Note

The CSRF token is also present in the DOM in a masked form, but only if
explicitly included using csrf_token in a template. The cookie
contains the canonical, unmasked token. The
CsrfViewMiddleware will accept either.
However, in order to protect against BREACH attacks, it’s recommended to
use a masked token.

Warning

If your view is not rendering a template containing the csrf_token
template tag, Django might not set the CSRF token cookie. This is common in
cases where forms are dynamically added to the page. To address this case,
Django provides a view decorator which forces setting of the cookie:
ensure_csrf_cookie().

Setting the token on the AJAX request¶

Finally, you’ll need to set the header on your AJAX request. Using the
fetch() API:

const request = new Request(
    /* URL */,
    {
        method: 'POST',
        headers: {'X-CSRFToken': csrftoken},
        mode: 'same-origin' // Do not send CSRF token to another domain.
    }
);
fetch(request).then(function(response) {
    // ...
});

Using CSRF protection in Jinja2 templates¶

Django’s Jinja2 template backend
adds {{ csrf_input }} to the context of all templates which is equivalent
to {% csrf_token %} in the Django template language. For example:

<form method="post">{{ csrf_input }}

Using the decorator method¶

Rather than adding CsrfViewMiddleware as a blanket protection, you can use
the csrf_protect() decorator, which has
exactly the same functionality, on particular views that need the protection.
It must be used both on views that insert the CSRF token in the output, and
on those that accept the POST form data. (These are often the same view
function, but not always).

Use of the decorator by itself is not recommended, since if you forget to
use it, you will have a security hole. The ‘belt and braces’ strategy of using
both is fine, and will incur minimal overhead.

Handling rejected requests¶

By default, a ‘403 Forbidden’ response is sent to the user if an incoming
request fails the checks performed by CsrfViewMiddleware. This should
usually only be seen when there is a genuine Cross Site Request Forgery, or
when, due to a programming error, the CSRF token has not been included with a
POST form.

The error page, however, is not very friendly, so you may want to provide your
own view for handling this condition. To do this, set the
CSRF_FAILURE_VIEW setting.

CSRF failures are logged as warnings to the django.security.csrf logger.

Using CSRF protection with caching¶

If the csrf_token template tag is used by a template (or the
get_token function is called some other way), CsrfViewMiddleware will
add a cookie and a Vary: Cookie header to the response. This means that the
middleware will play well with the cache middleware if it is used as instructed
(UpdateCacheMiddleware goes before all other middleware).

However, if you use cache decorators on individual views, the CSRF middleware
will not yet have been able to set the Vary header or the CSRF cookie, and the
response will be cached without either one. In this case, on any views that
will require a CSRF token to be inserted you should use the
django.views.decorators.csrf.csrf_protect() decorator first:

from django.views.decorators.cache import cache_page
from django.views.decorators.csrf import csrf_protect

@cache_page(60 * 15)
@csrf_protect
def my_view(request):
    ...

If you are using class-based views, you can refer to Decorating
class-based views
.

Testing and CSRF protection¶

The CsrfViewMiddleware will usually be a big hindrance to testing view
functions, due to the need for the CSRF token which must be sent with every POST
request. For this reason, Django’s HTTP client for tests has been modified to
set a flag on requests which relaxes the middleware and the csrf_protect
decorator so that they no longer rejects requests. In every other respect
(e.g. sending cookies etc.), they behave the same.

If, for some reason, you want the test client to perform CSRF
checks, you can create an instance of the test client that enforces
CSRF checks:

>>> from django.test import Client
>>> csrf_client = Client(enforce_csrf_checks=True)

Edge cases¶

Certain views can have unusual requirements that mean they don’t fit the normal
pattern envisaged here. A number of utilities can be useful in these
situations. The scenarios they might be needed in are described in the following
section.

Disabling CSRF protection for just a few views¶

Most views requires CSRF protection, but a few do not.

Solution: rather than disabling the middleware and applying csrf_protect to
all the views that need it, enable the middleware and use
csrf_exempt().

Setting the token when CsrfViewMiddleware.process_view() is not used¶

There are cases when CsrfViewMiddleware.process_view may not have run
before your view is run – 404 and 500 handlers, for example – but you still
need the CSRF token in a form.

Solution: use requires_csrf_token()

Including the CSRF token in an unprotected view¶

There may be some views that are unprotected and have been exempted by
csrf_exempt, but still need to include the CSRF token.

Solution: use csrf_exempt() followed by
requires_csrf_token(). (i.e. requires_csrf_token
should be the innermost decorator).

Protecting a view for only one path¶

A view needs CSRF protection under one set of conditions only, and mustn’t have
it for the rest of the time.

Solution: use csrf_exempt() for the whole
view function, and csrf_protect() for the
path within it that needs protection. Example:

from django.views.decorators.csrf import csrf_exempt, csrf_protect

@csrf_exempt
def my_view(request):

    @csrf_protect
    def protected_path(request):
        do_something()

    if some_condition():
       return protected_path(request)
    else:
       do_something_else()

Protecting a page that uses AJAX without an HTML form¶

A page makes a POST request via AJAX, and the page does not have an HTML form
with a csrf_token that would cause the required CSRF cookie to be sent.

Solution: use ensure_csrf_cookie() on the
view that sends the page.

CSRF protection in reusable applications¶

Because it is possible for the developer to turn off the CsrfViewMiddleware,
all relevant views in contrib apps use the csrf_protect decorator to ensure
the security of these applications against CSRF. It is recommended that the
developers of other reusable apps that want the same guarantees also use the
csrf_protect decorator on their views.

Чтобы воспользоваться преимуществами защиты от CSRF в ваших представлениях, выполните следующие шаги:

  1. По умолчанию промежуточное ПО CSRF активировано в настройках MIDDLEWARE. Если вы переопределите эту настройку, помните, что 'django.middleware.csrf.CsrfViewMiddleware' должно стоять перед любым промежуточным ПО представления, которое предполагает, что CSRF-атаки были обработаны.

    Если вы отключили его, что не рекомендуется, вы можете использовать csrf_protect() на определенных представлениях, которые вы хотите защитить (см. ниже).

  2. В любом шаблоне, использующем форму POST, используйте тег csrf_token внутри элемента <form>, если форма предназначена для внутреннего URL, например:

    <form method="post">{% csrf_token %}
    

    Этого не следует делать для POST-форм, нацеленных на внешние URL, поскольку в этом случае произойдет утечка CSRF-токена, что приведет к уязвимости.

  3. В соответствующих функциях представления убедитесь, что RequestContext используется для рендеринга ответа, чтобы {% csrf_token %} работал правильно. Если вы используете функцию render(), общие представления или приложения contrib, вы уже защищены, поскольку все они используют RequestContext.

Использование защиты CSRF в AJAX¶

Хотя описанный выше метод можно использовать для AJAX POST-запросов, он имеет некоторые неудобства: вы должны помнить о необходимости передавать CSRF-токен в качестве POST-данных при каждом POST-запросе. По этой причине существует альтернативный метод: при каждом XMLHttpRequest устанавливайте в пользовательский заголовок X-CSRFToken (как указано в настройке CSRF_HEADER_NAME) значение маркера CSRF. Это часто проще, поскольку многие JavaScript-фреймворки предоставляют крючки, которые позволяют устанавливать заголовки при каждом запросе.

Сначала необходимо получить токен CSRF. Как это сделать, зависит от того, включены ли параметры CSRF_USE_SESSIONS и CSRF_COOKIE_HTTPONLY.

Получение маркера, если CSRF_USE_SESSIONS и CSRF_COOKIE_HTTPONLY составляют False

Рекомендуемым источником маркера является cookie csrftoken, который будет установлен, если вы включили защиту CSRF для ваших представлений, как описано выше.

По умолчанию маркер CSRF имеет имя csrftoken, но вы можете управлять именем cookie с помощью параметра CSRF_COOKIE_NAME.

Вы можете приобрести токен следующим образом:

function getCookie(name) {
    let cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        const cookies = document.cookie.split(';');
        for (let i = 0; i < cookies.length; i++) {
            const cookie = cookies[i].trim();
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
const csrftoken = getCookie('csrftoken');

Приведенный выше код можно упростить, используя JavaScript Cookie library для замены getCookie:

const csrftoken = Cookies.get('csrftoken');

Примечание

Токен CSRF также присутствует в DOM в маскированной форме, но только если он явно включен в шаблон с помощью csrf_token. Cookie содержит канонический, незамаскированный маркер. CsrfViewMiddleware будет принимать любой из них. Однако для защиты от атак BREACH рекомендуется использовать маскированный токен.

Предупреждение

Если ваше представление не выводит шаблон, содержащий тег шаблона csrf_token, Django может не установить куки CSRF-токена. Это часто встречается в случаях, когда формы динамически добавляются на страницу. Для решения этой проблемы Django предоставляет декоратор представления, который принудительно устанавливает cookie: ensure_csrf_cookie().

Установка маркера в запросе AJAX¶

Наконец, вам нужно установить заголовок в запросе AJAX. Использование API fetch():

const request = new Request(
    /* URL */,
    {
        method: 'POST',
        headers: {'X-CSRFToken': csrftoken},
        mode: 'same-origin' // Do not send CSRF token to another domain.
    }
);
fetch(request).then(function(response) {
    // ...
});

Использование защиты CSRF в шаблонах Jinja2¶

Бэкенд шаблонов Django Jinja2 добавляет {{ csrf_input }} в контекст всех шаблонов, что эквивалентно {% csrf_token %} в языке шаблонов Django. Например:

<form method="post">{{ csrf_input }}

Использование метода декоратора¶

Вместо того чтобы добавлять CsrfViewMiddleware в качестве абсолютной защиты, вы можете использовать декоратор csrf_protect(), который обладает точно такой же функциональностью, для определенных представлений, которые нуждаются в защите. Он должен использоваться как для представлений, которые вставляют CSRF-токен в вывод, так и для тех, которые принимают данные POST-формы. (Часто это одна и та же функция представления, но не всегда).

Использование декоратора само по себе не рекомендуется, поскольку если вы забудете его использовать, у вас будет дыра в безопасности. Стратегия «пояса и скобок», при которой используются оба декоратора, вполне подходит, и накладные расходы будут минимальными.

Обработка отклоненных запросов¶

По умолчанию пользователю отправляется ответ „403 Forbidden“, если входящий запрос не проходит проверку, выполняемую CsrfViewMiddleware. Обычно это происходит только в случае настоящей подделки межсайтовых запросов или когда из-за ошибки программирования маркер CSRF не был включен в форму POST.

Однако страница ошибки не очень дружелюбна, поэтому вы можете захотеть создать собственное представление для обработки этого условия. Для этого установите параметр CSRF_FAILURE_VIEW.

Сбои CSRF регистрируются как предупреждения в журнале django.security.csrf.

Использование защиты CSRF с кэшированием¶

Если тег шаблона csrf_token используется шаблоном (или функция get_token вызывается каким-либо другим способом), CsrfViewMiddleware добавит cookie и заголовок Vary: Cookie в ответ. Это означает, что промежуточное ПО будет хорошо взаимодействовать с промежуточным ПО кэша, если оно используется в соответствии с инструкциями (UpdateCacheMiddleware идет перед всеми другими промежуточными ПО).

Однако, если вы используете декораторы кэша на отдельных представлениях, промежуточное ПО CSRF еще не сможет установить заголовок Vary или куки CSRF, и ответ будет кэширован без них. В этом случае для всех представлений, которые потребуют вставки маркера CSRF, следует сначала использовать декоратор django.views.decorators.csrf.csrf_protect():

from django.views.decorators.cache import cache_page
from django.views.decorators.csrf import csrf_protect

@cache_page(60 * 15)
@csrf_protect
def my_view(request):
    ...

Если вы используете представления на основе классов, вы можете обратиться к Decorating class-based views.

Тестирование и защита от CSRF¶

Декоратор CsrfViewMiddleware обычно сильно мешает тестированию функций представления из-за необходимости использования CSRF-токена, который должен быть отправлен с каждым POST-запросом. По этой причине HTTP-клиент Django для тестов был модифицирован для установки флага в запросах, который ослабляет промежуточное программное обеспечение и декоратор csrf_protect, так что они больше не отклоняют запросы. Во всех остальных отношениях (например, отправка cookies и т.д.) они ведут себя одинаково.

Если по какой-то причине вы хотите, чтобы тестовый клиент выполнял проверку CSRF, вы можете создать экземпляр тестового клиента, который будет выполнять проверку CSRF:

>>> from django.test import Client
>>> csrf_client = Client(enforce_csrf_checks=True)

Краевые случаи¶

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

Отключение защиты CSRF только для нескольких просмотров¶

Большинство представлений требуют защиты от CSRF, но некоторые не требуют.

Решение: вместо того чтобы отключать промежуточное ПО и применять csrf_protect ко всем представлениям, которым оно необходимо, включите промежуточное ПО и используйте csrf_exempt().

Установка маркера, когда CsrfViewMiddleware.process_view() не используется¶

Бывают случаи, когда CsrfViewMiddleware.process_view может не выполняться до запуска вашего представления – например, обработчики 404 и 500 – но вам все равно нужен CSRF-токен в форме.

Решение: используйте requires_csrf_token()

Включение маркера CSRF в незащищенное представление¶

Могут быть некоторые представления, которые не защищены и были исключены с помощью csrf_exempt, но все равно должны включать маркер CSRF.

Решение: используйте csrf_exempt(), за которым следует requires_csrf_token(). (т.е. requires_csrf_token должен быть самым внутренним декоратором).

Защита представления только для одного пути¶

Представление нуждается в защите CSRF только при одном наборе условий, и не должно иметь ее в остальное время.

Решение: используйте csrf_exempt() для всей функции представления, и csrf_protect() для пути внутри нее, который нуждается в защите. Пример:

from django.views.decorators.csrf import csrf_exempt, csrf_protect

@csrf_exempt
def my_view(request):

    @csrf_protect
    def protected_path(request):
        do_something()

    if some_condition():
       return protected_path(request)
    else:
       do_something_else()

Защита страницы, использующей AJAX без HTML-формы¶

Страница делает POST-запрос через AJAX, и на странице нет HTML-формы с csrf_token, которая бы вызвала отправку требуемого CSRF-куки.

Решение: используйте ensure_csrf_cookie() в представлении, которое отправляет страницу.

Защита от CSRF в многократно используемых приложениях¶

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

Добавить комментарий