Web 安全
XSS(跨站脚本攻击)
- 攻击者向网页注入恶意脚本,当用户浏览页面时,脚本在用户浏览器执行,窃取数据或发起攻击。
- 如何区分存储型/反射型/DOM 型 XSS?防御方案有哪些?
- 类型:
- 存储型:恶意脚本存储到服务器(如评论区内容),所有访问者均受影响。
- 反射型:恶意脚本通过 URL 参数注入(如钓鱼链接),需用户主动触发。
- DOM 型:前端直接操作 DOM 导致(如
innerHTML
),不经过服务端。
- 防御:
- 输入过滤 + 输出转义(将
<
、>
转义为<
、>
)。 - 避免使用
innerHTML
,优先用textContent
或setAttribute
。 - 启用CSP 内容安全策略(限制脚本来源)。
- Cookie 设置
HttpOnly
防止脚本窃取。
- 输入过滤 + 输出转义(将
- 类型:
CSRF(跨站请求伪造)
- 攻击者诱导用户访问恶意页面,伪造用户在已登录的站点发起非预期操作(如转账)。
- CSRF 攻击流程是什么?如何防御?
- 流程:用户登录 A 站 → 诱导访问 B 站 → B 站伪造 A 站请求(利用自动携带的 Cookie)。
- 防御:
- CSRF Token:服务端生成随机 Token,前端提交时携带并验证。
- 校验请求头
Origin/Referer
(禁止跨域请求)。 - Cookie 设置
SameSite=Strict/Lax
(限制跨域携带 Cookie)。
点击劫持(Clickjacking)
- 攻击者将目标网站嵌入透明 iframe,诱导用户点击伪装按钮(如虚假关闭弹窗)。
- 如何防止页面被嵌入到 iframe 中攻击?
- 服务端防御:
- 设置响应头:
X-Frame-Options: DENY
(禁止嵌入)或SAMEORIGIN
(仅同源)。 - 使用 CSP 的
frame-ancestors
指令(如frame-ancestors 'none'
)。
- 设置响应头:
- 前端防御(辅助):js
if (top !== window) top.location = window.location; // 非可靠,可被绕过
- 服务端防御:
CSP(内容安全策略)
- 通过 HTTP 响应头
Content-Security-Policy
限制页面资源加载来源,防止 XSS 和数据注入。 - 如何配置 CSP 策略?实际项目中如何平衡安全性与便利性?
- 配置示例:http
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com; style-src 'self' 'unsafe-inline';
- 关键指令:
default-src
:默认资源加载规则。script-src
/style-src
:限制脚本/样式来源(避免'unsafe-inline'
)。report-uri
:违规行为上报地址。
- 平衡策略:
- 开发阶段启用
Content-Security-Policy-Report-Only
监控问题。 - 逐步替换内联脚本和样式,避免直接允许
'unsafe-inline'
。
- 开发阶段启用
- 配置示例:
- CSP 配置需结合业务:例如允许
'unsafe-eval'
可能降低安全性,需评估必要性。
SQL 注入攻击
- 攻击者通过输入恶意 SQL 代码,篡改数据库查询逻辑,窃取或破坏数据(如绕过登录、删库)。
- 如何防御 SQL 注入?前端能做哪些防护?
- 防御方案:
- 参数化查询(预编译语句):避免拼接 SQL 字符串(如使用
PreparedStatement
)。 - ORM 框架:使用 Sequelize、TypeORM 等,自动处理参数转义。
- 最小权限原则:数据库账号限制为只读/必要操作权限。
- 参数化查询(预编译语句):避免拼接 SQL 字符串(如使用
- 前端辅助:
- 输入合法性校验(如长度、格式),但不可依赖前端(攻击者可直接绕过)。
- 防御方案:
- SQL 注入防御重点在后端,但前端需辅助校验减少无效请求。
HTTPS 与中间人攻击
HTTPS 如何保证数据安全?前端需要注意什么?
- 原理:SSL/TLS 加密传输 + 证书验证身份
- 前端注意:
- 使用全站 HTTPS(避免混合内容)
- 设置 HSTS 响应头:
Strict-Transport-Security: max-age=31536000
- 避免在 URL 中传递敏感参数(可能被日志记录)
CORS 配置风险
如何安全配置跨域资源共享(CORS)?
- 精确设置
Access-Control-Allow-Origin
(避免*
) - 限制
Access-Control-Allow-Methods
为必要方法 - 避免暴露敏感头:
Access-Control-Expose-Headers
- 预检请求缓存:
Access-Control-Max-Age
前端安全审计方案
如何系统化提升项目安全性?
- 流程控制:
- 代码审核:ESLint 安全规则(如
no-eval
) - 依赖检查:
npm audit
/Snyk 扫描第三方包 - CI/CD集成安全测试(如OWASP ZAP)
- 代码审核:ESLint 安全规则(如
- 监控:
- 实时日志分析异常请求
- 错误监控捕获XSS/CSRF攻击
- 应急:制定漏洞响应机制(如 CSP 紧急更新)
第三方脚本安全管理
如何安全引入 Google Analytics 等第三方 JS?
- 使用
Subresource Integrity
(SRI 哈希校验)html<script src="https://example.js" integrity="sha384-xxxx"></script>
- 通过 CSP 限制
script-src
域名 - 异步加载 + 错误降级处理
JWT 安全存储方案
前端如何安全存储 JWT Token?
- 存储位置:
- 避免 localStorage(易 XSS 窃取) → 优先存 Cookie+
HttpOnly
- 敏感操作使用短期 Token
- 避免 localStorage(易 XSS 窃取) → 优先存 Cookie+
- 传输安全:
- 仅通过 HTTPS 传输
- 避免 URL 参数传递
前端加密
在前端用 JS 加密密码是否有效?为什么?
- 无效:前端代码透明,加密密钥易泄露(中间人可替换 JS)
- 正确方案:
- 使用 HTTPS 传输明文
- 敏感数据加盐哈希(后端处理)
设计一个安全登录流程
- 输入:限制密码错误次数(防暴力破解)
- 传输:HTTPS + 验证码(防中间人/机器人)
- 存储:后端加盐哈希(如 bcrypt)
- 会话:短期 JWT Token + Refresh Token 轮换
- 监控:异常登录检测(IP/设备变更)