首页 文章

CSRF的POST请求在Postman中有效,但在cURL中失败

提问于
浏览
0

我向REST API发出POST请求以上传文件 . 在邮递员一切正常 . 我添加了从服务器获取的基本授权和自定义CSRF(XSRF)令牌 .

我想用cURL做同样的事情 . 我从Postman复制了代码,但似乎没有用 . 我认为错误与CSRF有关,因为如果我关闭服务器上的CSRF并在没有CSRF令牌的情况下进行相同的cURL调用,一切正常 .

现在更多细节:这就是Postman给出的cURL命令:

curl -X POST -H "XSRF: 79f51981-8e85-4e26-be1b-bf63aed92a42" -H "Authorization: Basic bbhjbjb=" -H "Cache-Control: no-cache" -H "Postman-Token: 76a7a43b-f407-15a2-aaff-5242b44d0f47" -H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW" -F "package=@C:\Downloads\hello-world.zip" "http://host:port/api/import"

这就是我得到的回复--verbose

不支持名称查找超时尝试:: 1 ...连接到localhost(:: 1)端口7777(#0)POST / api / import HTTP / 1.1主机:localhost:7777 User-Agent:curl / 7.47 . 1接受:/ XSRF:79f51981-8e85-4e26-be1b-bf63aed92a42授权:基本bbhjbjb = Cache-Control:no-cache Postman-Token:76a7a43b-f407-15a2-aaff-5242b44d0f47内容长度:31281期望:100-continue内容类型:multipart / form-data;边界= ---- WebKitFormBoundary7MA4YWxkTrZu0gW; boundary = ------------------------ 742d3475ac5f6aba <HTTP / 1.1 302 Found <Set-Cookie:JSESSIONID = 1qfjmbntrthxll; Path = / api <Expires:Thu ,1970年1月1日00:00:00 GMT <Set-Cookie:XSRF = b29bd143-cc80-49ad-b495-711125678o; Path = /; Expires = Thu,15-Dec-2016 10:28:46 GMT <XSRF:b29bd143 -cc80-49ad-b495-711125678o <位置:http:// localhost:7777 / api / login / error.jsp?errorMessage =拒绝访问<Content-Length:0 <服务器:Jetty(9.2.17.v20160517)HTTP错误在发送结束之前,停止发送关闭连接0

我可能在这里遗漏了一些非常明显的东西,但不知道还有什么 . 看起来我被重定向到登录页面,没有正确认证,但不知道为什么(我在cURL中发送XSRF) . 我也试过在cURL中添加sessionid - 也没用 .

关于在哪里搜索的任何想法和方向将非常感谢!!!

3 回答

  • 1

    post中所述,添加以下选项

    --cookie "csrftoken=XXXXXX;sessionid=YYYYYYY"
    

    随着

    -H "X-CSRFToken: XXXXX"
    
  • 0

    目前还不清楚您的服务器端代码是如何实现的 . 这里可以看到一个明显的区别是请求头 User-Agent: curl/7.47.1 中的UserAgent字符串 . 您可以尝试在卷曲请求中添加 -A "Mozilla/5.0" .

    关于上述关于XSRF一次性令牌的评论;您的服务器正在返回 Set-Cookie 标头作为响应 . 邮递员可能会将其用作第二次请求的cookie,这就是为什么它一遍又一遍地为它工作的原因 . 您可以尝试在卷曲结束时添加 -H "Cookie: XSRF=b29bd143-cc80-49ad-b495-711125678o" ,看看是否有任何区别 .

    这些都是疯狂的猜测 . 最好在服务器端添加一些可以打印请求标头的代码 . 然后提出两个请求,一个来自卷曲,另一个来自邮递员 . 之后检查请求标头之间的差异 . 这会给你一些线索 .

  • -1

    如果没有关于服务器端代码的更多信息,我也不确定 . 如果您是从cURL而不是Postman拨打电话,您真的需要Postman-Token标头吗?如果从代码中删除-H“Postman-Token:76a7a43b-f407-15a2-aaff-5242b44d0f47”,它可能会有效 .

    curl -X POST -H "XSRF: 79f51981-8e85-4e26-be1b-bf63aed92a42" -H "Authorization: Basic bbhjbjb=" -H "Cache-Control: no-cache" -H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW" -F "package=@C:\Downloads\hello-world.zip" "http://host:port/api/import"
    

相关问题