🗄️ 第六章 运用数据库-旨在安全运用
📄 一句话概括

权限体系回答两个问题:你是谁(用户)、你被允许做什么(权限)——核心原则是最小权限:够用就好,多一点都不给。

📝 本节和前面几节的关系

6-2 说「别被坏」靠账号管理,本节把它变成可操作的体系。第一章 1-4 讲「控制、访问权限」是优势名词,本节开始动手真配;SQL 层面用 GRANT/REVOKE(SQLite 单机嵌入式没有这套用户系统,本节用 MySQL 语法演示)。

一、两个概念

二、GRANT 与 REVOKE

-- 建一个只能查书评的用户(MySQL 语法)
CREATE USER 'reader'@'%' IDENTIFIED BY '强口令';
GRANT SELECT ON book_review.* TO 'reader'@'%';

-- 收回权限
REVOKE SELECT ON book_review.* FROM 'reader'@'%';

-- 看某用户的权限
SHOW GRANTS FOR 'reader'@'%';

权限可以精确到库 → 表 → 列三级:GRANT SELECT (title, author) ON book_review.books TO ...——连「能看哪几列」都能管。

三、最小权限原则

角色 应给权限 绝不该给
前台展示网站 SELECT 一切写权限
书评写入接口 INSERT + SELECT DELETE、DROP
运营修正数据 UPDATE + SELECT DROP、GRANT
DBA 本人 全部 ——(连 DBA 也不该用 root 日常登录)

逻辑链:权限越小 → 出事时的破坏半径越小。网页被注入攻击(SQL 注入)时,黑客拿到的正是网站账号的权限——网站只有 SELECT,他就只能偷看,删不了库。

四、动手 Demo:三账号分权(纸面 SQL,在线 MySQL 运行器可跑)

CREATE DATABASE book_review;
USE book_review;
CREATE TABLE books (id INT PRIMARY KEY, title VARCHAR(100));

-- 三个账号、三种命运
CREATE USER 'site'  @'%' IDENTIFIED BY 'Site#2026';   -- 网站:只读
CREATE USER 'admin' @'%' IDENTIFIED BY 'Admin#2026';  -- 管理员:读写
GRANT SELECT ON book_review.* TO 'site'@'%';
GRANT SELECT, INSERT, UPDATE, DELETE ON book_review.* TO 'admin'@'%';

-- site 想删表 → 直接拒绝
-- GRANT 之外的操作对 site 全是 ERROR 1142

【准备块】在线 SQLite 运行器不支持用户系统,本 Demo 请用支持 MySQL 的在线运行器,或只读语法理解逻辑。

五、30 秒实验

打开手机「屏幕使用时间」或电脑的「来宾账户」:这就是操作系统版的最小权限——客人能上网,不能看你的文件。问:你公司的门禁卡能开几扇门?数据库账号同理。

六、常见误区

自测三问 1. GRANT 和 REVOKE 各干什么?(授予/收回权限) 2. 只读展示网站应给什么权限?(SELECT,精确到需要的表/列更好) 3. 为什么网站账号只给 SELECT 反而也是防注入手段?(注入攻击顶多借它的权限偷看,删不了库——最小化破坏半径)

相关笔记