如何在PHP中实现用户登录功能?使用Session和数据库验证用户身份

答案:PHP用户登录核心安全考量包括密码哈希、SQL注入防护、Session安全、输入验证与错误处理。具体需使用password_hash和password_verify处理密码,通过PDO预处理语句防止SQL注入,登录后调用session_regenerate_id防止Session固定攻击,设置HttpOnly和Secure Cookie标志,对用户输入进行验证与输出转义,并在生产环境记录错误日志而非显示详细错误信息。

如何在php中实现用户登录功能?使用session和数据库验证用户身份

在PHP中实现用户登录功能,核心在于收集用户凭证(通常是用户名和密码),通过数据库验证这些凭证的有效性,并在验证成功后利用Session机制来维护用户的登录状态。这不仅涉及到数据交互,更深层次地触及了Web应用安全的基础。

解决方案

实现用户登录功能,我通常会这样一步步构建:

首先,我们需要一个前端界面让用户输入他们的凭证。一个简单的HTML表单,包含用户名和密码输入框,以及一个提交按钮。提交方式通常是POST,以避免敏感信息在URL中暴露。

        



接着,后端

process_login.php

文件会接收这些数据。这里是关键:我们不能直接拿用户输入的密码去和数据库里存储的密码字符串比对。正确的做法是,数据库里存的是密码的哈希值,我们拿到用户输入的密码后,对其进行哈希处理,再与数据库中的哈希值进行比对。

立即学习“PHP免费学习笔记(深入)”;

// process_login.phpsession_start(); // 启动Sessionif ($_SERVER["REQUEST_METHOD"] == "POST") {    $username = $_POST['username'] ?? '';    $password = $_POST['password'] ?? '';    // 1. 数据库连接 (使用PDO,更安全和现代)    $dsn = 'mysql:host=localhost;dbname=your_database_name;charset=utf8mb4';    $db_user = 'your_db_user';    $db_pass = 'your_db_password';    try {        $pdo = new PDO($dsn, $db_user, $db_pass, [            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,        ]);    } catch (PDOException $e) {        // 生产环境中不直接显示错误,而是记录日志        die("数据库连接失败: " . $e->getMessage());    }    // 2. 查询用户 (使用预处理语句防止SQL注入)    $stmt = $pdo->prepare("SELECT id, username, password_hash FROM users WHERE username = :username");    $stmt->execute([':username' => $username]);    $user = $stmt->fetch();    if ($user) {        // 3. 验证密码        // password_verify() 是PHP内置的推荐函数,用于验证哈希密码        if (password_verify($password, $user['password_hash'])) {            // 4. 登录成功:设置Session            session_regenerate_id(true); // 每次登录成功后重新生成Session ID,防止Session固定攻击            $_SESSION['user_id'] = $user['id'];            $_SESSION['username'] = $user['username'];            $_SESSION['logged_in'] = true;            // 重定向到用户仪表盘或受保护页面            header("Location: dashboard.php");            exit();        } else {            // 密码不匹配            $_SESSION['login_error'] = "用户名或密码不正确。";            header("Location: login.php"); // 返回登录页并显示错误            exit();        }    } else {        // 用户名不存在        $_SESSION['login_error'] = "用户名或密码不正确。";        header("Location: login.php");        exit();    }} else {    // 非POST请求,重定向回登录页    header("Location: login.php");    exit();}

在用户登录后,我们需要在受保护的页面(如

dashboard.php

)检查用户的登录状态:

// dashboard.phpsession_start();if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) {    // 如果用户未登录,重定向到登录页    header("Location: login.php");    exit();}// 用户已登录,显示受保护的内容echo "欢迎回来," . htmlspecialchars($_SESSION['username']) . "!";// 这里可以放用户的个人信息、功能模块等?>
退出登录

最后,退出登录功能也很简单:

// logout.phpsession_start();// 清除所有Session变量$_SESSION = array();// 如果Session使用了Cookie,需要删除Cookieif (ini_get("session.use_cookies")) {    $params = session_get_cookie_params();    setcookie(session_name(), '', time() - 42000,        $params["path"], $params["domain"],        $params["secure"], $params["httponly"]    );}// 销毁Sessionsession_destroy();// 重定向回登录页或首页header("Location: login.php");exit();

PHP用户登录功能的核心安全考量有哪些?

在我看来,实现一个用户登录功能,看似简单,实则处处是学问,尤其是安全问题,常常让人防不胜防。仅仅能登录还不够,我们更要思考,这个登录过程真的安全吗?以下是我认为几个不可或缺的安全考量:

1. 密码哈希与验证: 这是最基础也是最重要的。很多新手可能会直接把密码存进数据库,或者用MD5、SHA1这样已经不安全的哈希算法简单加密。这在今天看来简直是灾难。正确的做法是使用PHP内置的

password_hash()

password_verify()

函数。

password_hash()

会使用一个强哈希算法(如Bcrypt或Argon2,根据PHP版本和配置),并自动生成一个随机的盐值(salt)并将其与哈希结果一同存储。这意味着即使两个用户设置了相同的密码,它们的哈希值也会不同,大大增加了破解难度。

password_verify()

则负责安全地比对用户输入的密码和存储的哈希值。

2. SQL注入防护: 任何与数据库交互的地方,都必须警惕SQL注入。如果直接将用户输入拼接到SQL查询语句中,恶意用户可以通过输入特定的SQL代码来绕过登录、窃取数据甚至破坏数据库。解决方案是使用预处理语句(Prepared Statements),无论是PDO还是MySQLi都支持。通过占位符绑定参数,数据库会区分代码和数据,从而有效地阻止SQL注入攻击。

3. Session安全: Session管理是维护用户登录状态的关键,但也容易成为攻击目标。

Session固定攻击 (Session Fixation): 攻击者在用户登录前获取一个有效的Session ID,然后诱导用户使用这个ID登录。一旦用户登录成功,攻击者就拥有了该用户的Session权限。为了防止这种攻击,每次用户成功登录后,务必调用

session_regenerate_id(true)

来生成新的Session ID。Session劫持 (Session Hijacking): 攻击者窃取了用户的Session ID(例如通过XSS攻击、嗅探网络流量等),然后冒充用户。除了使用HTTPS加密所有通信来防止嗅探,还应设置Session Cookie的

HttpOnly

Secure

标志。

HttpOnly

阻止JavaScript访问Cookie,减少XSS攻击的危害;

Secure

则确保Cookie只在HTTPS连接下发送。同时,设置合理的Session过期时间也很重要。CSRF (Cross-Site Request Forgery) 攻击: 虽然登录表单本身受CSRF影响较小(因为攻击者无法知道用户的密码),但登录后的敏感操作(如修改密码、转账)则需要CSRF令牌来防护。每次提交表单时生成一个随机令牌,存储在Session中,并在表单中包含该令牌。后端验证提交的令牌与Session中的令牌是否一致。

4. 输入验证与净化: 永远不要相信用户输入!即使是用户名,也需要进行基本的长度、字符类型验证。如果用户输入的内容最终会被显示在页面上,那么必须使用

htmlspecialchars()

或类似的函数进行输出转义,以防止XSS攻击。

5. 错误处理与信息泄露: 生产环境中,不应该将详细的错误信息(如数据库连接错误、SQL查询错误)直接显示给用户。这可能会泄露服务器配置、数据库结构等敏感信息,给攻击者提供便利。应该记录错误日志,并向用户显示友好的通用错误提示。

如何在PHP中使用PDO安全地进行数据库操作?

在我看来,PDO(PHP Data Objects)是PHP中进行数据库操作的首选方式,它不仅提供了一个统一的接口来访问多种数据库,更重要的是,它通过预处理语句机制,为我们提供了强大的SQL注入防护能力。我几乎在所有新项目中都推荐使用PDO。

1. 建立安全的PDO连接:首先,我们需要建立一个到数据库的连接。这里的关键是正确配置DSN(Data Source Name),并处理可能出现的连接错误。

$dsn = 'mysql:host=localhost;dbname=your_database_name;charset=utf8mb4'; // 数据库类型、主机、数据库名、字符集$db_user = 'your_db_user'; // 数据库用户名$db_pass = 'your_db_password'; // 数据库密码try {    $pdo = new PDO($dsn, $db_user, $db_pass, [        // 关键配置项:        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // 遇到错误时抛出PDOException,便于捕获和处理        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // 默认以关联数组形式返回结果集        PDO::ATTR_EMULATE_PREPARES => false, // 禁用模拟预处理,强制MySQL服务器执行真正的预处理,增强安全性    ]);} catch (PDOException $e) {    // 在生产环境中,这里应该记录错误日志,而不是直接输出给用户    error_log("数据库连接失败: " . $e->getMessage());    die("抱歉,服务暂时不可用,请稍后再试。");}
PDO::ATTR_EMULATE_PREPARES => false

这一行非常重要,它能确保PHP不会在客户端模拟预处理语句,而是将SQL和参数分开发送给数据库服务器,让数据库服务器进行真正的预处理,从而彻底避免SQL注入。

2. 使用预处理语句:这是PDO的核心安全特性。当你需要执行一个带有用户输入参数的SQL查询时,不要直接拼接字符串,而是使用占位符。

示例:用户登录查询

// 用户输入的用户名和密码$username = $_POST['username'];$password = $_POST['password'];// 准备SQL语句,使用命名占位符或问号占位符$stmt = $pdo->prepare("SELECT id, username, password_hash FROM users WHERE username = :username");// 绑定参数并执行// 使用命名占位符时,参数名要与占位符一致$stmt->execute([':username' => $username]);// 获取结果$user = $stmt->fetch();if ($user) {    // 验证密码    if (password_verify($password, $user['password_hash'])) {        echo "登录成功!";        // ... 设置Session ...    } else {        echo "密码不正确。";    }} else {    echo "用户不存在。";}

使用问号占位符的例子:

$stmt = $pdo->prepare("INSERT INTO products (name, price) VALUES (?, ?)");$stmt->execute(['Apple', 1.99]); // 按照占位符的顺序传入参数

为什么预处理语句安全?预处理语句的工作原理是,你先将SQL查询的结构(包含占位符)发送给数据库服务器进行“预编译”。然后,你再将实际的数据(参数)发送给数据库。数据库服务器会严格区分SQL代码和数据,它知道占位符位置传入的只是数据,不会将其解析为SQL命令的一部分。这样,即使数据中包含了恶意的SQL代码片段,它们也只会作为普通字符串被处理,无法改变查询的意图。

3. 错误处理:PDO的

ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

配置让PDO在遇到错误时抛出异常。这意味着你可以使用

try-catch

块来优雅地捕获和处理数据库操作中可能出现的错误,而不是让脚本直接崩溃或显示不友好的PHP错误信息。

通过以上这些实践,我们可以显著提高PHP应用中数据库操作的安全性。

PHP Session的工作原理及其在用户身份验证中的作用?

PHP Session在我看来,是Web开发中一个非常巧妙且实用的机制,它解决了HTTP协议无状态的根本问题,使得我们能够在用户多次请求之间“记住”用户的身份和数据。在用户身份验证中,Session扮演着核心的角色,它就像一个临时的身份卡,让服务器知道当前是谁在访问。

Session的工作原理:

简单来说,Session的工作流程是这样的:

启动Session (

session_start()

): 当一个用户首次访问网站或需要使用Session时,服务器端的PHP脚本会调用

session_start()

如果这是用户首次访问,PHP会生成一个唯一的Session ID(例如:

phpsessid=abc123xyz

)。如果用户之前已经访问过并有一个Session ID,PHP会尝试从HTTP请求中获取这个ID(通常是通过Cookie)。

Session ID的传递:

通过Cookie: 这是最常见和推荐的方式。PHP会将这个Session ID作为Cookie发送给用户的浏览器。浏览器在后续对同一网站的请求中,会自动将这个Session ID的Cookie包含在HTTP请求头中发送回服务器。通过URL参数(不推荐): 在某些不支持Cookie的环境下,Session ID也可以通过URL参数(如

yoursite.com?PHPSESSID=abc123xyz

)传递。但这不安全,容易被窃取,且影响SEO。

服务器端数据存储:

当服务器收到一个带有Session ID的请求时,它会根据这个ID去查找服务器上对应的Session数据文件(默认情况下,Session数据存储在服务器的临时目录下的文件中,文件名为

sess_SessionID

)。这些数据以PHP序列化的形式存储,可以通过

$_SESSION

超全局数组进行读写。

$_SESSION

超全局数组: 这是PHP提供的一个特殊数组,它映射了当前用户的Session数据。你可以像操作普通数组一样,往

$_SESSION

里存入任何数据类型(字符串、数组、对象等),这些数据在用户会话期间都将保持有效。

session_start();$_SESSION['username'] = 'Alice';$_SESSION['cart'] = ['item1' => 2, 'item2' => 1];echo $_SESSION['username']; // Alice

Session的生命周期: Session在以下情况下会结束:

用户主动退出登录(调用

session_destroy()

)。浏览器关闭(如果Session Cookie没有设置过期时间)。Session在服务器端过期(由

session.gc_maxlifetime

配置决定,默认通常是24分钟)。

Session在用户身份验证中的作用:

Session是实现用户登录状态持久化的基石。它将无状态的HTTP请求转化为有状态的交互,使得服务器能够“记住”哪个用户正在操作。

登录状态的标记: 当用户成功通过用户名和密码验证后,我们会在

$_SESSION

中设置一个或多个标志来表示用户已登录,并存储用户的关键信息(如用户ID、用户名)。

// 登录成功后session_start();session_regenerate_id(true); // 安全最佳实践$_SESSION['user_id'] = $user_id_from_db;$_SESSION['username'] = $username_from_db;$_SESSION['logged_in'] = true;

访问控制: 在所有需要登录才能访问的页面(受保护页面)中,我们首先会检查

$_SESSION

中是否存在这些登录标志。如果不存在,就说明用户未登录或Session已过期,此时可以将用户重定向到登录页面。

// 受保护页面顶部session_start();if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) {    header("Location: login.php");    exit();}// 用户已登录,可以访问页面内容echo "欢迎," . $_SESSION['username'];

用户数据持久化: 除了登录状态,我们还可以将用户的偏好设置、购物车内容、权限信息等数据存储在

$_SESSION

中。这样,在用户浏览网站的不同页面时,这些数据都能被方便地访问,而无需每次都从数据库中查询。

退出登录: 当用户点击“退出登录”时,通过销毁Session(

session_destroy()

),可以清除所有存储的用户登录信息,从而结束用户的会话。

总结来说,Session机制就像是为每个访问者在服务器上创建了一个专属的“储物柜”,通过一个唯一的“钥匙”(Session ID)来管理这个储物柜。在用户身份验证中,这个储物柜里存放着用户的“通行证”,让服务器能够识别并授权用户访问受保护的资源。

以上就是如何在PHP中实现用户登录功能?使用Session和数据库验证用户身份的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1272600.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月10日 14:56:17
下一篇 2025年12月10日 14:56:41

相关推荐

  • 网络进化!

    Web 应用程序从静态网站到动态网页的演变是由对更具交互性、用户友好性和功能丰富的 Web 体验的需求推动的。以下是这种范式转变的概述: 1. 静态网站(1990 年代) 定义:静态网站由用 HTML 编写的固定内容组成。每个页面都是预先构建并存储在服务器上,并且向每个用户传递相同的内容。技术:HT…

    2025年12月24日
    000
  • 为什么多年的经验让我选择全栈而不是平均栈

    在全栈和平均栈开发方面工作了 6 年多,我可以告诉您,虽然这两种方法都是流行且有效的方法,但它们满足不同的需求,并且有自己的优点和缺点。这两个堆栈都可以帮助您创建 Web 应用程序,但它们的实现方式却截然不同。如果您在两者之间难以选择,我希望我在两者之间的经验能给您一些有用的见解。 在这篇文章中,我…

    2025年12月24日
    000
  • 为什么前端固定定位会发生移动问题?

    前端固定定位为什么会出现移动现象? 在进行前端开发时,我们经常会使用CSS中的position属性来控制元素的定位。其中,固定定位(position: fixed)是一种常用的定位方式,它可以让元素相对于浏览器窗口进行定位,保持在页面的固定位置不动。 然而,有时候我们会遇到一个问题:在使用固定定位时…

    2025年12月24日
    000
  • 学会从头开始学习CSS,掌握制作基本网页框架的技巧

    从零开始学习CSS,掌握网页基本框架制作技巧 前言: 在现今互联网时代,网页设计和开发是一个非常重要的技能。而学习CSS(层叠样式表)是掌握网页设计的关键之一。CSS不仅可以为网页添加样式和布局,还可以为用户呈现独特且具有吸引力的页面效果。在本文中,我将为您介绍一些基本的CSS知识,以及一些常用的代…

    2025年12月24日
    200
  • 从初学到专业:掌握这五种前端CSS框架

    CSS是网站设计中重要的一部分,它控制着网站的外观和布局。前端开发人员为了让页面更加美观和易于使用,通常使用CSS框架。这篇文章将带领您了解这五种前端CSS框架,从入门到精通。 Bootstrap Bootstrap是最受欢迎的CSS框架之一。它由Twitter公司开发,具有可定制的响应式网格系统、…

    2025年12月24日
    200
  • 揭秘Web标准涵盖的语言:了解网页开发必备的语言范围

    在当今数字时代,互联网成为了人们生活中不可或缺的一部分。作为互联网的基本构成单位,网页承载着我们获取和分享信息的重要任务。而网页开发作为一门独特的技术,离不开一些必备的语言。本文将揭秘Web标准涵盖的语言,让我们一起了解网页开发所需的语言范围。 首先,HTML(HyperText Markup La…

    2025年12月24日
    000
  • 克服害怕做选择的恐惧症:这五个前端CSS框架将为你解决问题

    选择恐惧症?这五个前端CSS框架能帮你解决问题 近年来,前端开发者已经进入了一个黄金时代。随着互联网的快速发展,人们对于网页设计和用户体验的要求也越来越高。然而,要想快速高效地构建出漂亮的网页并不容易,特别是对于那些可能对CSS编码感到畏惧的人来说。所幸的是,前端开发者们早已为我们准备好了一些CSS…

    2025年12月24日
    200
  • 揭开Web开发的语言之谜:了解构建网页所需的语言有哪些?

    Web标准中的语言大揭秘:掌握网页开发所需的语言有哪些? 随着互联网的快速发展,网页开发已经成为人们重要的职业之一。而要成为一名优秀的网页开发者,掌握网页开发所需的语言是必不可少的。本文将为大家揭示Web标准中的语言大揭秘,介绍网页开发所需的主要语言。 HTML(超文本标记语言)HTML是网页开发的…

    2025年12月24日
    400
  • 常用的网页开发语言:了解Web标准的要点

    了解Web标准的语言要点:常见的哪些语言应用在网页开发中? 随着互联网的不断发展,网页已经成为人们获取信息和交流的重要途径。而要实现一个高质量、易用的网页,离不开一种被广泛接受的Web标准。Web标准的制定和应用,涉及到多种语言和技术,本文将介绍常见的几种语言在网页开发中的应用。 首先,HTML(H…

    2025年12月24日
    000
  • 网页开发中常见的Web标准语言有哪些?

    探索Web标准语言的世界:网页开发中常用的语言有哪些? 在现代社会中,互联网的普及程度越来越高,网页已成为人们获取资讯、娱乐、交流的重要途径。而网页的开发离不开各种编程语言的应用和支持。在这个虚拟世界的网络,有许多被广泛应用的标准化语言,用于为用户提供优质的网页体验。本文将探索网页开发中常用的语言,…

    2025年12月24日
    000
  • 深入探究Web标准语言的范围,涵盖了哪些语言?

    Web标准是指互联网上的各个网页所需遵循的一系列规范,确保网页在不同的浏览器和设备上能够正确地显示和运行。这些标准包括HTML、CSS和JavaScript等语言。本文将深入解析Web标准涵盖的语言范围。 首先,HTML(HyperText Markup Language)是构建网页的基础语言。它使…

    2025年12月24日
    000
  • 项目实践:如何结合CSS和JavaScript打造优秀网页的经验总结

    项目实践:如何结合CSS和JavaScript打造优秀网页的经验总结 随着互联网的快速发展,网页设计已经成为了各行各业都离不开的一项技能。优秀的网页设计可以给用户留下深刻的印象,提升用户体验,增加用户的黏性和转化率。而要做出优秀的网页设计,除了对美学的理解和创意的运用外,还需要掌握一些基本的技能,如…

    2025年12月24日
    200
  • CSS 超链接属性解析:text-decoration 和 color

    CSS 超链接属性解析:text-decoration 和 color 超链接是网页中常用的元素之一,它能够在不同页面之间建立连接。为了使超链接在页面中有明显的标识和吸引力,CSS 提供了一些属性来调整超链接的样式。本文将重点介绍 text-decoration 和 color 这两个与超链接相关的…

    2025年12月24日
    000
  • is与where选择器:提升前端编程效率的秘密武器

    is与where选择器:提升前端编程效率的秘密武器 在前端开发中,选择器是一种非常重要的工具。它们用于选择文档中的元素,从而对其进行操作和样式设置。随着前端技术的不断发展,选择器也在不断演化。而其中,is与where选择器成为了提升前端编程效率的秘密武器。 is选择器是CSS Selectors L…

    2025年12月24日
    000
  • 前端技巧分享:使用CSS3 fit-content让元素水平居中

    前端技巧分享:使用CSS3 fit-content让元素水平居中 在前端开发中,我们常常会遇到需要将某个元素水平居中的情况。使用CSS3的fit-content属性可以很方便地实现这个效果。本文将介绍fit-content属性的使用方法,并提供代码示例。 fit-content属性是一个相对于元素父…

    2025年12月24日
    000
  • 前端技术分享:利用fit-content实现页面元素的水平对齐效果

    前端技术分享:利用fit-content实现页面元素的水平对齐效果 在前端开发中,实现页面元素的水平对齐是一个常见的需求。尤其在响应式布局中,我们经常需要让元素根据设备的屏幕大小自动调整位置,使页面更加美观和易读。在本文中,我将分享一种利用CSS属性fit-content来实现页面元素的水平对齐效果…

    2025年12月24日
    000
  • 学完HTML和CSS之后我应该做什么?

    网页开发是一段漫长的旅程,但是掌握了HTML和CSS技能意味着你已经赢得了一半的战斗。这两种语言对于学习网页开发技能来说非常重要和基础。现在不可或缺的是下一个问题,学完HTML和CSS之后我该做什么呢? 对这些问题的答案可以分为2-3个部分,你可以继续练习你的HTML和CSS编码,然后了解在学习完H…

    2025年12月24日
    000
  • 聊聊怎么利用CSS实现波浪进度条效果

    本篇文章给大家分享css 高阶技巧,介绍一下如何使用css实现波浪进度条效果,希望对大家有所帮助! 本文是 CSS Houdini 之 CSS Painting API 系列第三篇。 现代 CSS 之高阶图片渐隐消失术现代 CSS 高阶技巧,像 Canvas 一样自由绘图构建样式! 在上两篇中,我们…

    2025年12月24日 好文分享
    200
  • 13 个实用CSS技巧,助你提升前端开发效率!

    本篇文章整理分享13 个前端可能用得上的 css技巧,包括修改输入占位符样式、多行文本溢出、隐藏滚动条、修改光标颜色等,希望对大家有所帮助! 修改输入占位符样式、多行文本溢出、隐藏滚动条、修改光标颜色、水平和垂直居中。多么熟悉的场景!前端开发者几乎每天都会和它们打交道,本文收集 13 个CSS技巧,…

    2025年12月24日
    000
  • 巧用距离、角度及光影制作炫酷的 3D 文字特效

    如何利用 css 实现3d立体的数字?下面本篇文章就带大家巧用视觉障眼法,构建不一样的 3d 文字特效,希望对大家有所帮助! 最近群里有这样一个有意思的问题,大家在讨论,使用 CSS 3D 能否实现如下所示的效果: 这里的核心难点在于,如何利用 CSS 实现一个立体的数字?CSS 能做到吗? 不是特…

    2025年12月24日 好文分享
    000

发表回复

登录后才能评论
关注微信