55

我正在使用 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 标头和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/

(如 (1) 中,但在 header 属性声明中没有空格,并且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 not set。

如何使用 curl 测试我的表单?除了 cookie 值和 http 标头之外,我没有考虑哪些因素?

4

6 回答 6

34

达米安的回应和你的例子 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/

第一个 curl 模拟用户首次使用 GET 请求到达页面,并保存所有必要的 cookie。第二个 curl 模拟填写表单字段并将它们作为 POST 发送。请注意,您必须按照csrfmiddlewaretokenDamien 的建议在 POST 数据中包含该字段。

于 2013-09-12T19:02:59.477 回答
15

尝试:

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

特别注意参数的格式-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/

也可以使用--header "X-CSRFToken: {token}"而不是将其包含在表单数据中。

于 2012-05-17T01:03:12.153 回答
8

我像这样使用 curl

  • 您必须在标头中提交 csrftoken 作为 X-CSRFToken。
  • 您必须以 JSON 格式提交表单数据。演示,

首先,我们将获取 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": "/"}
$

您可以将返回的新 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 的内容

# 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 和会话 id cookie 时,您可以在整个网站上使用相同的 cookie.txt。

您正在从 cookie.txt (--cookie) 的先前请求中读取 cookie,并从同一 cookie.txt (-c) 中的响应中写入新的 cookie。

阅读和提交表单现在可以使用 csrf_token 和会话 id。

$curl --cookie cookie.txt http://localhost.com:8000/home/
于 2015-05-15T10:24:49.440 回答
4

这是我使用其余框架教程的方法

打开浏览器,例如 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"}' 

我认为不将令牌放入正文而是使用 X-CSRFToken 将标头放入更清洁

于 2014-12-31T09:21:39.207 回答
1

curl-auth-csrf是一个基于 Python 的开源工具,能够为您执行此操作:“模仿 cURL,但执行登录并处理任何跨站点请求伪造 (CSRF) 令牌的 Python 工具。对于正常抓取 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 数据,但也包括通过标准输入传递的密码。我假设您在“登录”后访问的页面是同一页面。

全面披露:我是 curl-auth-csrf 的作者。

于 2016-01-23T03:33:17.837 回答
0

X-CSRFTokenin headers 只需要与csrftokenin cookie 相同。

例子:

curl -v http://www.markjour.com/login/ -H "X-CSRFToken: 123" -b "csrftoken=123" -d "username=admin&password=admin"
于 2016-07-22T08:40:34.077 回答