CORS能防止CSRF吗

  • 本文关键字:CSRF CORS cors 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我不确定它允许什么,几年前它所做的只是发送请求,但在某些情况下阻止响应。因此,您可以使用someones会话cookie进行POST,如果不需要CSRF令牌或像以前的密码那样的额外问题,那么您就可以更改someones密码。您需要使用CSRF令牌。从CORS开始,它放宽了同源策略,允许访问来自某些源的响应,并允许使用更奇特的方法,如带有preflight的PUT和DELETE。

最新更新