Как использовать завиток с токенами 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?
Ответы
Ответ 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"