CORS 能防止 CSRF 吗?

Does CORS prevent CSRF?

我在 github 页面上有一个网站和一个联系表,其后端位于不同的域中。 从表单接收到的数据被远程发送到另一个域。这里使用了 CORS 策略。一切似乎都很好,但我对与 CSRF 相关的问题很感兴趣,在这种情况下如何实现它,是否有必要? CORS 是否可以防止 CSRF?

const form = document.getElementById('contact_form');
form.addEventListener('submit', function(e) {
  e.preventDefault();
  const send = {
    name: document.querySelector('input[name=name]').value,
    email: document.querySelector('input[name=email]').value,
    subject: document.querySelector('input[name=subject]').value,
    message: document.querySelector('input[name=message]').value
// token: document.querySelector('input[name=token]').value// 
//When the backend was on the same domain as the contact form, I checked the //token this way.
  };
  const jsonString = JSON.stringify(send);
  const xhr = new XMLHttpRequest();
  const action = form.getAttribute('action');
  xhr.open('POST', action, true);
  xhr.setRequestHeader('Content-type', 'text/plain');
  xhr.onload = function() {
        if (this.readyState == 4 && this.status == 200) {
          alert(xhr.responseText);
    };
  xhr.send(jsonString);
});
// if(empty($_SESSION['token'])) {
//     $_SESSION['token'] = bin2hex(random_bytes(32));
//   };
header('Access-Control-Allow-Origin: http://dynamicportfolio.com');
header("Access-Control-Request-Method: GET, POST");
header('Access-Control-Allow-Headers: accept, origin, content-type');
 $object = file_get_contents('php://input');
 $request = json_decode($object);

if(isset($request)){
//if($request->token == $_SESSION['token']){
     //We load data into the database.
   //};
};

表格:

<form class="wrapper" id="contact_form" action="http://form/configs/form.php" method="POST">
            <div class="app-form-group">
              <input class="app-form-control" type="text" name="name" placeholder="Name"  maxlength="50">
            </div>
            <div class="app-form-group">
              <input class="app-form-control" type="email" name="email" placeholder="test@gmail.com"  maxlength="50">
            </div>
            <div class="app-form-group">
              <input class="app-form-control" type="text" name="subject" placeholder="Subject" maxlength="50">
            </div>
            <div class="app-form-group message">
              <input class="app-form-control" type="text" name="message" placeholder="Message" >
            </div>
<div>
             <!-- <input type="hidden" name="token" value="<?= $_SESSION['token']; ?>">-->
            </div>
            <div class="app-form-group buttons">
              <button type="submit" class="app-form-button">Send</button>
            </div>
          </form>

不,不是。同源策略应该阻止它,但从安全角度来看这是一个糟糕的笑话。 https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy 我不确定它允许什么,几年前它所做的只是发送请求但在某些情况下阻止响应。因此,您可以 POST 使用某人的会话 cookie,并且如果没有 CSRF 令牌或额外的问题(例如需要以前的密码),那么您就可以更改某人的密码。您需要使用 CSRF 令牌。从 CORS 开始,它放宽了同源策略,允许访问来自特定源的响应,并允许更多奇特的方法,如带有预检的 PUT 和 DELETE。