如何使用卷曲Django的,CSRF令牌和POST请求(How to use curl with D

2019-06-24 13:08发布

我使用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头?

Answer 1:

达米安的回应和你的榜样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数据字段,达米安的建议。



Answer 2:

尝试:

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}" ,而不是把它放置在表单数据。



Answer 3:

我用卷曲像这样工作

  • 你必须在标题为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/


Answer 4:

这里是我做到了,用其余的框架教程

打开浏览器,如铬,然后按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



Answer 5:

卷曲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的作者。



Answer 6:

X-CSRFToken在头只需要与同csrftoken中的cookie。

例:

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


文章来源: How to use curl with Django, csrf tokens and POST requests