当前位置: 首页 > 知识库问答 >
问题:

如何将curl与Django、csrf令牌和POST请求一起使用

赫连捷
2023-03-14

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

(在cookie中使用http头和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/

(如(1)中所示,但标头属性声明中没有空格,cookie中也有sessionid)会导致相同的400错误,并且没有返回任何数据。

(3):

curl
-d "{a:1}"
--header "X-CSRFToken:[as above]"
http://127.0.0.1:8083/registrations/register/

(只有带有X-CSRFToken,没有cookie的http头)导致错误代码403,消息为:未设置CSRF cookie。

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

共有3个答案

娄浩荡
2023-03-14

我是这样和curl一起工作的

  • 您必须以X-csrftoken的形式提交标头中的csrftoken
  • 您必须以JSON格式提交表单数据。演示

首先我们会csrf_token

$ curl -c cookie.txt http://localhost.com:8000/ 

曲奇文本内容

# 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_令牌会话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的内容。文本

# 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

当你储存新的csrf_token

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

阅读

$curl --cookie cookie.txt http://localhost.com:8000/home/
欧阳哲
2023-03-14

尝试:

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}”而不是将其包含在表单数据中。

万俟修诚
2023-03-14

Damien的回答和你的第二个例子混合在一起对我有效。我使用了一个简单的登录页面进行测试,我希望您的注册视图是类似的。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。第二个旋度模拟填充表单字段并将其作为POST发送。请注意,按照Damien的建议,您必须在POST数据中包含csrfmiddlewaretoken字段。

 类似资料:
  • 问题内容: 我正在尝试使用angular.js创建一个POST请求到这个Django视图。 因此,我创建了此资源。 在控制器中调用 get 方法可以正常工作。网址已翻译为。 我在执行更新/ POST方法时遇到问题。 该网址已转换为,其中缺少一个斜杠。如果在URL定义中不使用斜杠,可以很容易地避免这种情况。 代替 使用不带斜杠的变通方法,我现在得到403(禁止)状态代码,这可能是由于我未在POST请

  • 我试图创建一个带有动态预填充字段的Django表单:也就是说,当从下拉菜单中选择一个字段()时,其他字段会自动预填充相应的数据。为此,我希望在选择下拉选项后立即向服务器发送POST请求。 到目前为止,我已经尝试了以下模板(以下https://docs.djangoproject.com/en/2.0/ref/csrf/): 但是,当我选择一个下拉选项时,我会得到一个 新:17未捕获的语法错误:意外

  • 我正在使用Amazon SNS在我的HTTP/HTTPSendpoint上接收推送消息。endpoint应用程序是用Django编写的。要在endpoint(web app)上接收通知,HTTP/HTTPSendpoint需要订阅一个主题。 我的问题是当Amzaon SNS发送订阅确认时,它如何在POST请求中发送CSRF令牌,以便我处理请求并检索所需信息? 文档:http://docs.aws.

  • 问题内容: 我试图通过ajax从数据库中删除数据。 HTML: 我的ajax代码: 这是我从数据库中获取数据的查询… 但是当我单击删除链接数据未删除并显示csrf_token不匹配… 问题答案: 您必须在ajax请求中添加 数据 。我希望这样会有用。

  • 概述 我将使用API网关作为基于Spring Security性的身份验证。我刚刚按照https://spring.io/guides/tutorials/spring-security-and-angular-js/链接中的步骤创建了一个基于其对应的github项目的“对双”模块的项目https://github.com/spring-guides/tut-spring-security-and

  • 我是一个新手程序员。我一直在制作一个非常小的网站。我没有遇到什么错误。我找到了一些解决办法。但我还没有得到答案。 如果你不介意,请给我你的触摸。T^T 我连接了节点。js with Mysql'GET正在运行,没有任何问题。但是“POST”部分无法获取我在网页上键入的一些数据。 我想知道的是,为什么“POST”无法获取数据。 错误消息 TypeError:无法读取应用程序中未定义的属性“name”