用于表单和身份验证的PHP令牌


PHP Tokens for Forms and Authentication

我有一个关于令牌的问题。我知道它们是用于安全目的的随机字符,但它们是如何工作的,它们能防止什么?

身份验证机制在显示表单时创建一个令牌,并将其存储在服务器端。身份验证机制还将令牌作为隐藏输入添加到表单中。当您发送它时,身份验证系统会检查它是否在服务器端存储中。如果找到令牌,身份验证过程将继续,并且已删除令牌。

它可以防止垃圾邮件形式的动作脚本。

与注销url一起使用的示例:

<?php 
// Generate token
$logout_token = md5(microtime().random(100, 999));
session_start();
// Store token in session
if (!is_array($_SESSION['logout_tokens']) {
    $_SESSION['logout_tokens'] = array();
}
$_SESSION['logout_tokens'][] = $logout_token;
?>
<a href="/logout/?logout_token=<?= $logout_token ?>">logout</a>

处理注销的脚本:

<?php
$done = false;
if (!empty($_GET['logout_token'])) {
    // Get token from url
    $logout_token = $_GET['logout_token'];
    session_start();
    if (!is_array($_SESSION['logout_tokens']) {
        $_SESSION['logout_tokens'] = array();
    }
    // Search get token in session (server-side storage)
    if (($key = array_search($logout_token, $_SESSION['logout_tokens'], true)) !== false) {
        // Remove used token from storage
        unset($_SESSION['logout_tokens'][$key]);
        // Do logout
        $done = true;
    }
}
if ($done === false) {
   echo "Something went wrong.";
}