避免csrfjavascript

避免csrfjavascript,javascript,php,ajax,csrf,Javascript,Php,Ajax,Csrf,我对网络安全相当陌生。我想知道用javascript在请求上使用令牌来再次保护CSRF的正确方法是什么。有人能给我看一个代码示例吗?我知道如何正确处理带有提交按钮的表单 dataType: "text", url: '/username.php', data: 'username=' + $('#username').val() + '&Rand=' + (Math.random()*10000), type: 'GET', 这是我脚本中

我对网络安全相当陌生。我想知道用javascript在请求上使用令牌来再次保护CSRF的正确方法是什么。有人能给我看一个代码示例吗?我知道如何正确处理带有提交按钮的表单

dataType: "text",
            url: '/username.php',
data: 'username=' + $('#username').val() + '&Rand=' + (Math.random()*10000),
            type: 'GET',

这是我脚本中的示例代码。它只是搜索一个用户名,然后返回它是否被使用。我们如何通过Javascript发送令牌并在username.php上验证它?谢谢你

如果你知道如何在表单上使用提交按钮,那就没什么不同了。 令牌生成必须在服务器上完成并存储,无论发生什么情况

即使您使用的是Javascript,您也在使用PHP来输出包含Javascript代码的页面,对吗

下面是一个非常快速的代码示例:

输出javascript的PHP文件的代码:

<?
$token =  md5( mt_rand() . session_id() );
$_SESSION['token:'.$token] = true;
?>
dataType: "text",
        url: '/username.php',
data: 'username=' + $('#username').val() + '&token=' + '<?=$token?>',
        type: 'GET',
注意,上面的示例有一些问题,例如当您多次打开同一页面时,令牌将被更新,等等。因此,它不是一个可供生产使用的代码。[更新]我更新了代码以解决令牌将被续订的问题。。。问题

但你明白了

在服务器上生成令牌,在javascript中使用该令牌,然后在username.php中对其求值


另外,如果您的javascript是一个外部脚本文件,只需将其作为全局变量加载到加载javascript的页面上,并在外部javascript文件中使用该变量即可

您需要在服务器端生成令牌并将其存储,否则在form-submit上无法与之进行比较。当您多次打开相同的令牌时,令牌将被续订是什么意思?顺便说一下,谢谢你帮我清理一下。例如,如果我在多个浏览器中用javascript打开页面,我会称它们为browserA和browserB,$_会话['token']只存储browserB的令牌,因为它会覆盖browserA的令牌。在这种情况下,如果browserA执行username.php,则令牌检查将失败。从这种意义上讲,这个示例代码在现实世界中的使用非常糟糕。。。所以,当你实施这个时,请小心。有什么替代方法呢?我认为有几种方法。让我编辑我的代码来编写解决方案更新我的答案。这只是一种方法,我相信还有其他方法可以解决这个问题。无论哪种方式,只要您了解在javascript中使用CSRF令牌的基本概念,我相信您可以继续前进:
if ( $_SESSION["token:".$_POST["token"]] == true ){
    exit();
} else {
    unset($_SESSION["token:".$_POST["token"]]);
}