Django Защита CSRF, дает ответ 200 ok, хотя я не предоставил токен csrf - PullRequest
0 голосов
/ 07 мая 2020

не предоставил {% csrf_token%} в шаблоне, но HTTP-ответ соответствует 200, не должен быть запрещен 403?!

setting.py

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

url .py

urlpatterns = [
    path('admin/', admin.site.urls),
    path("formtest", view.formPostTest),
]

шаблон formPostTest. html

<!DOCTYPE html>
<html lang="en" dir="ltr">
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body>
        <form class="" action="/formtest" method="post">
            <label for="username">username: </label><input type="text" name="username" value="">
            <label for="password">password: </label><input type="password" name="password" value="">
            <input type="submit" name="submit" value="submit">
        </form>
    </body>
</html>

view.py

def formPostTest(request):
    if request.method == "GET":
        cont = {}
        return render(request, "formPostTest.html", cont)
    elif request.method == "POST":
        return HttpResponse("done")

не только то, что я устал делать все, чтобы его пропустить вверх, я подделал файл cookie csrftoken снимок экрана сетевого монитора

он всегда дает 200 ОК, независимо от того, какую единственную проблему он дает в консоли

console

Forbidden (CSRF cookie not set.): /formtest
Forbidden (CSRF cookie not set.): /formtest
[07/May/2020 02:21:07] "POST /formtest HTTP/1.1" 200 4

и иногда вместо этого

Forbidden (CSRF token missing or incorrect.): /formtest
[07/May/2020 02:28:44] "POST /formtest HTTP/1.1" 200 4

django версия 2.0.5 , python версия 3.6.5

РЕДАКТИРОВАТЬ (05.08.2020):

покопавшись в django исходном коде, я обнаружил несколько вещей:

  1. CsrfViewMiddleware (ответственный защиты csrf) никогда не поднимайте PermissionDenied (запрещено 403). как я могу изменить это поведение?

  2. ошибка / предупреждение консоли Forbidden (CSRF cookie not set.) печатается, когда csrf token cook ie не установлен (обычно причина в том, что представление, обрабатывающее POST, отличается от того, которое отправляет его, решено декоратором ensure_csrf_cookie)

  3. ошибка / предупреждение консоли Forbidden (CSRF token missing or incorrect.) печатается, когда csrf token cook ie и несоленый шифр csrfmiddlewaretoken не совпадают (я не смог найти причина для этого, но добавив CSRF_COOKIE_AGE, я решил, как это решить.

...