避免CSRF Javascript

时间:2013-10-20 02:26:38

标签: javascript php ajax csrf

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

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

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

1 个答案:

答案 0 :(得分: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',

您的username.php:

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

请注意,上面的示例存在一些问题,例如“当您多次打开同一页面时令牌将会更新”,而不是。因此,它不是准备用于生产的代码。 [更新]我更新了代码以解决“令牌将续订...”问题。

但是你明白了。

在服务器上生成令牌,在您的JavaScript中使用令牌,然后在username.php中对其进行评估。

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