Риск сбоя токена Django CSRF - PullRequest
0 голосов
/ 24 июня 2018

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

Пример сбоя почты сегодня:

{
   "GET": {},
   "COOKIES": {},
   "ERROR": "Referer checking failed - no Referer.",
   "USER": "AnonymousUser",
   "META": {
       "REMOTE_ADDR": "127.0.0.1",
       "mod_wsgi.version": "(4, 5, 20)",
       "DOCUMENT_ROOT": "/usr/local/apache2/htdocs",
       "SERVER_ADDR": "127.0.0.1",
       "HTTP_ACCEPT_ENCODING": "gzip, deflate, br",
       "wsgi.multithread": "True",
       "HTTP_FORWARDED_REQUEST_URI": "/",
       "CONTEXT_DOCUMENT_ROOT": "/usr/local/apache2/htdocs",
       "wsgi.file_wrapper": "<class 'mod_wsgi.FileWrapper'>",
       "mod_wsgi.path_info": "/",
       "HTTP_ORIGIN": "chrome-extension://aegnopegbbhjeeiganiajffnalhlkkjb",
       (...)
   },
   "POST": {}
}

Особенно HTTP_ORIGIN выглядит «интересно»: почему это расширение Chrome нас смущает / запугивает?

Итак, по сути: мы должны беспокоиться об этом?

Спасибо!

1 Ответ

0 голосов
/ 25 июня 2018

Это выглядит как странно закодированная «функция» в расширении «Безопасность браузера» Chrome. Он пытается проверить правильность URL-адреса, отправив ему пустой запрос POST (почему?!).

var checkUrlState = function (url) {
    var urlState = null;
    if (blacklists.indexOf(domainFromUrl((url).toString())) < 0) {
        var xhr = new XMLHttpRequest();
        try {
            xhr.open("POST", url, true);
            xhr.timeout = 5000; // time in milliseconds
            xhr.onreadystatechange = function() {
                if (xhr.readyState == 4) {
                    urlState = xhr.status;
                } else {
                    urlState = null;
                }
            }
            xhr.ontimeout = function () {

            }
            xhr.send();
        } catch (e) {

            onErrorReceived.call(xhr);
        }
    }
    return urlState;
}

Я также вижу это на своих сайтах. Я бы рекомендовал отфильтровать его по внешнему интерфейсу на основе заголовка Origin.

...