我有一个用于获取和检查令牌的令牌类和方法。
如果我在链接中吐出新的令牌:
<td><a href="users.php?delete=<?=$user['id'].'&token='.Token::generate();?>
这是课堂上的功能:
public static function generate(){
return $_SESSION['token'] = base64_encode(openssl_random_pseudo_bytes(32));
}
如果只是在该表的下方,我回显出$ _SESSION ['token']它会在链接中显示一个完全不同的令牌。我很困惑。
编辑:这是页面的整个部分,显示了初始令牌创建和回显:
<td><a href="users.php?delete=<?=$user['id'].'&token='.Token::generate();?>" class="btn btn-sm btn-default<?=(($user['id'] == $user_data['id'])?' disabled':'');?>" data-toggle="tooltip" title="delete user"><span class="glyphicon glyphicon-remove"</a></td>
<td><?=$user['full_name'];?></td>
<td><?=$user['email'];?></td>
<td><?=clean_date($user['join_date']);?></td>
<td><?php
if (new DateTime($user['last_login']) < new DateTime("2015-05-15 16:00:00")) {
echo 'Never';
} else {
echo clean_date($user['last_login']);
};?></td>
<td><?=$user['permissions'];?></td>
</tr>
<?php endwhile ;?>
</tbody>
</table>
<?=$_SESSION['token'];?>
here's a screenshot showing the two values are completely different
答案 0 :(得分:1)
我将假设您尝试创建一次生成单例,即生成一次的值,然后以相同的方式重新评估。
试试这个:
class Token
{
public static function generate(){
static $token;
if (null === $token) {
$_SESSION['token'] = $token = unpack('H*', openssl_random_pseudo_bytes(32))[1];
}
return $token;
}
}
答案 1 :(得分:0)
似乎我只需要替换生成的令牌中的所有+符号:
.map(Function.call, String.prototype.trim)
编辑:这更好:
$token = str_replace('+','p',$token);