Vanson's Eternal Blog

Security夯实基础

Security basic.png
Published on
/6 mins read/---

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

https://mp.weixin.qq.com/s/yz4z7hbn2ZLQI9hoZ0CaWg

Web安全学习笔记

← Previous post有趣的逻辑
Next post →Python类库Inspect