1

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

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

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

4

1 回答 1

0

如果您知道如何在带有提交按钮的表单上执行此操作,那并没有什么不同。无论如何,令牌生成必须在服务器上完成并存储。

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

所以一个非常快速的代码示例可能如下:

输出您的 javascript 的 PHP 文件的代码:

<?
$token =  md5( mt_rand() . session_id() );
$_SESSION['token:'.$token] = true;
?>

你的JavaScript:

dataType: "text",
        url: '/username.php',
data: 'username=' + $('#username').val() + '&token=' + '<?=$token?>',
        type: 'GET',

您的用户名.php:

if ( $_SESSION["token:".$_POST["token"]] == true ){
    exit();
} else {
    unset($_SESSION["token:".$_POST["token"]]);
}

注意,上面的例子有一些问题,比如“多次打开同一个页面,token会被更新”等等。所以它不是一个准备好用于生产的代码。[更新] 我更新了代码以解决“令牌将被更新......”问题。

但你明白了。

在服务器上生成令牌,在您的 javascript 中使用该令牌,然后在您的username.php.

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

于 2013-10-20T03:18:36.457 回答