Csrf token missing or incorrect как исправить ошибку

I'm using Django 1.7 and django-rest-framework. I made an API that returns me some JSON data putting this in my settings.py REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ('rest_framework.

I’m using Django 1.7 and django-rest-framework.

I made an API that returns me some JSON data putting this in my settings.py

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.AllowAny',),
    'DEFAULT_RENDERER_CLASSES': (
    #   'rest_framework.renderers.XMLRenderer',
    'rest_framework.renderers.JSONRenderer',
    #   'rest_framework.renderers.BrowsableAPIRenderer',
    )
}

When I make GET calls, it returns me all the data, but when I try with PUT/PATCH I get:

--------Response Headers---------
Status Code: 403
Date: Wed, 29 Oct 2014 18:51:42 GMT
Vary: Cookie
Server: WSGIServer/0.1 Python/2.7.8
Allow: GET, POST, PUT, PATCH, HEAD, OPTIONS
X-Frame-Options: SAMEORIGIN
Content-Type: application/json
---------------------------------

--------Response Body-----------
{"detail": "CSRF Failed: CSRF token missing or incorrect."}
---------------------------------

This only happens when I am logged in, if I am anonymous I can PUT/PATCH correctly.

I have tried with @csrf_exempt and I got errors, I have included the rest_framework.permissions.AllowAny in the setting…

I have no idea what’s going on. Does anyone know what the issue is?

Если вы столкнулись с ошибкой «истек CSRF-токен» — читайте нашу статью. Из неё вы узнаете, как работает CSRF-token защита, и что делать, если CSRF токен истек.


Ошибка токен истек 1

Что такое CSRF

CSRF (англ. cross-site request forgery) — это межсайтовая подделка запроса. Это атака, которой может подвергаться любой веб-ресурс или веб-приложение. В первую очередь это касается сайтов, которые используют cookies, сертификаты авторизации и браузерную аутентификацию. В результате атаки страдают клиенты и репутация ресурса.

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

Как работает CSRF-атака

Злоумышленник может использовать фишинговую ссылку — это наиболее распространенный способ обмана. В этом случае атака работает по следующей схеме:

  1. Злоумышленник создаёт поддельную страницу, очень похожую на оригинальную, и встраивает её в сайт. В коде ссылка может выглядеть так: <a href=“вредоносная ссылка”>Unsubscribe here</a>.
  2. Пользователь переходит с одной страницы сайта на другую (например, на страницу оплаты) и вместо реальной страницы попадает на поддельную.
  3. Пользователь совершает действие на странице, например, оплачивает товар или вводит данные авторизации.
  4. Информация или денежные средства вместо оригинального сервера уходят на сервер мошенника.

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

Что такое CSRF-token и как он работает

В общем понимании токен — это механизм, который позволяет идентифицировать пользователя или конкретную сессию для безопасного обмена информацией и доступа к информационным ресурсам. Токены помогают проверить личность пользователя (например, клиента, который онлайн получает доступ к банковскому счёту). Их используют как вместо пароля, так и вместе с ним. Токен — это в каком-то смысле электронный ключ.

CSRF-token — это максимально простой и результативный способ защиты сайта от CSRF-мошенников. Он работает так: сервер создаёт случайный ключ (он же токен) и отправляет его браузеру клиента. Когда браузер запрашивает у сервера информацию, сервер, прежде чем дать ответ, требует показать ключ и проверяет его достоверность. Если токен совпадает, сессия продолжается, а если нет — прерывается. Токен действителен только одну сессию — с новой сессией он обновляется.

Чтобы получить ответ от сервера, используются разные методы запроса. Условно они делятся на две категории: те, которые не изменяют состояние сервера (GET, TRACE, HEAD), и те, которые изменяют (PUT, PATCH, POST и DELETE). Последние имеют большую CSRF-уязвимость и поэтому должны быть защищены в первую очередь.

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

  • нахождение в скрытом параметре;

  • генерация с помощью генератора псевдослучайных чисел;

  • ограниченное время жизни (одна сессия);

  • уникальность для каждой транзакции;

  • устойчивый к подбору размер (в битах);

  • невозможно переиспользовать.

Типы токенов

Существует три основных типа токенов по способу генерации:

  1. Synchronizer Tokens или Anti-CSRF (токены синхронизации). В этом случае инициатором ключа выступает сервер — на нём хранится исходная шифровка. Когда браузер обращается к серверу и предъявляет ему ключ, сервер сравнивает его с исходником и в зависимости от результата продолжает или прерывает сессию.
  2. Double Submit Cookie (двойная отправка куки). При этом способе токен нигде не хранится. Когда браузер обращается к серверу впервые за сессию, сервер генерирует и передаёт ему ключ в двух формах: через куки и в одном из параметров ответа. При следующих обращениях браузера сервер дважды проверяет правильность ключа — в параметрах и в куках.
  3. Encrypted Token (зашифрованный токен). Этот способ предполагает, что ключом шифруется какая-то часть информации о клиенте, которая содержится в браузере. При первом запросе браузера сервер получает информацию о пользователе, зашифровывает её и передаёт браузеру токен. При следующем взаимодействии сервер расшифровывает токен и сверяет информацию.

Помимо токенов, для защиты используется флаг Same-Site (большинство браузеров его поддерживает). Он работает напрямую для cookies и позволяет помечать куки конкретного домена. Сервер проверяет, содержатся ли нужные пометки в куках страницы, с которых происходит оплата или вносятся изменения. Если пометок нет — сессия прекращается.

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

«Истек срок действия токена» или «CSRF-значение недопустимо»: что это значит и что делать

Даже при авторизации на сайтах, для которых настроена защита от атак, можно встретить следующие варианты сообщения об ошибке: «Недопустимое CSRF-значение»/«CSRF-токены не совпадают» или «Token expired» (в переводе — срок действия токена истек). Сообщение может отображаться как на английском, так и на русском. Пример ошибки при авторизации на сайте REG.RU:



Ошибка токен истек 2

Обычно ошибка возникает по двум основным причинам:

  • сервер некорректно сгенерировал токен;

  • срок токена истек — пользователь долго не совершал никаких действий на странице.

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


Ошибка токен истек 3

Иногда ошибка возникает из-за расширений защиты конфиденциальности или плагинов блокировки рекламы (например, Ghostery, UBlock Origin, Blur), которые настроены у пользователя. В этом случае можно отключить расширение. Также можно добавить сайт, на котором появилось сообщение, в список доверенных сайтов.

На примере сайта reg.ru покажем, что для этого нужно:

в Google Chrome

  1. Откройте настройки Chrome:

    Ошибка токен истек 4

  2. В списке слева выберите Конфиденциальность и безопасность, а затем Файлы cookie и другие данные сайтов.
  3. Внизу страницы откройте Сайты, которые всегда могут использовать файлы cookie и кликните Добавить.
  4. Введите «[*.]www.reg.ru» и нажмите Добавить.
  5. Нажмите Все файлы cookie и данные сайта и удалите все записи, которые связаны с сайтом reg.ru.
  6. Перезагрузите браузер и выполните операцию повторно.

в Яндекс.Браузер

  1. Откройте настройки браузера Яндекс:

    20220125_chto_oznachayet_oshibka_csrf_token_istek_5.png

  2. Перейдите на Сайты Расширенные.
  3. Кликните Настройки… для первого параметра в списке. Затем на вкладке «Разрешена» введите www.reg.ru и кликните Добавить.
  4. Добавьте адрес сайта для всех параметров списка по аналогии.

в Safari

  1. Откройте настройки Safari комбинацией Cmd + , (⌘,).
  2. Перейдите на вкладку Конфиденциальность и проверьте, что в пункте «Файлы cookie и данные веб-сайтов» не выбрано «Блокировать все файлы cookie». Если это так, снимите настройки.
  3. Кликните Управление данными веб-сайтов и удалите все записи, которые относятся к www.reg.ru.
  4. Перезагрузите браузер и выполните операцию повторно.

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

Заключение

Успешная атака CSRF позволяет хакеру действовать на сайте от имени другого зарегистрированного посетителя. Чтобы мошенник не добрался до конфиденциальных данных, для сайта нужно настроить один из типов CSRF-токенов. Токены позволяют серверу и браузеру безопасно обмениваться информацией в течение сессии. Однако даже на безопасных сайтах можно столкнуться с ошибкой «токен CSRF истек». В этом нет ничего страшного. Чтобы возобновить подключение, достаточно обновить страницу браузера.

Beginner at Django here, I’ve been trying to fix this for a long time now.
I do have ‘django.middleware.csrf.CsrfViewMiddleware’ in my middleware classes and I do have the token in my post form.

Heres my code, what am I doing wrong?

from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from chartsey.authentication.forms import RegistrationForm
from django.template import RequestContext
from django.core.context_processors import csrf

def register(request):

    if request.method == 'POST':
        c = RequestContext(request.POST, {})
        form = RegistrationForm(c)
        if form.is_valid():
            new_user = form.save()
            return HttpResponseRedirect("/")
    else:
        form = RegistrationForm()

    return render_to_response("register.html",  {'form': form,  }, )

Here’s my Template:

{% block content %}

    <h1>Register</h1>
    <form action="" method="POST"> {% csrf_token %}
        {{ form.as_p }}
    <input type="submit" value="Submit">
    </form>

{% endblock %}

asked Nov 11, 2011 at 3:10

aroooo's user avatar

3

Update: This answer is from 2011. CSRF is easy today.

These days you should be using the render shortcut function return render(request, 'template.html') which uses RequestContext automatically so the advice below is outdated by 8 years.

  1. Use render https://docs.djangoproject.com/en/2.2/topics/http/shortcuts/
  2. Add CSRF middleware https://docs.djangoproject.com/en/2.2/ref/csrf/
  3. Use the {% csrf_token %} template tag
  4. Confirm you see the CSRF token value being generated, AND submitted in your form request

Original Response

My guess is that you have the tag in the template but it’s not rendering anything (or did you mean you confirmed in the actual HTML that a CSRF token is being generated?)

Either use RequestContext instead of a dictionary

render_to_response("foo.html", RequestContext(request, {}))

Or make sure you have django.core.context_processors.csrf in your CONTEXT_PROCESSORS setting.

https://docs.djangoproject.com/en/dev/ref/contrib/csrf/

Or add the token to your context manually

Community's user avatar

answered Nov 11, 2011 at 3:49

Yuji 'Tomita' Tomita's user avatar

3

Just add this to your views

return render_to_response("register.html", {'form': form, }, context_instance = RequestContext(request))

It will work!!

TRR's user avatar

TRR

1,6372 gold badges26 silver badges43 bronze badges

answered Nov 6, 2012 at 9:23

Njogu Mbau's user avatar

Njogu MbauNjogu Mbau

4361 gold badge7 silver badges14 bronze badges

for Django version 3.0 add the below annotation

@csrf_protect
def yourfunc(request):
    return render(request, '../your.html', None)

And don’t forget add the below tag in your field

<form action="add/" method="post">
  {% csrf_token %}
...
</form>

answered May 8, 2020 at 6:54

ImDroidGuy's user avatar

If you are not using CsrfViewMiddleware, then you must use csrf_protect on any views that use the csrf_token template tag, as well as those that accept the POST data.

answered Jan 17, 2013 at 14:35

Neeraj Sharma's user avatar

Also got this error randomly on some pages after I installed django-livereload-server. Uninstalling django-livereload-server did the trick.

answered Dec 29, 2016 at 5:54

lukeaus's user avatar

lukeauslukeaus

11k7 gold badges50 silver badges60 bronze badges

I had this issue too, but honestly, I hit refresh on my browser a few minutes later without changing anything and it worked that time. I had this message in my command line as so it might provide a clue as to what was causing the issue:

Not Found: /css/reset/reset.css
[03/Jul/2020 20:52:13] "GET /css/reset/reset.css HTTP/......

answered Jul 3, 2020 at 20:57

cheznead's user avatar

chezneadcheznead

2,4627 gold badges27 silver badges46 bronze badges

DJANGO/AJAX WORKFLOW FULL METHOD IS HERE :)

const url = "{% url 'YOUR_URL_NAME' pk=12345 %}".replace(/12345/, id.toString());
$.ajax({
        type: 'POST',
        url: url,
        data: {'id':id, "csrfmiddlewaretoken": '{{csrf_token}}'},
        beforeSend: function() { $('#response').text('Please wait ...'); },
        success: function (response) {
            console.log(response)           
        },
        error: function (response) {
            console.log(response)
        }
    })

Hope It Will Work !!!

answered Aug 10, 2021 at 12:03

Sanjay Sikdar's user avatar

What worked for me was commenting out the below line from my settings.py

'django.middleware.csrf.CsrfViewMiddleware'

answered May 31, 2017 at 20:24

Laughing Horse's user avatar

1

Beginner at Django here, I’ve been trying to fix this for a long time now.
I do have ‘django.middleware.csrf.CsrfViewMiddleware’ in my middleware classes and I do have the token in my post form.

Heres my code, what am I doing wrong?

from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from chartsey.authentication.forms import RegistrationForm
from django.template import RequestContext
from django.core.context_processors import csrf

def register(request):

    if request.method == 'POST':
        c = RequestContext(request.POST, {})
        form = RegistrationForm(c)
        if form.is_valid():
            new_user = form.save()
            return HttpResponseRedirect("/")
    else:
        form = RegistrationForm()

    return render_to_response("register.html",  {'form': form,  }, )

Here’s my Template:

{% block content %}

    <h1>Register</h1>
    <form action="" method="POST"> {% csrf_token %}
        {{ form.as_p }}
    <input type="submit" value="Submit">
    </form>

{% endblock %}

asked Nov 11, 2011 at 3:10

aroooo's user avatar

3

Update: This answer is from 2011. CSRF is easy today.

These days you should be using the render shortcut function return render(request, 'template.html') which uses RequestContext automatically so the advice below is outdated by 8 years.

  1. Use render https://docs.djangoproject.com/en/2.2/topics/http/shortcuts/
  2. Add CSRF middleware https://docs.djangoproject.com/en/2.2/ref/csrf/
  3. Use the {% csrf_token %} template tag
  4. Confirm you see the CSRF token value being generated, AND submitted in your form request

Original Response

My guess is that you have the tag in the template but it’s not rendering anything (or did you mean you confirmed in the actual HTML that a CSRF token is being generated?)

Either use RequestContext instead of a dictionary

render_to_response("foo.html", RequestContext(request, {}))

Or make sure you have django.core.context_processors.csrf in your CONTEXT_PROCESSORS setting.

https://docs.djangoproject.com/en/dev/ref/contrib/csrf/

Or add the token to your context manually

Community's user avatar

answered Nov 11, 2011 at 3:49

Yuji 'Tomita' Tomita's user avatar

3

Just add this to your views

return render_to_response("register.html", {'form': form, }, context_instance = RequestContext(request))

It will work!!

TRR's user avatar

TRR

1,6372 gold badges26 silver badges43 bronze badges

answered Nov 6, 2012 at 9:23

Njogu Mbau's user avatar

Njogu MbauNjogu Mbau

4361 gold badge7 silver badges14 bronze badges

for Django version 3.0 add the below annotation

@csrf_protect
def yourfunc(request):
    return render(request, '../your.html', None)

And don’t forget add the below tag in your field

<form action="add/" method="post">
  {% csrf_token %}
...
</form>

answered May 8, 2020 at 6:54

ImDroidGuy's user avatar

If you are not using CsrfViewMiddleware, then you must use csrf_protect on any views that use the csrf_token template tag, as well as those that accept the POST data.

answered Jan 17, 2013 at 14:35

Neeraj Sharma's user avatar

Also got this error randomly on some pages after I installed django-livereload-server. Uninstalling django-livereload-server did the trick.

answered Dec 29, 2016 at 5:54

lukeaus's user avatar

lukeauslukeaus

11k7 gold badges50 silver badges60 bronze badges

I had this issue too, but honestly, I hit refresh on my browser a few minutes later without changing anything and it worked that time. I had this message in my command line as so it might provide a clue as to what was causing the issue:

Not Found: /css/reset/reset.css
[03/Jul/2020 20:52:13] "GET /css/reset/reset.css HTTP/......

answered Jul 3, 2020 at 20:57

cheznead's user avatar

chezneadcheznead

2,4627 gold badges27 silver badges46 bronze badges

DJANGO/AJAX WORKFLOW FULL METHOD IS HERE :)

const url = "{% url 'YOUR_URL_NAME' pk=12345 %}".replace(/12345/, id.toString());
$.ajax({
        type: 'POST',
        url: url,
        data: {'id':id, "csrfmiddlewaretoken": '{{csrf_token}}'},
        beforeSend: function() { $('#response').text('Please wait ...'); },
        success: function (response) {
            console.log(response)           
        },
        error: function (response) {
            console.log(response)
        }
    })

Hope It Will Work !!!

answered Aug 10, 2021 at 12:03

Sanjay Sikdar's user avatar

What worked for me was commenting out the below line from my settings.py

'django.middleware.csrf.CsrfViewMiddleware'

answered May 31, 2017 at 20:24

Laughing Horse's user avatar

1

Skip to content

instagram wallpaper

По традиции вы открываете браузер для того, чтобы войти в старый добрый заблокированный Роскомнадзором Инстаграм. Включаете свой любименький VPN в браузере с ПК. Заходите на инстаграм.ком, вводите логин и пароль, а этот несуразный сервис вам отвечает красной ошибкой CSRF token missing or incorrect.

Что делать? Как избавиться? Рассказываем:

  • Зайдите на https://www.instagram.com/

Login at Instagram

  • Нажмите F12 чтобы открыть в браузере консоль разработчика для отладки и откройте вкладку Network.
  • Обновите страницу (кнопкой F5). В списке событий в колонке Name видим www.instagram.com, жмите на него и перейдите в открывшихся вкладках события во вкладку Response

Inst 2 game art logo

  • Далее необходимо найти токен — нажмите CTRL+F и введите в поле поиска «csrf_token«, найдите данную строку и увидите рядом с ним значение вида wH4pOW2E7zC1AJ21QS4CEIImSOjB5F0c (оно прописано в кавычках после двоеточия — смотрите скрин ниже)

Inst 3 game art logo

  • Скопируйте это значение (полностью всё, что в кавычках) и перейдите в общую вкладку отладчика Application. Откройте пункт Cookies и в нём выберите instagram.com

Inst 4 game art logo

  • Перед вами откроется пустой список-таблица. Нажмите в пустую нижнюю строчку — начнётся добавление нового куки.
  • В колонку Name введите csrftoken, а в колонку Value вставьте значение, которое скопировали ранее, и в колонке Secure поставьте галочку

Inst 5 game art logo

  • Всё. В окне браузера введите ваши логин и пароль, повторите вход.

Если всё произведено корректно — вы войдете в ваш аккаунт без проблем.

Мой пример разобран через Яндекс.Браузер, но в Google Chrome всё анало_гично. Ноги б моей в инстаграм больше не сунуть, но иногда приходиться туда заходить по делу.

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

Количество людей, посчитавших эту новость классной: 2 272

3

Тебе наверняка еще понравится:

Индинити: Лучшие Инди игры января (2023)

Вас ожидает десятка лучших игр за январь 2023 от независимых разработчиков, а также бонусом показана короткая нарезка из 20 проектов вне топа: Топ 10: Новинки вне топа: Приятного просмотра, берлога! Поддержите видос своим самым щедрым лайком! 1

I’m using Django 1.7 and django-rest-framework.

I made an API that returns me some JSON data putting this in my settings.py

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.AllowAny',),
    'DEFAULT_RENDERER_CLASSES': (
    #   'rest_framework.renderers.XMLRenderer',
    'rest_framework.renderers.JSONRenderer',
    #   'rest_framework.renderers.BrowsableAPIRenderer',
    )
}

When I make GET calls, it returns me all the data, but when I try with PUT/PATCH I get:

--------Response Headers---------
Status Code: 403
Date: Wed, 29 Oct 2014 18:51:42 GMT
Vary: Cookie
Server: WSGIServer/0.1 Python/2.7.8
Allow: GET, POST, PUT, PATCH, HEAD, OPTIONS
X-Frame-Options: SAMEORIGIN
Content-Type: application/json
---------------------------------

--------Response Body-----------
{"detail": "CSRF Failed: CSRF token missing or incorrect."}
---------------------------------

This only happens when I am logged in, if I am anonymous I can PUT/PATCH correctly.

I have tried with @csrf_exempt and I got errors, I have included the rest_framework.permissions.AllowAny in the setting…

I have no idea what’s going on. Does anyone know what the issue is?

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Csrf token mismatch ошибка что делать
  • Csrf error code
  • Curl 22 the requested url returned error 404 not found
  • Cura как изменить размер модели
  • Cups waiting for job completed ошибка linux

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии