使用CSRF的POST请求在Postman中工作但在cURL中失败

时间:2016-12-14 11:01:38

标签: rest curl cookies csrf postman

我向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 =
  •   
  • 缓存控制:无缓存
  •   
  • Postman-Token:76a7a43b-f407-15a2-aaff-5242b44d0f47
  •   
  • 内容长度:31281
  •   
  • 期待:100-continue
  •   
  • 内容类型:multipart / form-data;边界= ---- WebKitFormBoundary7MA4YWxkTrZu0gW;   边界= ------------------------ 742d3475ac5f6aba
  •   
  • <找到HTTP / 1.1 302
  •   
  • < Set-Cookie:JSESSIONID = 1qfjmbntrthxll; Path = / api<到期日: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=Access拒绝
  •   
  • <内容长度:0
  •   
  • <服务器:Jetty(9.2.17.v20160517)
  •   
  • 发送结束前的HTTP错误,停止发送
  •   
  • 关闭连接0
  •   

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

任何有关搜索地点的想法和方向都将非常受欢迎!!!

4 个答案:

答案 0 :(得分:1)

如此post中所述,添加以下选项

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

一起
-H "X-CSRFToken: XXXXX" 

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

最后,事实证明会话ID是必需的(在cURL中添加JSESSIONID解决了该问题)。

答案 3 :(得分:-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"