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。
我在 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。