我正在使用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头之外,我还没有考虑哪些因素?
我是这样和curl一起工作的
首先我们会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/
尝试:
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}”
而不是将其包含在表单数据中。
Damien的回答和你的第二个例子混合在一起对我有效。我使用了一个简单的登录页面进行测试,我希望您的注册视图是类似的。Damien的回答几乎有效,但缺少了sessionid
cookie。
我建议采用更稳健的方法。不要手动输入来自其他请求的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”