5.安全防护场景题
查看飞书原文 ↗4,838 字符
开场话术
"前端安全不只是防XSS,需要建立完整的安全防护体系。"
"我们从代码层面到部署层面都做了安全加固。"
标准答题示例
我们的金融类应用对安全要求很高,我负责前端安全防护设计。
XSS防护方面:
•
所有用户输入都做HTML转义,用DOMPurify过滤危险标签
•
使用CSP策略限制脚本执行,阻止内联脚本
•
建立了安全编码规范,禁止使用innerHTML等危险API
CSRF防护:
•
所有状态变更请求都带CSRF Token
•
用SameSite Cookie属性限制跨站请求
•
关键操作增加二次验证,比如短信验证码
数据安全:
•
敏感数据前端不存储,用完即清
•
localStorage存储用AES加密
•
建立了数据脱敏规范,日志中不出现敏感信息
部署安全:
•
启用HTTPS和HSTS,强制安全连接
•
用Webpack的代码混淆,保护知识产权
•
建立了安全扫描流程,每次发布前自动检测漏洞
监控告警:
•
用Sentry监控前端异常,异常行为及时告警
•
建立了用户行为分析,识别潜在的攻击行为
这套安全体系上线后,0安全事故,通过了等保三级认证。
常见追问及应对
面试官: “XSS攻击具体有哪些类型?你们是怎么防护的?”
📔
答题思路:展示你对 XSS 类型划分的清晰理解,并结合代码解释防护机制的覆盖广度与落地方案。
XSS 攻击主要分为三类,我们在编码和配置层面都做了相应防护。
存储型 XSS(Stored XSS)
攻击者将恶意脚本注入数据库,其他用户在访问时触发执行,危害最大。
const maliciousComment = '<script>stealCookies()</script>';防护措施:
•
后端入库前使用白名单规则清洗(如 DOMPurify);
const sanitizedHtml = DOMPurify.sanitize(comment.content, {
ALLOWED_TAGS: ['b', 'i', 'strong', 'p'],
ALLOWED_ATTR: ['class'],
});
•
前端渲染采用 dangerouslySetInnerHTML 时进行明确的 HTML 过滤;
•
React 默认 JSX 是安全的,除非使用未经过滤的dangerouslySetInnerHTML属性:
<div dangerouslySetInnerHTML={{ __html: userInput }} />
反射型 XSS(Reflected XSS)
攻击者构造恶意链接,通过 URL 参数注入脚本,通常结合钓鱼页面使用。
// URL: http://xx.com/search?q=<script>alert('xss')</script>防护措施:
•
对 URL 参数做 HTML 编码;
•
使用 Content-Type: application/json 避免服务端直接渲染输入;
•
React、Vue 默认会自动对变量内容转义。
DOM 型 XSS(DOM-based XSS)
攻击不依赖后端,直接在前端通过 innerHTML 或 eval 等危险 API 插入脚本。
// 安全写法:textContent 替代 innerHTML
element.textContent = userInput;
React 特性:
React 本身默认做了内建转义(除非使用 dangerouslySetInnerHTML),非常适合构建防 XSS 的应用。
CSP(内容安全策略)补充防线:
借助 HTTP 头控制脚本来源、内联限制、数据加载等,是防御 XSS 的最后一道防线。
<meta http-equiv="Content-Security-Policy" content="
default-src 'self';
script-src 'self' https://cdn.example.com;
style-src 'self' 'unsafe-inline';
img-src 'self' data:;
connect-src 'self' https://api.example.com;
" />
上线时我们还配置了 CSP 违规监控(结合 securitypolicyviolation 事件)便于追踪异常加载行为。
面试官: “CSRF攻击的原理是什么?如何防护?”
📔
答题思路:说明攻击原理后,系统性覆盖前后端防御手段,并强调组合使用的重要性。
CSRF 本质上是“借用用户的登录态,在用户不知情的情况下,诱导其发起敏感请求”。
攻击示意:
<form action="https://bank.com/transfer" method="POST">
<input type="hidden" name="to" value="attacker">
</form>
防护手段一:CSRF Token 机制(主流方案)
•
服务端在会话中生成 csrf_token;
•
前端每次请求时在 Header 或 body 带上该 token;
•
后端验证 token 与 session 是否匹配。
config.headers['X-CSRF-Token'] = csrfToken;在 React 项目中我们封装了 useCSRFProtectedRequest,自动添加 token。
防护手段二:SameSite Cookie 属性
通过设置 Cookie 的 SameSite=Strict,限制第三方页面带 cookie 请求,阻断大多数 CSRF 攻击。
cookie: {
sameSite: 'strict',
secure: true,
httpOnly: true
}
防护手段三:关键操作二次验证
我们对转账、修改密码等高危行为引入短信验证码 / 动态令牌验证,增强事务完整性
{isVerifying && <VerificationCode onConfirm={confirmTransfer} />}
防护手段四:Referer 校验(兼容兜底)
用于校验请求来源域名,防止非法页面发起跨域敏感请求。
return referer?.startsWith('https://mybank.com');
我们在线上系统中实际组合使用了以上机制,确保即使某一机制失效,攻击也无法成功。
面试官: “敏感数据在前端如何保护?”
📔
答题思路:说明你理解“前端不可信”的前提,重点在数据控制、加密、安全传输与临时存储处理。
我们从“只给必要数据”到“存储加密”、“运行中清理”等多个维度来保护前端的敏感信息。
最小数据原则(减少暴露)
后端接口只返回展示所需字段,敏感字段不暴露,或者做掩码处理。
email: maskEmail(user.email); // u***@example.com
本地数据加密存储
我们封装了一个 AES 加密的 localStorage 工具类,所有缓存的 token 和用户信息都加密后再存储。
CryptoJS.AES.encrypt(JSON.stringify(value), secretKey).toString()
内存清理机制
用户提交支付信息等高敏感数据后立即清空状态,并在组件卸载时再做清理。
useEffect(() => () => {
setCardNumber('');
setCvv('');
}, []);
数据传输保障
所有接口强制 HTTPS,axios 请求中添加了常用安全头部,防止缓存、钓鱼或跨协议攻击。
headers: {
'X-Requested-With': 'XMLHttpRequest',
'Cache-Control': 'no-cache'
}
开发者工具检测(弱保护)
虽然不能完全防止调试,但我们仍提供了浏览器窗口尺寸监测脚本,一旦发现 DevTools 打开,可清空敏感数据并跳转安全页。
window.outerHeight - window.innerHeight > threshold
整体原则是:能不传就不传,必须传就加密传,传完立刻删。
面试官:“如何建立前端安全监控体系?”
📔
答题思路:展示你理解“检测 + 响应 + 告警”闭环,并从用户行为、DOM变化、CSP违规等多角度布防。
我们建立了一个分层的前端安全监控体系,核心包括:
异常行为监控
使用请求拦截器统计短时间内的请求次数,识别可能的脚本攻击。
if (requestCount > 50) {
this.reportSecurityEvent({ type: 'suspicious_request_frequency' });
}
同时监听 DOM 插入行为,监测是否有未授权脚本动态注入。
if (element.tagName === 'SCRIPT' && !element.getAttribute('data-approved')) ...
CSP 违规监控
通过监听 securitypolicyviolation 事件,实时上报 CSP 拦截的脚本或样式来源。
document.addEventListener('securitypolicyviolation', ...)这对防止 CDN 被替换、外链脚本注入非常有效。
错误监控与分类分析
使用 Sentry 统一上报安全相关异常,添加 security 标签,支持后续分类统计与告警。
event.tags = { ...event.tags, security: true };
我们还会添加自定义 breadcrumb,记录异常前的用户行为路径,帮助定位问题根源。
实时告警机制
通过 WebSocket 接入公司安全后台,监听高危事件,如脚本注入、暴力请求等。
高危告警会立即清空用户存储,锁定 session,跳转到安全提示页。
window.location.href = '/security/locked';这套体系上线后曾成功检测并阻止过一次存储型 XSS 攻击尝试,攻击者插入的脚本在 CSP 和 DOM 监控下被实时封堵,并在 15 分钟内上报后台完成审计。
💡 整体答题策略
1.
了解OWASP Top 10:熟悉Web安全的主要威胁和防护措施
2.
准备安全工具:了解CSP、HSTS、SRI等安全机制的配置和使用
3.
关注法律法规:了解数据保护相关的法律要求,如GDPR、网络安全法等
4.
准备实际案例:最好能举出处理过的真实安全事件或漏洞修复经验