禁用元数据访问需分层防控:MySQL用skip-show-databases+限定库权限;PostgreSQL撤回pg_catalog USAGE及关键视图SELECT;SQL Server撤销VIEW DEFINITION;应用层禁用运行时查元数据。MySQL 中如何禁用 information_schema 查询默认情况下,普通用户也能查 information_schema,这是 SQL 注入后获取表名、列名的主要跳板。不能靠"不拼接 SQL"就高枕无忧,得从权限层堵死。实操上,直接回收对 information_schema 的 SELECT 权限无效(MySQL 8.0+ 允许显式授权但不生效),真正有效的是:限制用户只能访问指定数据库,并关闭元数据访问开关。创建用户时用 CREATE USER 'app'@'%' IDENTIFIED BY 'pwd',**不要**加 WITH GRANT OPTION只授具体库权限:GRANT SELECT, INSERT, UPDATE ON myapp_db.* TO 'app'@'%',**不授** mysql 或 information_schema 任何权限MySQL 8.0.29+ 可设系统变量:SET PERSIST information_schema_stats_expiry = 0(降低统计信息缓存,间接增加探测成本,非根治但有干扰作用)关键一步:在 my.cnf 中加 skip-show-databases ------ 这会让 SHOW DATABASES 对非 super 用户返回空,连库名都看不到PostgreSQL 怎么关掉 pg_catalog 和 information_schemaPostgreSQL 的元数据更开放,默认所有用户都能查 pg_tables、pg_columns 等视图。不像 MySQL 那样能简单禁用,得靠撤销视图权限 + 撤销 schema 使用权。注意:不能删或重命名 pg_catalog,那是核心 schema;也不能直接 REVOKE SELECT ON ALL TABLES IN SCHEMA pg_catalog,因为部分视图依赖 superuser 权限,普通 revoke 会报错。先确保应用用户不是 pg_read_all_data 角色成员(这个角色默认可读所有系统表)逐个撤回关键视图权限:REVOKE SELECT ON pg_tables, pg_views, pg_columns FROM app_user撤回整个 schema 的使用权限:REVOKE USAGE ON SCHEMA pg_catalog FROM app_user(这步让 SELECT * FROM pg_catalog.pg_tables 直接报 permission denied for schema pg_catalog)PostgreSQL 15+ 支持行级安全策略(RLS),可在 pg_tables 上加策略,但实际中极少用------太重,且 RLS 不作用于元数据视图SQL Server 里 sys.tables 查不到的真正原因SQL Server 默认对普通用户隐藏系统视图内容,但只要用户有 VIEW DEFINITION 权限或属于 db_owner,就能看到真实表结构。泄露常发生在误授了这类权限,或者用了 sa 登录的应用连接字符串。 Vozo Vozo是一款强大的AI视频编辑工具,可以帮助用户轻松重写、配音和编辑视频。
相关推荐
顾林海3 小时前
Agent入门阶段-编程基础-Python:流程控制呱呱复呱呱6 小时前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的Nturmoils7 小时前
订单列表慢查询,先看 WHERE、ORDER BY 和 LIMIT曲幽10 小时前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API渣波11 小时前
拒绝 SQL 焦虑!手把手带你用 NestJS + Prisma + DTO 写出“防弹”级后端代码荣码11 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面兵慌码乱20 小时前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析金銀銅鐵1 天前
[Python] 体验用欧几里得算法计算最大公约数的过程FreakStudio1 天前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发用户0332126663671 天前
使用 Python 从零创建 Word 文档