• 安全的 PHP 注销脚本


    这是一个简短的 PHP 教程,介绍如何创建一个简单的用户注销脚本来防范CSRF 攻击

    CSRF 攻击。

    如果您还不知道,CSRF代表Cross-Site Request Forgery,这是一种攻击类型,可以欺骗毫无戒心的用户去做他们不打算做的事情。

    在我们的注销系统的上下文中,此类攻击可用于诱骗毫无戒心的用户注销网站。

    例子。

    让我们看一下下面的示例,它假设您的注销脚本位于 logout.php:

    http://google.com
    

    上面的 HTML 链接看起来像是指向 Google 网站的链接。但是,如果毫无戒心的用户单击它,他们将退出系统。

    会话令牌。

    当用户登录您的网站时,您应该向他们提供加密安全令牌。然后,此令牌可用于验证某些操作并防范 CSRF 攻击。

    登录脚本中可能包含的示例:

    1. //start the session.
    2. session_start();
    3. /**
    4. * The code below should be executed after the user has successfully logged in.
    5. * It can also be executed whenever you need to
    6. * give the user a new token.
    7. */
    8. //create a cryptographically secure token.
    9. $userToken = bin2hex(openssl_random_pseudo_bytes(24));
    10. //assign the token to a session variable.
    11. $_SESSION['user_token'] = $userToken;
    12. //redirect user to home page
    13. header('Location: home.php');
    14. exit;

    在上面的 PHP 代码中,我们创建了一个令牌并将其分配给一个会话令牌。

    我们的注销链接。

    指向 PHP 注销脚本的 HTML 链接应如下所示:

    Logout
    

    如您所见,我们在用户登录系统时提供给用户的安全令牌已以称为“令牌”的 GET 参数的形式附加到链接中。

    单击此类链接将导致一个 URL,例如:

    logout.php?token=27b87f10bb05279a749f19396b34d9550e7945213bec9d36

    这将使我们的 PHP 注销脚本知道当用户单击注销按钮时正在使用什么令牌。

    我们的 PHP 注销脚本。

    最后,在我们的 PHP 注销脚本中,我们通过将查询字符串中的令牌与存储在用户会话中的令牌进行比较来验证它:

    1. //Start the session as normal.
    2. session_start();
    3. //For backward compatibility with the hash_equals function.
    4. //The hash_equals function was released in PHP 5.6.0.
    5. //It allows us to perform a timing attack safe string comparison.
    6. if(!function_exists('hash_equals')) {
    7. function hash_equals($str1, $str2) {
    8. if(strlen($str1) != strlen($str2)) {
    9. return false;
    10. } else {
    11. $res = $str1 ^ $str2;
    12. $ret = 0;
    13. for($i = strlen($res) - 1; $i >= 0; $i--) $ret |= ord($res[$i]);
    14. return !$ret;
    15. }
    16. }
    17. }
    18. //Get the token from the query string.
    19. $queryStrToken = isset($_GET['token']) ? $_GET['token'] : '';
    20. //If the token in the query string matches the token in the user's
    21. //session, then we can destroy the session and log them out.
    22. if(hash_equals($_SESSION['user_token'], $queryStrToken)){
    23. //Token is correct. Destroy the session.
    24. session_destroy();
    25. //Redirect them back to the home page or something.
    26. header('Location: index.php');
    27. exit;
    28. }

    如果令牌有效,我们使用 PHP 的session_destroy函数销毁用户的会话。此特定功能将销毁注册到会话的所有数据。如果令牌无效,则不会发生任何事情并且用户不会注销。

    希望此注销教程对您有所帮助!

  • 相关阅读:
    node编写服务器
    Vue的基础语法-常用v-on、v-if、v-bind等指令的细节(最详细)
    阿里巴巴面试题- - -Java体系最新面试题(4)
    mysql组合索引详解
    【SpringBoot3.x教程03】SpringBoot自动配置详解
    竞赛 推荐系统设计与实现 协同过滤推荐算法
    2023年 图表示学习、知识图谱相关SCI专刊与会议整理
    15.力扣c++刷题-->合并两个有序链表
    RabbitMQ Demo
    鼎捷前端开发校招岗技术面面经(已过)
  • 原文地址:https://blog.csdn.net/allway2/article/details/126676232