公开文集
0x01 SRC 资产管理系统
0x02 Web 漏洞案例库
0x03 小程序漏洞案例库
第一章:小程序渗透基础
1.1 微信小程序反编译与动态调试
1.2 微信小程序强制开启开发者模式
0x99 信息安全学习体系
01-网络安全基础
Day-001-TCP-IP协议栈安全分析
Day-002-DNS协议安全与DNS劫持攻防
Day-003-IPv6 安全基础与过渡
Day-004-HTTP-HTTPS协议深度解析
Day-005-网络嗅探与流量分析技术
Day-006-防火墙原理与配置实践
Day-007-网络地址转换 NAT 安全分析
Day-008-路由协议安全 RIP-OSPF-BGP
Day-009-VLAN 安全与 VLAN-Hopping
Day-010-无线网络基础与安全 802.11
Day-011-网络访问控制 802.1X-NAC
Day-012-网络分段与微隔离设计
Day-013-负载均衡器安全配置
Day-014-CDN安全与防护
Day-015-NTP安全
Day-016-DHCP安全与攻击防护
Day-017-ICMP协议安全分析
Day-018-网络协议模糊测试基础
Day-019-网络流量基线建立
Day-020-网络取证基础
Day-021-网络入侵检测系统 NIDS
Day-022-网络入侵防御系统 NIPS
Day-023-网络流量加密与解密
Day-024-网络协议逆向工程基础
Day-025-网络性能与安全权衡
Day-026-SDN 安全
Day-027-网络虚拟化安全
Day-028-网络欺骗技术
Day-029-网络威胁情报应用
Day-030-网络容量规划与安全
Day-031-网络安全架构设计实战
02-Web 安全
Day-032-OWASP-Top-10-2021详解
Day-033-SQL 注入原理与手工检测
Day-034-SQL注入进阶报错注入与盲注
Day-035-XSS跨站脚本攻击基础
Day-036-XSS 进阶绕过与利用
Day-037-XSS进阶绕过与利用
Day-038-CSRF 跨站请求伪造
Day-039-文件上传漏洞
Day-040-反序列化漏洞基础
Day-041-PHP反序列化深入
Day-042-Java反序列化深入
Day-043-SSTI 服务端模板注入
Day-044-文件包含漏洞 LFI-RFI
Day-045-命令注入漏洞
Day-046-XXE-XML 外部实体注入
Day-047-反序列化漏洞进阶
Day-048-API 安全基础
Day-049-API认证与授权安全
Day-050-API漏洞挖掘实战
Day-051-文件上传漏洞进阶
Day-052-反序列化漏洞实战
Day-053-Web 安全综合实战
Day-054-移动安全基础
Day-055-Android 应用安全测试
Day-056-iOS 应用安全测试
Day-057-移动应用综合实战
Day-058-云安全基础
Day-059-AWS 安全实战
Day-060-Azure 安全实战
Day-061-GCP 安全实战
Day-062-云安全综合实战
Day-063-容器安全基础
Day-064-Docker 安全实战
Day-065-Kubernetes 安全实战
Day-066-容器安全综合实战
Day-067-API 安全进阶
Day-068-服务端请求伪造 SSRF 深入
Day-069-文件上传漏洞进阶
Day-070-反序列化漏洞实战进阶
Day-071-业务逻辑漏洞深入
Day-072-前端安全深入
Day-073-Web 安全综合实战
Day-074-云安全进阶
Day-075-移动安全进阶
Day-076-API 安全进阶
Day-077-前端安全进阶
Day-078-业务逻辑漏洞进阶
Day-079-反序列化漏洞实战进阶
Day-080-文件上传漏洞实战进阶
Day-081-SSTI 服务端模板注入进阶
Day-082-XXE-XML 外部实体注入进阶
Day-083-SSRF 服务端请求伪造进阶
Day-084-命令注入漏洞进阶
Day-085-文件包含漏洞进阶
Day-086-反序列化漏洞实战进阶
Day-087-文件上传漏洞实战进阶
Day-088-SSTI 服务端模板注入实战进阶
Day-089-XXE-XML 外部实体注入实战进阶
Day-090-SSRF 服务端请求伪造实战进阶
Day-091-命令注入漏洞实战进阶
Day-092-Web 安全综合实战
Day-093-GraphQL 安全
Day-094-JWT 与 OAuth2 安全
03-系统安全
Day-095-系统监控与检测
Day-096-主机防火墙配置
Day-097-系统审计与合规
Day-098-Linux 系统安全进阶
Day-099-Windows 系统安全进阶
Day-100-容器安全进阶
Day-101-容器编排安全进阶
Day-102-Linux 内核安全
Day-103-Windows 内核安全
Day-104-系统安全总结与实战
Day-105-Linux 系统安全基础
Day-106-Windows 系统安全基础
Day-107-容器安全基础
Day-108-系统加固技术
Day-109-日志分析技术
Day-110-威胁狩猎技术
04-应用安全
Day-111-安全编码规范
Day-112-输入验证技术
Day-113-输出编码技术
Day-114-错误处理安全
Day-115-会话管理安全
Day-116-认证安全
Day-117-授权安全
Day-118-数据保护安全
Day-119-日志安全
Day-120-API 安全
Day-121-微服务安全
Day-122-新兴技术安全概论
Day-123-DevSecOps 流水线安全
Day-124-云原生安全架构
Day-125-API 安全最佳实践
Day-126-安全编码规范
Day-127-SDL 安全开发生命周期
Day-128-威胁建模实战
Day-129-安全需求分析
Day-130-安全架构设计
Day-131-安全编码实践Java
Day-132-安全编码实践Python
Day-133-代码审计方法论
Day-134-静态代码分析SAST
Day-135-动态应用测试DAST
Day-136-交互式测试IAST
Day-137-软件成分分析SCA
Day-138-依赖漏洞管理
Day-139-安全测试自动化
Day-140-漏洞管理与响应
Day-141-应用安全总结与展望
Day-142-OWASP-Top10-2024 详解
Day-143-CWE-Top25 分析
Day-144-漏洞挖掘方法论
Day-145-模糊测试技术
Day-146-逆向工程基础
Day-147-漏洞利用开发基础
Day-148-漏洞复现与验证
Day-149-漏洞披露流程
Day-150-CVE 申请与管理
Day-151-漏洞赏金计划
Day-152-等保2.0详解
Day-153-GDPR 合规实践
Day-154-数据安全法解读
Day-155-个人信息保护法与合规指南
Day-156-个人信息保护法解读
Day-157-ISO-27001 信息安全管理体系
Day-158-SOC-2 合规与审计
Day-159-PCI-DSS 支付卡行业数据安全标准
Day-160-网络安全审查办法解读
Day-161-数据出境安全评估办法
Day-162-应用安全评估实战
Day-163-红蓝对抗演练
Day-164-安全应急响应
Day-165-安全运营中心建设
Day-166-应用安全总结与展望
05-密码学
Day-167-密码学基础
Day-168-对称加密算法详解
Day-169-非对称加密算法详解
Day-170-哈希函数与数字签名
Day-171-密钥管理与PKI
Day-172-TLS-SSL 协议详解
Day-173-国密算法详解
Day-174-认证与密钥协议
Day-175-随机数生成与熵源
Day-176-椭圆曲线密码学详解
Day-177-后量子密码学详解
Day-178-高级密码学主题
Day-179-密码学行业应用精选
Day-180-常用加密算法原理与实现
Day-181-密码学总结与展望
Day-182-密码学系列总结与展望
06-渗透测试
Day-183-渗透测试方法论
Day-184-信息收集技术详解
Day-185-漏洞扫描技术详解
Day-186-漏洞利用技术详解
Day-187-渗透测试中的漏洞利用框架
Day-188-漏洞利用框架与 Metasploit 深入
Day-189-渗透测试中的 WAF 绕过技术
Day-190-渗透测试中的模糊测试技术
Day-191-渗透测试中的代码审计与静态分析
Day-192-渗透测试中的密码哈希破解技术
Day-193-渗透测试报告编写指南
Day-194-Web 应用渗透测试
Day-195-渗透测试中的 API 安全测试
Day-196-渗透测试中的 GraphQL 安全测试
Day-197-渗透测试中的前后端分离应用测试
Day-198-渗透测试中的小程序安全测试
Day-199-渗透测试中的浏览器安全测试
Day-200-OAuth-SSO安全测试
Day-201-渗透测试中的业务逻辑漏洞测试
Day-202-渗透测试中的厚客户端安全测试
Day-203-渗透测试综合实战演练
Day-204-内网渗透技术详解
Day-205-渗透测试中的内网信息收集进阶
Day-206-渗透测试中的域森林渗透技术
Day-207-渗透测试中的权限维持技术
Day-208-渗透测试中的横向移动技术
Day-209-渗透测试中的痕迹清理与反取证技术
Day-210-渗透测试中的数据窃取与 Exfiltration 技术
Day-211-渗透测试中的内部威胁与数据泄露测试
Day-212-渗透测试中的物理安全渗透
Day-213-社会工程学攻击技术
Day-214-移动应用渗透测试
Day-215-云安全渗透测试
Day-216-渗透测试中的容器与 Kubernetes 安全渗透
Day-217-渗透测试中的 Serverless 安全测试
Day-218-渗透测试中的微服务安全测试
Day-219-物联网安全渗透测试
Day-220-工业控制系统安全渗透测试
Day-221-无线网络安全渗透测试
Day-222-数据库安全渗透测试
Day-223-渗透测试中的供应链安全测试
Day-224-红队演练技术详解
Day-225-渗透测试中的红队基础设施搭建
Day-226-渗透测试中的威胁情报与狩猎
Day-227-渗透测试中的综合指纹识别技术
Day-228-自动化渗透测试技术
Day-229-渗透测试中的运维安全测试
Day-230-渗透测试中的区块链与智能合约安全测试
Day-231-渗透测试中的漏洞管理与修复验证
Day-232-渗透测试法律与合规
Day-233-后渗透攻击技术详解
Day-234-渗透测试中的人工智能应用
Day-235-漏洞利用开发深入
Day-236-云原生渗透测试深入
07-应急响应
Day-237-应急响应概述与核心概念
Day-238-应急响应流程框架
Day-239-CSIRT 团队组建与职责分工
Day-240-应急响应工具包准备
Day-241-应急响应法律与合规要求
Day-242-安全事件检测方法与指标
Day-243-云原生应急响应
Day-244-日志收集与分析技术
Day-245-网络流量分析与异常识别
Day-246-自动化响应与 SOAR
Day-247-端点监控与 EDR 技术
Day-248-威胁狩猎方法论
Day-249-威胁情报在检测中的应用
Day-250-数字取证基础与证据链管理
Day-251-内存取证技术
Day-252-磁盘取证与文件恢复
Day-253-网络取证与数据包分析
Day-254-云环境与容器取证
Day-255-恶意代码静态分析技术
Day-256-恶意代码动态分析技术
Day-257-恶意代码行为分析方法
Day-258-逆向工程基础与工具
Day-259-沙箱技术与自动化分析
Day-260-事件隔离与遏制策略
Day-261-威胁根除与系统修复
Day-262-系统恢复与数据重建
Day-263-业务连续性计划
Day-264-事件复盘与经验总结
Day-265-APT 攻击事件复盘分析
Day-266-勒索软件事件响应实战
Day-267-数据泄露事件处置流程
Day-268-内部威胁调查与取证
Day-269-综合应急响应演练
08-安全运维
Day-270-安全运营中心 SOC 概述
Day-271-安全监控指标体系
Day-272-安全告警管理
Day-273-安全可视化与仪表盘
Day-274-监控工具选型
Day-275-日志采集技术
Day-276-日志标准化与解析
Day-277-日志存储与归档
Day-278-日志分析技术
Day-279-日志合规要求
Day-280-SIEM 架构与设计
Day-281-关联规则引擎
Day-282-高级关联分析
Day-283-UEBA 用户实体行为分析
Day-284-威胁狩猎
Day-285-SOAR 基础概念
Day-286-剧本设计
Day-287-自动化响应技术
Day-288-安全工具集成
Day-289-SOAR 度量与优化
Day-290-安全基线管理
Day-291-漏洞管理流程
Day-292-补丁管理策略
Day-293-变更安全管理
Day-294-合规审计技术
Day-295-7x24 安全运营
Day-296-安全事件管理流程
Day-297-安全运营度量体系
Day-298-持续改进机制
Day-299-安全运维综合演练
Day-300-云原生安全运营
Day-301-AI 与机器学习安全运营
Day-302-安全自动化脚本实战
09-移动安全
Day-303-移动安全威胁概述
Day-304-移动设备安全架构
Day-305-移动操作系统安全模型
Day-306-移动应用权限管理
Day-307-移动端数据加密
Day-308-330-Android 安全合集
Day-309-Android 安全架构
Day-310-Android 组件安全
Day-311-Android 权限与隐私
Day-312-Android 逆向工程
Day-313-Android 应用加固
Day-314-iOS 安全架构
Day-315-iOS 应用沙盒机制
Day-316-越狱与反越狱
Day-317-iOS 逆向工程
Day-318-iOS 企业分发安全
Day-319-移动安全开发生命周期
Day-320-移动应用安全测试
Day-321-移动应用加固技术
Day-322-移动威胁防护
Day-323-移动安全合规
10-云安全
Day-324-云计算安全模型
Day-325-责任共担模型
Day-326-云安全威胁模型
Day-327-云安全合规框架
Day-328-云安全架构设计
Day-329-AWS IAM 安全
Day-330-AWS 网络安全
Day-331-AWS 存储安全
Day-332-AWS 安全监控
Day-333-AWS 安全最佳实践
Day-334-Azure AD 安全
Day-335-Azure 网络安全
Day-336-Azure 存储安全
Day-337-Azure 安全中心
Day-338-Azure 安全最佳实践
Day-339-容器安全基础
Day-340-Kubernetes 安全
Day-341-Serverless 安全
Day-342-云原生 DevSecOps
Day-343-云安全态势管理 CSPM
11-物联网工控
Day-344-物联网安全概述
Day-345-IoT 通信协议安全
Day-346-IoT 设备安全
Day-347-IoT 平台安全
Day-348-IoT 应用安全
Day-349-工业控制系统概述
Day-350-工控协议安全
Day-351-PLC 安全
Day-352-SCADA 系统安全
Day-353-工控安全防护
12-综合与总结
Day-354-安全职业发展路径
Day-355-安全技术趋势展望
Day-356-安全建设方法论
Day-357-经典攻防案例复盘
Day-358-安全学习资源指南
Day-359-信息安全行业求职指南
-
+
首页
Day-093-GraphQL 安全
# Day 91: GraphQL 安全 - 查询攻击/内省漏洞/防护方案 > Web 安全系列第 61 天 | 预计阅读时间:30 分钟 | 难度:★★★★☆ --- ## 清单 目录 1. [GraphQL 概述](#graphql-概述) 2. [GraphQL 特有漏洞](#graphql-特有漏洞) 3. [查询深度攻击](#查询深度攻击) 4. [批量查询攻击](#批量查询攻击) 5. [内省漏洞](#内省漏洞) 6. [授权漏洞](#授权漏洞) 7. [防护方案](#防护方案) 8. [实战案例](#实战案例) 9. [总结与思考](#总结与思考) 10. [参考资料](#参考资料) --- ## GraphQL 概述 ### GraphQL 基础 **什么是 GraphQL**: ``` GraphQL 是 Facebook 开发的查询语言和运行时: - 客户端定义所需数据结构 - 单端点查询 - 强类型系统 - 内省查询能力 ``` **与 REST 对比**: ``` REST: - 多端点 (/users, /posts, /comments) - 过度获取/获取不足 - 版本管理复杂 GraphQL: - 单端点 (/graphql) - 按需获取 - 版本演进友好 ``` ### GraphQL 架构 **基本组件**: ``` Schema (模式): - 类型定义 - 查询 (Query) - 变更 (Mutation) - 订阅 (Subscription) Resolver (解析器): - 字段解析逻辑 - 数据源连接 - 业务逻辑 ``` **查询示例**: ```graphql # 查询用户及其文章 query { user(id: "123") { name email posts { title content comments { text author { name } } } } } ``` --- ## GraphQL 特有漏洞 ### 漏洞分类 **OWASP GraphQL Top 8**: ``` 1. 注入漏洞 (Injection) 2. 认证失效 (Authentication) 3. 授权问题 (Authorization) 4. 资源滥用 (Resource Abuse) 5. 通用漏洞 (Generic) 6. 操作问题 (Operational) 7. 供应链问题 (Supply Chain) 8. 其他 (Other) ``` ### 注入漏洞 **SQL 注入**: ```graphql # 恶意查询 query { user(filter: {name: "admin' OR '1'='1"}) { id name email } } # 联合查询注入 query { user(id: "1 UNION SELECT password FROM users--") { name } } ``` **NoSQL 注入**: ```graphql # MongoDB 注入 query { user(filter: {name: {$ne: null}}) { password } } ``` **命令注入**: ```graphql # 解析器中的命令注入 mutation { runCommand(cmd: "ls; cat /etc/passwd") } ``` --- ## 查询深度攻击 ### 深度查询攻击 **攻击原理**: ```graphql # 正常查询 (深度 3) query { user { posts { comments { text } } } } # 恶意深度查询 (深度 10+) query { user { posts { comments { author { posts { comments { author { posts { comments { author { name # 指数级资源消耗 } } } } } } } } } } } ``` **资源消耗计算**: ``` 假设: - 用户有 10 篇文章 - 每篇文章有 10 条评论 - 每条评论有 1 个作者 深度 3: 1 × 10 × 10 = 100 记录 深度 5: 1 × 10 × 10 × 1 × 10 = 1,000 记录 深度 10: 10^5 = 100,000 记录 深度 20: 10^10 = 100 亿记录 (DoS) ``` ### 防护方案 **深度限制**: ```javascript // Apollo Server 深度限制 import depthLimit from 'graphql-depth-limit'; const server = new ApolloServer({ schema, validationRules: [depthLimit(10)] // 最大深度 10 }); ``` **复杂度分析**: ```javascript // 查询复杂度计算 const complexity = { Query: { user: () => 1, posts: () => 5, comments: () => 3 } }; // 限制总复杂度 maxComplexity: 1000 ``` --- ## 批量查询攻击 ### 别名攻击 **攻击原理**: ```graphql # 使用别名执行多次查询 query { user1: user(id: "1") { email } user2: user(id: "2") { email } user3: user(id: "3") { email } # ... 重复 1000 次 user1000: user(id: "1000") { email } } ``` **资源耗尽**: ``` 单次查询成本:1 1000 次查询成本:1000 数据库连接耗尽 内存耗尽 响应时间超时 ``` ### 批量攻击防护 **查询数量限制**: ```javascript // 限制查询操作数量 const batchLimit = require('graphql-batch-limit'); validationRules: [batchLimit(10)] // 最多 10 个操作 ``` **速率限制**: ```javascript // 基于 IP 的速率限制 const rateLimit = { windowMs: 60000, // 1 分钟 max: 100 // 最多 100 次查询 }; app.use('/graphql', rateLimitMiddleware); ``` **查询成本分析**: ```javascript // 计算查询成本 function calculateCost(query) { const fieldCosts = { user: 1, posts: 5, comments: 3, author: 2 }; // 遍历查询树计算总成本 return totalCost; } // 拒绝高成本查询 if (cost > 1000) { throw new Error('Query too complex'); } ``` --- ## 内省漏洞 ### 内省查询 **内省功能**: ```graphql # 查询所有类型 query { __schema { types { name description fields { name type { name kind } } } } } # 查询可用查询 query { __type(name: "Query") { fields { name description } } } # 查询可用变更 query { __type(name: "Mutation") { fields { name description } } } ``` **信息泄露风险**: ``` 内省查询可能泄露: - 完整 API 结构 - 隐藏的管理功能 - 敏感字段名称 - 数据类型和关系 - 认证/授权机制 ``` ### 内省防护 **生产环境禁用内省**: ```javascript // Apollo Server 配置 const server = new ApolloServer({ schema, introspection: process.env.NODE_ENV !== 'production', playground: process.env.NODE_ENV !== 'production' }); ``` **条件内省**: ```javascript // 仅允许特定用户内省 const server = new ApolloServer({ schema, introspection: (request) => { const user = getUserFromRequest(request); return user?.isAdmin === true; } }); ``` **隐藏敏感类型**: ```javascript // 使用 schema filter const schemaFilter = (schema) => { // 移除敏感类型 const filteredTypes = schema.types.filter( type => !type.name.startsWith('Admin') ); return filteredTypes; }; ``` --- ## 授权漏洞 ### 字段级授权 **授权问题**: ```graphql # 未授权访问其他用户数据 query { user(id: "123") { # 应该是当前用户 email password # 敏感字段 ssn # 社保号 } } ``` **防护方案**: ```javascript // 字段级授权中间件 const authDirective = { visitFieldDefinition(field) { const { requires } = this.args; field.resolve = async (parent, args, context, info) => { if (!context.user) { throw new Error('Unauthorized'); } if (requires && !context.user.roles.includes(requires)) { throw new Error('Insufficient permissions'); } return field.resolve(parent, args, context, info); }; } }; // Schema 中使用 type User { email: String @auth(requires: "USER") password: String @auth(requires: "ADMIN") ssn: String @auth(requires: "ADMIN") } ``` ### IDOR 漏洞 **漏洞示例**: ```graphql # 未验证所有权 query { order(id: "12345") { # 未检查是否属于当前用户 items total address } } ``` **防护方案**: ```javascript // 所有权验证 const resolvers = { Query: { order: async (parent, { id }, context) => { const order = await db.order.findById(id); // 验证所有权 if (order.userId !== context.user.id) { throw new Error('Not authorized'); } return order; } } }; ``` --- ## 防护方案 ### 输入验证 **查询验证**: ```javascript // 验证查询结构 function validateQuery(query) { // 检查深度 if (getDepth(query) > MAX_DEPTH) { throw new Error('Query too deep'); } // 检查复杂度 if (calculateComplexity(query) > MAX_COMPLEXITY) { throw new Error('Query too complex'); } // 检查批量操作 if (countOperations(query) > MAX_BATCH) { throw new Error('Too many operations'); } } ``` **参数验证**: ```javascript // 验证输入参数 const validateInput = { ID: (id) => { if (!/^[a-zA-Z0-9_-]+$/.test(id)) { throw new Error('Invalid ID format'); } return id; }, Email: (email) => { if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) { throw new Error('Invalid email'); } return email; } }; ``` ### 安全配置 **生产环境配置**: ```javascript const productionConfig = { // 禁用调试功能 introspection: false, playground: false, debug: false, // 启用安全限制 validationRules: [ depthLimit(10), batchLimit(10), complexityLimit(1000) ], // 错误处理 formatError: (error) => { // 生产环境不泄露详细错误 if (process.env.NODE_ENV === 'production') { return { message: 'Internal server error' }; } return error; } }; ``` **日志与监控**: ```javascript // 查询日志 const queryLogger = { requestDidStart(requestContext) { const startTime = Date.now(); return { willSendResponse() { const duration = Date.now() - startTime; logger.info('GraphQL Query', { query: requestContext.request.query, duration, userId: requestContext.context.user?.id }); } }; } }; // 异常查询告警 if (duration > 5000 || complexity > 500) { alert('Suspicious GraphQL query detected'); } ``` --- ## 实战案例 ### 案例 1: 深度查询 DoS 攻击 **漏洞场景**: ``` 目标:社交网络 GraphQL API 漏洞:无查询深度限制 影响:服务不可用 ``` **攻击过程**: ```graphql # 攻击查询 query { user { followers { following { followers { following { followers { following { name # 深度 7 } } } } } } } } # 资源消耗 # 假设平均每人有 100 个关注者 # 深度 7 = 100^3.5 ≈ 1000 万次查询 ``` **修复方案**: ```javascript // 实施深度限制 import depthLimit from 'graphql-depth-limit'; const server = new ApolloServer({ schema, validationRules: [depthLimit(5)] // 最大深度 5 }); // 添加复杂度限制 const complexityLimit = require('graphql-cost-analysis'); validationRules: [ depthLimit(5), complexityLimit({ maximumCost: 1000 }) ]; ``` ### 案例 2: 内省信息泄露 **漏洞场景**: ``` 目标:电商 GraphQL API 漏洞:生产环境启用内省 影响:API 结构完全暴露 ``` **攻击过程**: ```graphql # 1. 获取完整 Schema query { __schema { types { name fields { name type { name } } } } } # 2. 发现隐藏的管理功能 query { __type(name: "AdminMutation") { fields { name description } } } # 3. 利用发现的功能 mutation { adminCreateUser(email: "attacker@evil.com", role: "ADMIN") } ``` **修复方案**: ```javascript // 生产环境禁用内省 const server = new ApolloServer({ schema, introspection: process.env.NODE_ENV === 'development', playground: process.env.NODE_ENV === 'development' }); // 隐藏敏感类型 const schemaTransform = (schema) => { // 移除管理相关类型 return filterTypes(schema, (type) => { return !type.name.startsWith('Admin'); }); }; ``` ### 案例 3: 批量查询数据窃取 **漏洞场景**: ``` 目标:用户数据 API 漏洞:无批量查询限制 影响:大规模数据泄露 ``` **攻击过程**: ```graphql # 批量获取所有用户邮箱 query { u1: user(id: "1") { email } u2: user(id: "2") { email } u3: user(id: "3") { email } # ... 重复 10000 次 u10000: user(id: "10000") { email } } # 结果:10000 个用户邮箱被窃取 ``` **修复方案**: ```javascript // 批量查询限制 const batchLimit = require('graphql-batch-limit'); const server = new ApolloServer({ schema, validationRules: [batchLimit(10)] // 最多 10 个操作 }); // 速率限制 const rateLimit = require('express-rate-limit'); app.use('/graphql', rateLimit({ windowMs: 60 * 1000, // 1 分钟 max: 100 // 最多 100 次请求 })); // 分页强制 const paginatedResolver = async (parent, args, context) => { const page = args.page || 1; const limit = Math.min(args.limit || 20, 100); // 最大 100 return db.query({ offset: (page - 1) * limit, limit: limit }); }; ``` --- ## 总结与思考 ### 核心要点回顾 1. **GraphQL 概述**:查询语言、单端点、强类型 2. **特有漏洞**:注入、认证、授权、资源滥用 3. **深度攻击**:指数级资源消耗、深度限制 4. **批量攻击**:别名滥用、速率限制 5. **内省漏洞**:信息泄露、生产禁用 6. **授权漏洞**:字段级授权、IDOR 防护 7. **防护方案**:输入验证、安全配置、监控 ### 深入思考 **GraphQL 安全挑战**: - 灵活性 vs 安全性平衡 - 性能 vs 限制权衡 - 开发体验 vs 安全控制 **最佳实践**: - 默认安全配置 - 深度和复杂度限制 - 字段级授权 - 生产禁用内省 - 完整日志监控 ### 未来趋势 **发展方向**: - 自动安全分析 - AI 驱动异常检测 - 标准化安全实践 - 更好的工具支持 --- ## 参考资料 ### 学习资源 - **OWASP GraphQL Security**: https://owasp.org/www-project-graphql-security/ - **GraphQL Security Cheat Sheet**: https://cheatsheetseries.owasp.org/cheatsheets/GraphQL_Cheat_Sheet.html - **Awesome GraphQL Security**: https://github.com/dolevf/awesome-graphql-security ### 工具资源 - **GraphQL Voyager**: https://graphql-voyager.now.sh - **GraphQL Playground**: https://github.com/prisma-labs/graphql-playground - **InQL Scanner**: https://github.com/dolevf/inql --- *Day 91 完成 | GraphQL 安全详解 | 字数:约 18,000 字*
myh0st
2026年4月13日 23:15
分享文档
收藏文档
上一篇
下一篇
微信扫一扫
复制链接
手机扫一扫进行分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码