Подтвердить что ты не робот

Как использовать завиток с токенами Django, csrf и POST-запросами

Я использую curl для проверки одной из форм Django. Вызовы, которые я пробовал (с ошибками от каждого и нескольких строк для удобочитаемости):

(1):

curl
-d "{\"email\":\"[email protected]\"}"
--header "X-CSRFToken: [triple checked value from the source code of a page I already loaded from my Django app]"
--cookie "csrftoken=[same csrf value as above]"
http://127.0.0.1:8083/registrations/register/

(с заголовком http и csrftoken в cookie) приводит к ошибке 400 без возврата данных.

(2):

curl
-d "{a:1}"
--header "X-CSRFToken:[as above]"
--cookie "csrftoken=[as above];sessionid=[from header inspection in Chrome]"
http://127.0.0.1:8083/registrations/register/

(как в (1), но без пробелов в объявлении свойства заголовка и с sessionid в cookie тоже) приводит к той же ошибке 400 без возврата данных.

(3):

curl
-d "{a:1}"
--header "X-CSRFToken:[as above]"
http://127.0.0.1:8083/registrations/register/

(только http-заголовок с X-CSRFToken, no cookie) приводит к ошибке кода 403, с сообщением: CSRF cookie не установлен.

Как я могу проверить свою форму с помощью завитки? Какие факторы я не рассматриваю, помимо значений cookie и заголовков http?

4b9b3361

Ответ 1

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

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

$ curl -v -c cookies.txt -b cookies.txt host.com/registrations/register/
$ curl -v -c cookies.txt -b cookies.txt -d "[email protected]&a=1&csrfmiddlewaretoken=<token from cookies.txt>" host.com/registrations/register/

Первый завиток моделирует пользователя, впервые прибывающего на страницу с запросом GET, и все необходимые файлы cookie сохраняются. Второй завиток имитирует заполнение полей формы и отправку их как POST. Обратите внимание, что вы должны включить поле csrfmiddlewaretoken в данные POST, как было предложено Дэмиеном.

Ответ 2

Try:

curl
 -d "[email protected]&a=1"
 http://127.0.0.1:8083/registrations/register/

Обратите внимание, в частности, на формат аргумента -d.

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

Защита CSRF требуется только для "небезопасных" запросов (POST, PUT, DELETE). Он работает, проверяя cookie 'csrftoken' в отношении поля формы "csrfmiddlewaretoken" или HTTP-заголовка "X-CSRFToken".

Итак:

curl
 -X POST
 -d "[email protected]&a=1&csrfmiddlewaretoken={inserttoken}"
 --cookie "csrftoken=[as above]"
 http://127.0.0.1:8083/registrations/register/

Также можно использовать --header "X-CSRFToken: {token}" вместо того, чтобы включать его в данные формы.

Ответ 3

Я работал со скручиванием, как это

  • Вы должны отправить csrftoken в заголовке как X-CSRFToken.
  • Вам необходимо отправить данные формы в формате JSON. Demo,

Сначала мы будем извлекать csrf_token и хранить в файле cookie.txt(или cookie.jar, как они его называют)

$ curl -c cookie.txt http://localhost.com:8000/ 

Содержимое cookie.txt

# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.
localhost.com  FALSE   /   FALSE   1463117016  csrftoken   vGpifQR12BxT07moOohREGmuKp8HjxaE

Затем мы повторно отправим имя пользователя и пароль в формате json. (вы можете отправить его обычным способом). Проверьте удаление данных json.

$curl --cookie cookie.txt http://localhost.com:8000/login/   -H "Content-Type: application/json" -H "X-CSRFToken: vGpifQR12BxT07moOohREGmuKp8HjxaE" -X POST -d "{\"username\":\"username\",\"password\":\"password\"}" 
{"status": "success", "response_msg": "/"}
$

вы можете сохранить возврат нового файла cookie сеанса csrf_token в том же файле или в новом файле (я сохранил в том же файле с помощью опции -c.)

$curl --cookie cookie.txt http://localhost.com:8000/login/   -H "Content-Type: application/json" -H "X-CSRFToken: kVgzzB6MJk1RtlVnyzegEiUs5Fo3VRqF" -X POST -d "{\"username\":\"username\",\"password\":\"password\"}" -c cookie.txt

-Content of cookie.txt

# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

localhost.com  FALSE   /   FALSE   1463117016  csrftoken   vGpifQR12BxT07moOohREGmuKp8HjxaE
#HttpOnly_localhost.com    FALSE   /   FALSE   1432877016  sessionid   cg4ooly1f4kkd0ifb6sm9p

Когда вы храните новый файл cookie csrf_token и session id в файле cookie.txt, вы можете использовать тот же файл cookie.txt на веб-сайте.

Вы читаете файлы cookie из предыдущего запроса из файла cookie.txt(--cookie) и записываете новые файлы cookie из ответа в том же файле cookie.txt(-c).

Чтение и отправка формы теперь работают с csrf_token и идентификатором сеанса.

$curl --cookie cookie.txt http://localhost.com:8000/home/   -H "Content-Type: application/json" -H "X-CSRFToken: vGpifQR12BxT07moOohREGmuKp8HjxaE" -c cookie.txt

Ответ 4

Вот как я это сделал, используя учебник по остальной структуре

открыть браузер, например. хром, затем нажмите F12, откройте вкладку разработчика и проверите Сеть, войдите в систему, используя учетные данные пользователя, и получите свой токен CRSF от мониторинга POST

то в curl выполните:

curl http://127.0.0.1:8000/snippets/ \
 -X POST \
 -H "Content-Type: application/json" \
 -H "Accept: text/html,application/json" \
 -H "X-CSRFToken: the_token_value" \
 -H "Cookie: csrftoken=the_token_value" \
 -u your_user_name:your_password \
 -d '{"title": "first cookie post","code": "print hello world"}' 

Я думаю, что его очиститель не помещает токен в тело, а скорее заголовок, используя X-CSRFToken

Ответ 5

curl-auth-csrf - это инструмент с открытым исходным кодом на основе Python, способный сделать это для вас:" Инструмент Python, который имитирует cURL, но выполняет логин и обрабатывает любые токены кросс-сайта (CSRF). Полезно для очистки HTML, обычно доступного только при входе в систему.

Это будет ваш синтаксис:

echo -n YourPasswordHere | ./curl-auth-csrf.py -i http://127.0.0.1:8083/registrations/register/ -d '[email protected]&a=1' http://127.0.0.1:8083/registrations/register/

Это будет передаваться по данным POST, как указано, но также включать пароль, переданный через stdin. Я предполагаю, что страница, которую вы посещаете после "входа", является той же страницей.

Полное раскрытие: я являюсь автором curl-auth-csrf.

Ответ 6

X-CSRFToken в заголовках просто нужно быть одинаковым с csrftoken в cookie.

Пример:

curl -v http://www.markjour.com/login/ -H "X-CSRFToken: 123" -b "csrftoken=123" -d "username=admin&password=admin"