Tri*_*daz 44 django curl csrf django-forms django-csrf
我正在使用curl测试我的一个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/
Run Code Online (Sandbox Code Playgroud)
(使用http标头和csrftokencookie)导致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/
Run Code Online (Sandbox Code Playgroud)
(如在(1)中但在头属性声明中没有空格,并且sessionid在cookie中也没有空格)导致相同的400错误而没有返回数据.
(3):
curl
-d "{a:1}"
--header "X-CSRFToken:[as above]"
http://127.0.0.1:8083/registrations/register/
Run Code Online (Sandbox Code Playgroud)
(只有http标头X-CSRFToken,没有cookie)会导致错误代码403,并显示消息:未设置CSRF cookie.
如何用卷曲测试我的表单?除了cookie值和http标头之外,我还没有考虑哪些因素?
Kev*_* S. 29
Damien的回应和你的例子2的混合物为我工作.我使用一个简单的登录页面进行测试,我希望您的注册视图类似.Damien的回应几乎可以奏效,但却错过了sessionidcookie.
我建议采用更强大的方法.不要手动从其他请求输入cookie,而是尝试使用curl内置的cookie管理系统来模拟完整的用户交互.这样,您可以减少出错的可能性:
$ 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/
Run Code Online (Sandbox Code Playgroud)
第一个curl模拟用户首先通过GET请求到达页面,并保存所有必需的cookie.第二个curl模拟填写表单字段并将其作为POST发送.请注意,您必须按照csrfmiddlewaretokenDamien的建议在POST数据中包含该字段.
Dam*_*ers 14
尝试:
curl
-d "email=test@test.com&a=1"
http://127.0.0.1:8083/registrations/register/
Run Code Online (Sandbox Code Playgroud)
特别注意-d参数的格式.
但是,这可能不起作用,因为您的视图可能需要POST请求而不是GET请求.因为它将修改数据,而不仅仅是返回信息.
只有"不安全"的请求(POST,PUT,DELETE)才需要CSRF保护.它的工作原理是根据'csrfmiddlewaretoken'表单字段或'X-CSRFToken'http标头检查'csrftoken'cookie.
所以:
curl
-X POST
-d "email=test@test.com&a=1&csrfmiddlewaretoken={inserttoken}"
--cookie "csrftoken=[as above]"
http://127.0.0.1:8083/registrations/register/
Run Code Online (Sandbox Code Playgroud)
也可以使用--header "X-CSRFToken: {token}"而不是将其包含在表单数据中.
这是我使用其余框架教程的方法
打开浏览器(例如 chrome),然后按 F12 打开开发人员选项卡并监控网络,使用您的用户凭据登录并通过监控 POST 获取 CRSF 令牌
然后在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"}'
Run Code Online (Sandbox Code Playgroud)
我认为不将令牌放在正文中而是使用 X-CSRFToken 放在标头中更干净
我像这样卷曲
首先,我们将获取csrf_token并存储在cookie.txt(或他们称之为cookie.jar)中
$ curl -c cookie.txt http://localhost.com:8000/
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
接下来,我们以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": "/"}
$
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
-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
Run Code Online (Sandbox Code Playgroud)
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/
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
50153 次 |
| 最近记录: |