网站前端mysql账号应仅授予select、insert、update、delete权限,严格限定于指定库表(如app_db.users),host必须为内网ip段(如'10.20.30.%'),禁用'%'或'localhost',且须显式create user并配置ssl与密码过期策略。

直接给网站前端用的 MySQL 账号只配 SELECT、INSERT、UPDATE、DELETE 四个权限,作用范围严格限定在对应库的几张表(比如 app_db.users、app_db.posts),host 必须是内网 IP 段(如 '10.20.30.%'),绝不能是 '%' 或 'localhost'(后者在容器或代理环境下常不匹配)。
CREATE USER 必须显式执行,不能靠 GRANT 隐式创建
MySQL 8.0+ 已弃用隐式建户,且隐式方式无法设置密码策略、SSL 要求、过期时间等关键安全项。漏掉这些,等于留后门。
- 正确写法:
CREATE USER 'web_app'@'10.20.30.%' IDENTIFIED BY 'aB3!xY9' REQUIRE SSL PASSWORD EXPIRE INTERVAL 90 DAY; - 错误写法:
GRANT SELECT ON app_db.* TO 'web_app'@'%' IDENTIFIED BY 'weak';—— 这在 8.0+ 会报错ERROR 1410 (42000),且没设 SSL 和过期 - host 写
'10.20.30.%'而非'%':避免从公网或跳板机直连;若用域名,确保 DNS 解析稳定,否则连接失败
GRANT 时必须指定数据库和表,ON *.* 是高危信号
权限不写作用域,就等于没授权(5.7+)或意外获得全局权限(旧版本行为混乱)。线上看到 ON *.*,基本可以判定账号已越权。
PigX UI Pro 前端开发指南 - Vue 3 + TypeScript + Element Plus。当用户提到 PigX UI、PigX 前端、lgb-mgui 项目、Vue 3 企业级后台开发、Element Plus 后台开发时使用此技能。
- 只读页面(如商品列表)只需:
GRANT SELECT ON shop_db.products TO 'web_app'@'10.20.30.%'; - 带用户提交的场景(如评论)才加:
GRANT INSERT ON shop_db.comments TO 'web_app'@'10.20.30.%'; - 绝对禁止:
GRANT ALL PRIVILEGES ON *.*、GRANT SELECT ON *.*、GRANT SELECT ON mysql.* - 如果要用视图,记得额外加
SHOW VIEW,否则SELECT会报ERROR 1142
验证权限是否真最小,别信“我刚授的权”
权限生效不是靠记忆,而是靠实测。很多问题出在 host 匹配失败、连接池复用旧连接、或存在同名宽泛账号(如 'web_app'@'%' 优先级高于 'web_app'@'10.20.30.%')。
- 手动测试连接:
mysql -u web_app -p -h db-prod.internal -D shop_db,然后试DROP TABLE products;—— 应明确报ERROR 1142 (42000): DROP command denied - 查真实权限:
SHOW GRANTS FOR 'web_app'@'10.20.30.%';,确认输出里没有GRANT OPTION、ALTER、FILE、SUPER - 检查有没有冲突账号:
SELECT User, Host FROM mysql.user WHERE User = 'web_app';,删掉多余行,比如'web_app'@'%' - 应用侧改完配置后,重启连接池或清空连接缓存,否则旧连接仍带老权限
最常被忽略的是 host 匹配细节:'web_app'@'localhost' 和 'web_app'@'127.0.0.1' 是两个账号,前者走 socket,后者走 TCP;Kubernetes Pod 或 Nginx 反向代理过来的请求,host 几乎不可能是 localhost —— 所以别图省事写 localhost。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










