【发布时间】:2021-01-26 23:32:00
【问题描述】:
我是 X-CSRF-Token 技术的新手,可以帮我检查一下吗?
<?php
if(!isset($_cookie['x_csrf_tocken'])){
setcookie('x_csrf_tocken', openssl_encode("random_string"), time()+86400);
}
?>
<meta name="csrf-token" content="<?php echo $_cookie['x_csrf_tocken']; ?>">
<script>
//for all ajax calls
$.ajaxSetup({
headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }
});
//first
$.ajax({
type: "POST",
url : "script.php",
data: {data: $('#data').val()},
success: function(data, textStatus){do something ...}
});
//another
$.ajax({
type: "POST",
url : "anotherScript.php",
data: {data: $('#anotherData').val()},
success: function(data, textStatus){do something else ...}
});
</script>
另一边(服务器端)应该是这样的:
if($_cookie['x_csrf_tocken'] == $_SERVER['HTTP_X-CSRF-TOKEN']){
finish !
}else{
busted ..
}
我不明白为什么攻击者不实现类似的脚本?
我怎样才能将这个技术用于普通表单提交?
另一个问题:为什么不使用数据库中的存储值而不是 cookie?
以及如何避免为每个表单设置隐藏输入:
$(document).on('submit','form',function(e){
$(this).append("<input type='hidden' name='x_csrf_tocken' value='"+$("meta[name='csrf-token']").attr("content")+"' />");
}
请尽量轻松回答...
【问题讨论】:
-
你从哪里得到
COOKIE_CSRF_TOKEN?你真的在创建一个合适的 CSRF 令牌吗?创建一个并将其定义为常数似乎很奇怪。我想看看为你创造这个价值的代码。 -
为了保护您的网站,您需要能够生成和验证 CSRF 令牌,这显示了您如何发送令牌但不显示您如何生成或验证它们所以我们不能说这是否是一种有效的方法。