我使用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/
(以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
在饼干太)在相同的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值和HTTP头?
达米安的回应和你的榜样2混合数目为我工作。 我用一个简单的登录页面来测试,我期待你的报名看法是相似的。 达米安的反应差不多的工作,但缺少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=user@site.com&a=1&csrfmiddlewaretoken=<token from cookies.txt>" host.com/registrations/register/
第一卷曲模拟用户首先到达一个GET请求的页面,和所有必要的cookie被保存。 第二卷曲摸拟填充所述表单字段和发送它们作为POST。 请注意,您必须包括csrfmiddlewaretoken
在POST数据字段,达米安的建议。
尝试:
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}"
,而不是把它放置在表单数据。
我用卷曲像这样工作
- 你必须在标题为X-CSRFToken提交csrftoken。
- 你必须以JSON格式提交表单数据。 演示,
首先我们将获取在cookie.txt csrf_token和存储(或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会话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
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
#HttpOnly_localhost.com FALSE / FALSE 1432877016 sessionid cg4ooly1f4kkd0ifb6sm9p
当存储在cookie.txt新csrf_token和会话cookie,你可以使用相同的cookie.txt整个网站。
您是来自于同一cookie.txt(-c)响应读取来自cookie.txt(--cookie),并写入新的饼干从以前的请求中的Cookie。
阅读与提交表单现在与csrf_token和会话ID。
$curl --cookie cookie.txt http://localhost.com:8000/home/
这里是我做到了,用其余的框架教程
打开浏览器,如铬,然后按F12打开开发人员选项卡,然后使用您的用户凭据监控网络,登录和监控POST让您CRSF令牌
然后在卷曲执行:
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
卷曲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/
这将沿中所列的POST数据传递,而且还包括通过标准输入传递的密码。 我假设你“登陆”后,访问的页面是一样的页面。
披露:我的卷翘AUTH-CSRF的作者。
X-CSRFToken
在头只需要与同csrftoken
中的cookie。
例:
curl -v http://www.markjour.com/login/ -H "X-CSRFToken: 123" -b "csrftoken=123" -d "username=admin&password=admin"