前端是用户与系统交互的第一线,也因此容易成为攻击目标。下面总结了常见的前端攻击方式以及对应的防御策略,从安全角度帮助你构建更稳固的前端系统。
一、常见前端攻击方式及防御措施
| 攻击方式 | 描述 | 防御方法 |
|---|---|---|
| XSS(跨站脚本攻击) | 注入恶意脚本到页面,盗取用户信息、伪造操作 | ✅ 输出内容时进行 HTML 转义✅ 使用 DOMPurify 过滤富文本✅ CSP 限制脚本来源✅ 不拼接 HTML,使用框架绑定 |
| CSRF(跨站请求伪造) | 利用用户登录状态伪造请求 | ✅ 使用 SameSite Cookie✅ 请求中携带 CSRF Token 验证✅ 重要操作使用 POST + Token |
| Clickjacking(点击劫持) | 把页面嵌入 iframe 中,诱导点击 | ✅ 在响应头设置 X-Frame-Options: DENY 或 Content-Security-Policy: frame-ancestors 'none' |
| Open Redirect(开放重定向) | 恶意引导用户跳转到钓鱼网站 | ✅ 不信任 URL 参数,白名单校验跳转地址 |
| Form Injection / DOM Injection | 注入伪造表单或 HTML 节点 | ✅ 使用安全的 DOM API,避免 innerHTML 拼接 |
| Man-in-the-middle(中间人攻击) | 未加密通信被监听、篡改 | ✅ 全站启用 HTTPS✅ 使用 HSTS 强制 HTTPS |
| localStorage 泄漏 | XSS 导致 localStorage 中的 token 被盗 | ✅ 尽量用 HttpOnly Cookie 存储敏感信息 |
| Subresource Integrity (SRI) 缺失 | 外部 script 被篡改执行恶意代码 | ✅ 使用 <script src integrity="..." crossorigin="anonymous"> |
| 前端源码泄露 / 反编译 | 代码被直接查看,甚至被篡改 | ✅ 使用构建工具混淆压缩代码✅ 不在前端暴露敏感逻辑(如权限判断、密钥等) |
| 缓存投毒 | 利用不安全缓存导致数据混乱或污染 | ✅ 设置合适的 Cache-Control✅ 动态接口禁止中间代理缓存 |
二、具体攻击示例
🧨 XSS 示例
<!-- 恶意输入 -->
<input value="<script>alert('xss')</script>">
防御方式:
使用前端模板绑定而非拼接 HTML,或进行转义:
// ❌ 不安全
element.innerHTML = userInput;
// ✅ 安全
element.textContent = userInput;
🧨 CSRF 示例
攻击者页面自动提交用户浏览器中有效 Cookie 请求:
<img src="https://your-site.com/api/delete?id=123" />
防御方式:
- Cookie 设置
SameSite=Lax|Strict - 请求校验 CSRF token(如 Django、Laravel 都有内建支持)
三、通用前端安全最佳实践
✅ 内容安全策略 CSP
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com;
限制脚本来源,防止加载恶意 JS。
✅ Cookie 设置示例(Next.js、Express 中)
Set-Cookie: token=abc; HttpOnly; Secure; SameSite=Strict; Path=/
HttpOnly: JS 无法访问(防止 XSS)Secure: 仅 HTTPS 有效SameSite: 限制跨站请求使用
✅ 客户端依赖检查
- 使用可信任 CDN 或本地缓存
- 开启 SRI 校验:
<script src="..." integrity="sha384-..." crossorigin="anonymous"></script>
✅ 使用安全开发库
-
对用户输入富文本使用
DOMPurify -
对路径、URL、HTML 转义使用:
encodeURIComponentlodash.escapesanitize-html
四、安全检测工具推荐
| 工具 | 说明 |
|---|---|
| SonarLint | 实时代码静态扫描(插件) |
| OWASP ZAP | 动态安全测试 |
| Google Lighthouse | 检查 HTTPS、CSP、安全标头等 |
| Retire.js | 检查前端依赖漏洞 |
| npm audit | 检查第三方库漏洞 |
五、总结建议
- 不信任任何用户输入
- 最小权限原则(最小暴露)
- 安全配置写进默认架构
- 推荐将认证信息存入 Cookie(含 HttpOnly)而非 localStorage
- 使用安全标头(CSP、X-Frame-Options、HSTS、X-Content-Type-Options 等)