Security
Basic
CSP
什么是 CSP?
Content Security Policy (CSP) 是一种额外的安全层,用于帮助检测和减少某些类型的攻击,如跨站脚本攻击(XSS)和数据注入攻击。
CSP 通过定义一个内容安全白名单,告诉浏览器哪些外部资源(脚本、样式、图片等)可以被加载和执行。
为什么需要 CSP?
- 传统防御手段的局限性:输入验证和输出编码虽然重要,但难以做到滴水不漏。
- CSP 的优势:通过限制脚本和资源的来源,即使攻击者注入了恶意脚本,浏览器也会拒绝执行,从而大大降低 XSS 的风险。
CSP 的工作原理
指令 (Directives):CSP 通过一系列指令及其对应的允许来源来定义策略。
发送方式:
- HTTP 响应头:推荐方式,通过 Content-Security-Policy 或 Content-Security-Policy-Report-Only 头部发送。
<meta>
标签:优先级较低,不能用于某些指令。
核心 CSP 指令
- default-src:回退指令,用于未指定特定指令的资源类型。
- script-src:控制 JavaScript 的来源。
- style-src:控制 CSS 样式表的来源。
- img-src:控制图片的来源。
- connect-src:控制 AJAX、WebSocket 等接口连接的来源。
- frame-ancestors:限制哪些网站可以将当前页面嵌入到
<frame>
或<iframe>
中。
防御场景
- XSS 攻击:阻止恶意脚本执行,除非符合白名单。
- 数据泄露:限制 connect-src 防止数据外传。
- 点击劫持:通过 frame-ancestors 'none' 禁止嵌套。
- 混合内容:通过 upgrade-insecure-requests 自动升级 HTTPS。
实施 CSP 步骤
分析现有应用:了解应用加载了哪些外部资源。
从 report-only 开始:使用 Content-Security-Policy-Report-Only 收集违规报告。
逐步收紧策略:根据报告调整策略,移除 unsafe-inline 和 unsafe-eval。
考虑 nonce 或 hash:处理内联脚本和样式。
切换到强制模式:确认策略不会阻止应用正常功能后,切换到 Content-Security-Policy。
持续监控:继续收集违规报告,及时发现新问题。
结合其他安全措施:CSP 是重要安全层,但不能替代其他安全实践。
权鉴失效
问题:系统未能正确验证用户权限,导致攻击者可以越权访问敏感数据或执行危险操作。
原因:
- 未验证权限:直接信任用户请求中的参数(如 URL、Cookie)来决定权限。
- 配置错误:默认开放高权限接口,或未限制敏感功能(如删除、管理员操作)。
- 逻辑漏洞:通过修改参数(如用户 ID、角色标识)绕过权限检查。
水平越权
用户 A 将 URL https://example.com/xxx?userId=123
改为 userId=456,直接查看用户 B 的数据。
垂直越权
低权限用户访问高权限功能)
普通用户通过工具直接调用 /admin/deleteUser
接口删除其他用户。
防御措施
- 后端
- 所有权限校验必须由服务端完成,前端辅助校验。
- 每个用户只能访问与其角色或属性匹配的资源。
- 使用 UUID 替代自增数字 ID 或对资源标识加密。
- 记录用户操作日志,监控异常行为。
- 前端
- 避免在 URL 或前端存储敏感数据。
- 避免在 localStorage 中存储密码或 token。
- 屏蔽浏览器自动填充。
加密机制失效
问题:在保护敏感数据(如密码、信用卡号、API 密钥)时,
因错误使用加密算法或不当管理密钥,导致数据易被窃取或破解。
原因:
- 使用弱加密算法:如 MD5、SHA-1、DES 等已被证明不安全的算法。
- 明文存储或传输:敏感数据未加密(如密码明文存数据库)或通过 HTTP 明文传输。
- 硬编码密钥/密码:将密钥直接写在代码或配置文件中。
弱哈希存储用户密码
用户密码用 MD5 哈希存储,无盐值(Salt)。攻击者通过彩虹表快速破解弱密码。
HTTP 明文传输敏感数据
用户登录页未启用 HTTPS,密码通过 HTTP 传输。
攻击者通过中间人攻击(如公共 Wi-Fi)窃听数据。
防御措施
- 后端
- 使用 BCrypt 强哈希存储密码。
- 强制 HTTPS 与 HSTS。
- 使用 AES-GCM 模式加密算法。
- 前端
- 避免前端处理敏感数据。直接传输明文密码(通过 HTTPS),由后端哈希和验证。
- 禁用 localStorage 存储敏感数据。
跨站脚本攻击
跨站请求伪造
注入
SQL注入
OS命令注入
NoSQL注入
以MongoDB为例
LDAP注入
模板注入
XX
参考:
https://mp.weixin.qq.com/s/hUGLTIajK8-Lg6CQsSxdJQ
https://mp.weixin.qq.com/s/riu5uOGJnRzEYqyDjBXq3Q