没有Cookie的Ajax CSRF预防

时间:2015-01-13 13:31:54

标签: php ajax cookies csrf

鉴于step1.php带有经过身份验证的用户ID,使用Ajax调用step2.php,我想在step2.php内部验证它是step1.php合法调用而不是攻击者。我主要想防止冒充其他用户。我不在乎同一个用户多次打电话给我。我需要在不使用cookie的情况下这样做。

我正在尝试实现类似于here提到的“加密令牌模式”的逻辑。

以下是否足够安全,或者我忽略了什么:

// step1.php
$userId = xxx;
$timeStamp = yyy;
$token = encrFunc($userId, $timeStamp); // encrFunc involves key known only to server
/* Generate JS code to call step2.php, posting userId and token */

// step2.php
$userId = $_POST['userId'];
$token = $_POST['token'];
$origUserId = decrFunc($token); // decrFunc involves key known only to server
if ($userId == $origUserId) { /* Continue normally */ }
else { /* I have been attacked! */ }

1 个答案:

答案 0 :(得分:0)

看起来您正在从POST正文中提取UserId。您的基本主体是正确的,因为您根据令牌中的UserId声明验证登录用户,但是在POST正文中发送登录的UserId是不寻常的。理想情况下,这应该在HTTP AUTH标题中,尽管这不是重点。