我正在使用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/
(with HTTP头和cookie中的csrftoken
)将导致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/
(as在(1)中,但在信头属性宣告中没有空格,而且在cookie中也有sessionid
)会导致相同的400错误,而且不会传回任何数据。
(3):
curl
-d "{a:1}"
--header "X-CSRFToken:[as above]"
http://127.0.0.1:8083/registrations/register/
(only具有X-CSRFToken
的HTTP报头,没有cookie)导致错误代码403,消息为:未设置CSRF cookie。
我如何用curl测试我的表单?除了cookie值和http头,我没有考虑哪些因素?
6条答案
按热度按时间qqrboqgw1#
Damien的回答和你的例子2的混合对我很有效。我用一个简单的登录页面来测试,我希望你的注册视图是类似的。Damien的回答几乎有效,但是缺少
sessionid
cookie。我推荐一种更健壮的方法。与其手动输入来自其他请求的cookie,不如尝试使用curl内置的cookie管理系统来模拟完整的用户交互。这样,您就可以减少出错的几率:
第一个curl模拟用户第一次通过GET请求到达页面,并保存所有必要的cookie。第二个curl模拟填写表单字段并将其作为POST发送。注意,您必须在POST数据中包括
csrfmiddlewaretoken
字段,如Damien所建议的。ruoxqz4g2#
请尝试:
请特别注意
-d
参数的格式。然而,这可能不起作用,因为您的视图可能需要POST请求而不是GET请求,因为它将修改数据,而不仅仅是返回信息。
只有“不安全”的请求(POST、PUT、DELETE)才需要CSRF保护。它的工作原理是根据"csrfmiddlewaretoken“表单字段或”X-CSRFToken“http标头检查”csrftoken“Cookie。
因此:
也可以使用
--header "X-CSRFToken: {token}"
,而不是将其包含在表单数据中。cig3rfwq3#
我 和 curl 一起 工作 的 时候
首先 , 我们 将 获取 csrf _ token 并 存储 在 cookie.txt ( 或 他们 所 称 的 cookie.jar ) 中
中 的 每 一 个
cookie.txt 内容
格式
接下来 我们 重新 发送 json 格式 的 用户 名 和 密码 。 ( 你 可以 用 正常 的 方式 发送 ) 。 检查 json 数据 转义 。
格式
您 可以 将 返回 的 新 csrf _ token 会话 cookie 存储 在 同一 个 文件 或 新 文件 中 ( 我 已经 使用 选项 - c 将 其 存储 在 同一 个 文件 中 ) 。
格式
格式
当 您 在 cookie.txt 中 存储 新 的 csrf _ token 和 会话 ID cookie 时 , 您 可以 在 整个 网站 上 使用 相同 的 cookie.txt 。
您 正在 从 cookie.txt ( - - cookie ) 中 读取 来自 上 一 个 请求 的 cookie , 并 在 同一 cookie.txt ( - c ) 中 写入 来自 响应 的 新 cookie 。
读取 和 提交 表单 现在 可以 使用 csrf _ token 和 会话 ID 。
格式
jfgube3f4#
下面是我如何使用rest框架教程完成的。
打开浏览器(例如chrome),然后按F12,打开开发人员选项卡并监控网络,使用您的用户凭据登录,并通过监控POST获取您的CRSF令牌
然后在curl中执行:
我认为使用X-CSRFToken不将令牌放在主体中而是放在标头中会更干净一些
aydmsdu95#
curl-auth-csrf是一个基于Python的开源工具,能够为您完成以下任务:Python工具,模仿cURL,但执行登录并处理任何跨站请求伪造(CSRF)令牌。用于抓取通常只有在登录时才能访问的HTML。
您的语法如下:
这将沿着的POST数据,但也包括通过stdin传递的密码。我假设您在“登录”后访问的页面是同一个页面。
充分披露:我是“卷发验证”的作者。
m0rkklqb6#
为了让Curl-Django的沟通工作正常,我必须提供
X-CSRFToken
报头字段中的CSRF令牌;Cookie
报头字段中的CSRF令牌;次失败的尝试
如果我省略了
X-CSRFToken
头字段中的CSRF标记,我会得到一个403 (Forbidden)
状态代码:如果我省略了
Cookie
头字段中的CSRF标记,我会得到一个403 (Forbidden)
状态代码:如果省略了
Cookie
头字段中的会话标识符,则会得到一个401 (Unauthorized)
状态代码: