【问题标题】:X-CSRF-Token implement guideX-CSRF-Token 实施指南
【发布时间】: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 令牌,这显示了您如何发送令牌但不显示您如何生成或验证它们所以我们不能说这是否是一种有效的方法。

标签: php ajax csrf


【解决方案1】:

对于普通表单,在&lt;form&gt;&lt;/form&gt; 标签内有一个隐藏的表单域。像这样:

<form method="post" action="/foo">
    <input type="hidden" name="X-CSRF-TOKEN" value="$your_csrf_token">
    // your other input types...
</form>

所以在提交表单时,您也将提交 csrf 令牌。

【讨论】:

  • 谢谢我的工作是正确的?那么另一个问题呢:为什么不使用数据库中的存储值而不是 cookie?
  • 对于你的问题的第二部分@12,请参阅这篇关于 CSRF 保护如何工作的文章medium.com/@barryvdh/… 它关于 laravel,但要点仍然是相关的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 2011-07-13
  • 2017-05-23
相关资源
最近更新 更多