Как использовать CURL с Django, CSRF токенами и почтовыми запросами -- django поле с участием curl поле с участием django-forms поле с участием csrf поле с участием django-csrf пол Связанный проблема

How to use curl with Django, csrf tokens and POST requests


46
vote

проблема

русский

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

(1):

 <код> curl -d "{"email":"test@test.com"}" --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 , нет cookie) Результаты ошибки Код ошибки 403, с сообщением: CSRF Cookie не установлен.

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

Английский оригинал

I'm using curl to test one of my Django forms. The calls I've tried (with errors from each, and over multiple lines for readability):

(1):

curl -d "{"email":"test@test.com"}" --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/ 

(with http header and csrftoken in cookie) results in a 400 error with no data returned.

(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/ 

(as in (1) but no spaces in header property declaration, and with sessionid in cookie too) results in the same 400 error with no data returned.

(3):

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

(only http header with X-CSRFToken, no cookie) results in error code 403, with message: CSRF cookie not set.

How can I test my form with curl? What factors am I not considering besides cookie values and http headers?

</div
              
 
 

Список ответов

30
 
vote
<Р> Смесь ответ Damien и ваш номер примера 2 работал для меня. Я использовал простую страницу входа в систему для тестирования, я надеюсь, что ваш вид регистрации похож. ответ Дамьена почти работает, но отсутствует кнопка <код> sessionid печенье. <Р> Я рекомендую более надежный подход. Вместо того, чтобы вручную вводить печенье из других запросов, попробуйте использовать локон встроенный в систему управления куки для имитации полного взаимодействия с пользователем. Таким образом, вы уменьшаете шанс сделать ошибку:
 <код> $ curl -v -c cookies.txt -b cookies.txt host.com/registrations/register/ $ curl -v -c cookies.txt -b cookies.txt -d "email=user@site.com&a=1&csrfmiddlewaretoken=<token from cookies.txt>" host.com/registrations/register/   
<Р> первый локон имитирует пользователь первого прибытия на страницу с запросом GET, и все необходимые куки сохраняются. Второй ротор имитирует заполнение полей формы и отправки их в качестве POST. Обратите внимание, что вы должны включать <код> csrfmiddlewaretoken поле данных POST, как это было предложено Дамиана.
 

A mixture of Damien's response and your example number 2 worked for me. I used a simple login page to test, I expect that your registration view is similar. Damien's response almost works, but is missing the sessionid cookie.

I recommend a more robust approach. Rather than manually entering the cookies from other requests, try using curl's built in cookie management system to simulate a complete user interaction. That way, you reduce the chance of making an error:

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

The first curl simulates the user first arriving at the page with a GET request, and all the necessary cookies are saved. The second curl simulates filling in the form fields and sending them as a POST. Note that you have to include the csrfmiddlewaretoken field in the POST data, as suggested by Damien.

</div
 
 
 
 
14
 
vote

попробуйте:

 <код> curl  -d "email=test@test.com&a=1"  http://127.0.0.1:8083/registrations/register/   
<Р> Обратите особое внимание на формат <код> -d аргумент. <Р> Однако, это, вероятно, не будет работать, как ваш взгляд, вероятно, необходим запрос POST вместо запроса GET. Так как это будет изменение данных, а не только возвращает информацию. защита <р> CSRF требуется только для 'опасных' запросов (POST, PUT, DELETE). Он работает путем проверки «csrftoken» печенье против либо «» csrfmiddlewaretoken поле формы или «X-CSRFToken» HTTP заголовок.

Так:

 <код> curl  -X POST  -d "email=test@test.com&a=1&csrfmiddlewaretoken={inserttoken}"  --cookie "csrftoken=[as above]"  http://127.0.0.1:8083/registrations/register/   
<Р> Это также можно использовать <код> --header "X-CSRFToken: {token}" вместо того, чтобы включить его в данные формы.
 

Try:

curl  -d "email=test@test.com&a=1"  http://127.0.0.1:8083/registrations/register/ 

Notice especially the format of the -d argument.

However, this probably won't work, as your view likely needs a POST request instead of a GET request. Since it will be modifying data, not just returning information.

CSRF protection is only required for 'unsafe' requests (POST, PUT, DELETE). It works by checking the 'csrftoken' cookie against either the 'csrfmiddlewaretoken' form field or the 'X-CSRFToken' http header.

So:

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

It's also possible to use --header "X-CSRFToken: {token}" instead of including it in the form data.

</div
 
 
   
   
8
 
vote

Я работал с лосовой, как это

    .
  • Вы должны отправить CSRftoken в заголовке в виде X-CSRFTOKEN.
  • Вы должны отправить данные формы в формате JSON. Демо,

сначала мы получим csrf_token & amp; магазин в 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": "/"} $   

Вы можете сохранить возврат новых CSRF_Token Session Cookie в том же файле или новом файле (я сохранил в том же файле, используя опцию -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   

Когда вы храните новую CSRF_Token & AMP; Сеанс ID Cookie в Cookie.txt, вы можете использовать же cookie.txt через веб-сайт.

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

Чтение и AMP; Отправка формы теперь работает с CSRF_Token & AMP; Идентификатор сеанса.

 <код> $curl --cookie cookie.txt http://localhost.com:8000/home/   
 

I worked with curl like this

  • You have to submit csrftoken in header as X-CSRFToken.
  • You have to submit form data in JSON format. Demo,

First we will fetch csrf_token & store in cookie.txt (or cookie.jar as they call it)

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

cookie.txt content

# 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 

Next we resend the username, password in json format. (you may send it in normal way). Check the json data escape.

$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": "/"} $ 

you can store the returns new csrf_token session cookie in same file or new file (I have stored in same file using option -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 

When you store new csrf_token & session id cookie in cookie.txt, you can use same cookie.txt across the website.

You am reading cookies from previous request from cookie.txt (--cookie) and writing new cookies from response in same cookie.txt (-c).

Reading & submitting form now works with csrf_token & session id.

$curl --cookie cookie.txt http://localhost.com:8000/home/ 
</div
 
 
 
 
4
 
vote

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

Откройте браузер E.g. Затем Chrome затем нажав F12 вкладку «Разработчик» и отслеживайте сеть, войдите в систему, используя учетные данные пользователя и получите токен CRSF от мониторинга поста

Тогда в Curl Execute:

 <код> 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

 

Here is how i did it, using the rest framework tutorial

open a browser e.g. chrome then pressing F12 open the developer tab and monitor the Network, login using your user credentials and get your CRSF token from monitoring the POST

then in curl execute:

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"}'  

I think its cleaner to not put the token in the body but rather the header using X-CSRFToken

</div
 
 
 
 
1
 
vote

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

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

 <код> echo -n YourPasswordHere | ./curl-auth-csrf.py -i http://127.0.0.1:8083/registrations/register/ -d 'email=test@test.com&a=1' http://127.0.0.1:8083/registrations/register/   

Это пройдет по данным поста, как указано, но также включить пароль, передаваемый через stdin. Я предполагаю, что страница, которую вы посещаете после «входа», - это та же страница.

Полное раскрытие: я автор CURL-AUTH-CSRF.

 

curl-auth-csrf is a Python-based open-source tool capable of doing this for you: "Python tool that mimics cURL, but performs a login and handles any Cross-Site Request Forgery (CSRF) tokens. Useful for scraping HTML normally only accessible when logged in."

This would be your syntax:

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

This will pass along the POST data as listed, but also to include the password passed via stdin. I assume that the page you visit after "login" is the same page.

Full disclosure: I'm the author of curl-auth-csrf.

</div
 
 
   
   
0
 
vote

<Код> X-CSRFToken в заголовках просто нужно одинаково с <код> csrftoken в cookie.

<Сильный> Пример:

 <код> # 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 0  
 

X-CSRFToken in headers just need be the same with csrftoken in cookie.

Example:

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

Связанный проблема

0  Запуск сценария Python со значениями от Views.py в Django  ( Running a python script with values from views py in django ) 
Я пытаюсь передать значение, которое я получил в просмотру .py файл в django в другой сценарий python, который я написал, но я понятия не имею, как это сделат...

1  Джанго пользователь Войти через апи [дубликат]  ( Django user login through api ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже имеет ответ здесь : ...

8  GUNICORN.Socket: не удалось с результатом результата «Service-Start-Limit-Hit»  ( Gunicorn socket failed with result service start limit hit ) 
Я развернул приложение Django, и оно не удалось, потому что по какой-то причине файл gunicorn.socket не был создан, хотя перед добавлением nginx он отлично ра...

0  Шаблон Django зацикливается через список  ( Django template looping through a list ) 
Я пытаюсь закрутить простую список, как <код> {% for x in y %} <p>My name is {{ x }}</p> {% endfor %} Мои вирины такие как это <код> def listloop(requ...

0  Настройки LDAP от Nginx в Django  ( Ldap settings from nginx to django ) 
Как передавать настройки LDAP из Nginx в django-auth-ldap? Настройки Nginx: <код> ldap_server YADRO { url ldap://testserver.com:389/dc=cor...

-3  Как публиковать данные в api api django  ( How to post data to django rest api ) 
У меня есть модель Django, которая выглядит как следующее: <код> [ { "ticker": "AAPL", "balance_sheet": [], "income_statement": ...

0  Объедините несколько столов для ответа JSON в Django Read Framework  ( Combine multiple tables for a json response in django rest framework ) 
Я использую Django Read Framework для моего serializers . Мне нужно создать веб-сервис, который сочетает в себе поля в трех таблицах и дает JSON. У меня ес...

0  Запрос доступа от класса Inherit (View)  ( Access request from inherit class view ) 
Как я могу предъявить запрос на var, если я не реализую методы Get / Post из класса Inherit (View)? <код> class Base(View): def __init__(self): ...

0  Вызов наборов запросов Django, когда пользователь нуждается в них  ( Calling django query sets when user needs them ) 
Я возвращаюсь и вперед с идеями, делая это, и никто из них не сработал, поэтому я попрошу идей. У меня есть модель под названием «Список», которые пользовател...

1  Не удалось не нулевое ограничение: attussaver_post.user_id  ( Not null constraint failed statussaver post user id ) 
Я пытаюсь сохранить данные пользователя через модельфу в Django. К сожалению, я наткнулся не против NULL CONSTRAINT: Statussaver_Post.user_id. Вот моя модель....

5  Как вставить 2 разных формы на одной и той же странице в Django  ( How insert 2 different forms on the same page in django ) 
Я должен вставить 2 формы на той же странице: 1) регистрационная форма 2) Форма входа . Так что, если я использую это в просмотру .py: <код> $(docume...

5  Django-HVAD - Как я должен установить значение переведенного поля при сохранении экземпляра модели?  ( Django hvad how should i set a translated field value while saving a model ins ) 
<Сильный> Фон: Я использую <Код> django-hvad и иметь <код> TranslatableModel . В своем TranslatedFields У меня есть <код> slug атрибут, который должен бы...

0  Python / django - Начало Apache с mod_wsgi  ( Python django starting apache with mod wsgi ) 
пытается запустить mod_wsgi. Получение опорной ошибки связанной с FMOD. <код> [root@host]# mod_wsgi-express start-server wsgi.py --port=80 > --user www...

0  Как обрабатывать кнопку Нажмите в проекте Django?  ( How to handle a button click in django project ) 
У меня есть форма, как показано ниже: <код> <form action="{% url clicked %}" method="get"> <input type="submit" value="Button" name="btn"/> </form> ...

2  Django Allauth - без проверки электронной почты для социальных пользователей  ( Django allauth no verification email for social users ) 
Я использую Django Allauth для потребностей Auth My Webse. Когда пользователь подписывает на мой сайт с социальной учетной записью - Google в основном (у ме...

Связанный проблема

0  Запуск сценария Python со значениями от Views.py в Django 
1  Джанго пользователь Войти через апи [дубликат] 
8  GUNICORN.Socket: не удалось с результатом результата «Service-Start-Limit-Hit» 
0  Шаблон Django зацикливается через список 
0  Настройки LDAP от Nginx в Django 
-3  Как публиковать данные в api api django 
0  Объедините несколько столов для ответа JSON в Django Read Framework 
0  Запрос доступа от класса Inherit (View) 
0  Вызов наборов запросов Django, когда пользователь нуждается в них 
1  Не удалось не нулевое ограничение: attussaver_post.user_id 
5  Как вставить 2 разных формы на одной и той же странице в Django 
5  Django-HVAD - Как я должен установить значение переведенного поля при сохранении экземпляра модели? 
0  Python / django - Начало Apache с mod_wsgi 
0  Как обрабатывать кнопку Нажмите в проекте Django? 
2  Django Allauth - без проверки электронной почты для социальных пользователей