【问题标题】:PUT Request turns into OPTIONS Request with no follow up due to CORS由于 CORS,PUT 请求变成了 OPTIONS 请求,没有跟进
【发布时间】:2017-07-03 18:17:41
【问题描述】:

我想要完成的工作:

所以我正在尝试创建一个 CSRF 的 POC,但是服务器需要一个 x-csrf-token; 应该使它不可能。但是,我找到了一种(非常简单)的方法来发送始终有效的 x-csrf-token。所以我想创建一个关于如何更改密码并发送 X-CSRF-token 的 POC; AJAX 应该完成这项工作。

到目前为止的代码:

 <html>
<button type="button" onclick="loadDoc()">execute</button>

<script>
function loadDoc() {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("demo").innerHTML = this.responseText;
    }
  };
  xhttp.open("PUT", "http://www.example.com/changepassword", true);
  xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); //is "application/x-www-form-urlencoded" right?
  xhttp.setRequestHeader('X-CSRF-Token', "ThatOneValidToken");
  xhttp.send("{\"password\":\"POC-CSRF-PASSWORD\"}");
}
</script>

</html>

问题:

但是,由于 CORS,这个 PUT 请求变成了一个 OPTIONS 请求,然后没有后续的 PUT 请求。对这个 OPTIONS 请求的响应只是一个简单的

HTTP/1.1 404 未找到

问题:

由于它是我不拥有的外部服务器(解释了 POC),我无法更改服务器。我可以以某种方式更改请求,以便我仍然可以执行 POC;换句话说,就我的想象而言,我是否可以绕过这个 OPTIONS 请求或修改该请求,以确保这个 OPTIONS 预检请求得到后续的 PUT 请求?

提前致谢,如果您有解决方案(如果这在 stackoverflow 上是合法的),会给您买一杯友好的咖啡

【问题讨论】:

标签: javascript ajax cors csrf put


【解决方案1】:

不使用客户端代码。

跨域 PUT 请求需要预检。

带有非标准标头的跨域请求需要预检。

通过另一台服务器代理请求是您唯一的选择。

【讨论】:

  • 啊,谢谢!你对如何实现这一点有什么建议吗?
  • 因为我仍然需要 www.example.com 上的人的 cookie
  • 你买不到的。看起来服务器毕竟不容易受到您的 CSRF 攻击。
  • 那么实际上,如果服务器对所有事情都使用 PUT/DELETE,它根本不需要 X-CSRF-Tokens?
猜你喜欢
  • 2021-02-21
  • 2018-03-20
  • 2014-12-27
  • 2017-09-30
  • 2023-03-14
  • 2015-03-01
  • 2015-06-11
  • 2015-09-01
  • 2018-11-19
相关资源
最近更新 更多