Web安全
1. 什么是XSS攻击?如何防范?
答案:XSS(跨站脚本攻击)是一种将恶意脚本注入到受信任网站的攻击方式。
防范措施:
- 输入验证和过滤
- 输出编码
- 使用 Content Security Policy (CSP)
- 使用 HttpOnly 标记 cookie
- 使用现代框架的内置XSS保护
- 定期进行安全审计和渗透测试
示例(输出编码):
javascript
function escapeHTML(str) {
return str.replace(/[&<>'"]/g, tag => ({
'&': '&',
'<': '<',
'>': '>',
"'": ''',
'"': '"'
}[tag] || tag));
}
2. 什么是CSRF攻击?如何防范?
答案:CSRF(跨站请求伪造)是一种强制用户在当前已登录的Web应用程序上执行非本意操作的攻击方式。
防范措施:
- 使用 CSRF Token
- 验证 HTTP Referer 字段
- 使用 SameSite Cookie 属性
- 在请求中使用自定义请求头
- 避免使用 GET 请求进行数据修改操作
- 二次验证敏感操作
示例(CSRF Token):
javascript
// 服务器端生成 token
const csrfToken = generateToken();
res.cookie('XSRF-TOKEN', csrfToken);
// 客户端发送请求时带上 token
fetch('/api/data', {
method: 'POST',
headers: {
'X-XSRF-TOKEN': getCookie('XSRF-TOKEN')
},
// ...
});
3. 什么是点击劫持(Clickjacking)?如何防范?
答案:点击劫持是一种视觉欺骗攻击,攻击者使用透明的iframe覆盖在正常网页上,诱导用户点击。
防范措施:
- 使用 X-Frame-Options 响应头
- 使用 Content Security Policy (CSP) 的 frame-ancestors 指令
- 使用 JavaScript 框架保护
- 实施 frame busting 技术
示例:
http
X-Frame-Options: DENY
Content-Security-Policy: frame-ancestors 'none'
4. 什么是SQL注入?前端如何配合后端预防SQL注入?
答案:SQL注入是一种将恶意SQL代码插入应用的输入参数中,并在后端数据库中执行的攻击技术。
前端预防措施:
- 输入验证和过滤
- 使用参数化查询或预处理语句
- 限制输入长度和类型
- 避免直接将用户输入拼接到SQL查询中
- 使用 ORM(对象关系映射)库
示例(参数化查询):
javascript
// 后端 Node.js 示例
const sql = 'SELECT * FROM users WHERE id = ?';
connection.query(sql, [userId], (error, results) => {
// 处理结果
});
5. 什么是中间人攻击?如何防范?
答案:中间人攻击是攻击者插入到两个通信方之间,能够窃听和篡改他们之间传输的数据的攻击方式。
防范措施:
- 使用HTTPS协议
- 实施 HTTP Strict Transport Security (HSTS)
- 使用证书固定(Certificate Pinning)
- 避免使用公共Wi-Fi,或使用VPN
- 检查证书的有效性
- 使用双因素认证
示例(HSTS 头):
http
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
6. 什么是内容安全策略(CSP)?如何实施CSP?
答案:内容安全策略是一种额外的安全层,用于检测并削弱某些特定类型的攻击,包括 XSS 和数据注入攻击。
实施CSP:
- 设置 Content-Security-Policy HTTP 头
- 使用
<meta>
标签在页面中设置CSP - 定义允许加载的资源的源
- 禁用不安全的内联代码和eval()
- 报告CSP违规
示例:
http
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com;
7. 什么是子资源完整性(SRI)?如何使用SRI?
答案:子资源完整性是一种安全功能,允许浏览器检查其获得的资源(例如从 CDN 获得的)是否被篡改。
使用SRI:
- 为资源生成一个加密散列
- 在
<script>
或<link>
标签中使用 integrity 属性
示例:
html
<script src="https://example.com/example-framework.js"
integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
crossorigin="anonymous"></script>
8. 什么是安全的密码存储?前端在密码安全方面应注意什么?
答案:安全的密码存储通常在后端实现,包括使用强哈希算法、加盐等技术。
前端注意事项:
- 使用HTTPS传输密码
- 不在前端存储明文密码
- 实施密码强度检查
- 使用双因素认证
- 限制登录尝试次数
- 在传输前对密码进行哈希(注意:这不能替代服务器端的哈希)
示例(密码强度检查):
javascript
function checkPasswordStrength(password) {
const minLength = 8;
const hasUpperCase = /[A-Z]/.test(password);
const hasLowerCase = /[a-z]/.test(password);
const hasNumbers = /\d/.test(password);
const hasNonalphas = /\W/.test(password);
return password.length >= minLength && hasUpperCase && hasLowerCase && hasNumbers && hasNonalphas;
}
9. 什么是CORS预检请求?它与Web安全有什么关系?
答案:CORS预检请求是浏览器在进行实际的跨源请求之前,发送的一个 OPTIONS 请求,用于检查服务器是否允许实际的请求。
与Web安全的关系:
- 防止未经授权的跨源请求
- 允许服务器指定哪些源可以访问资源
- 控制哪些HTTP方法和头部可以用于跨源请求
- 减少跨站点脚本攻击(XSS)和跨站请求伪造(CSRF)的风险
10. 什么是安全的会话管理?前端如何配合实现安全的会话管理?
答案:安全的会话管理包括创建、存储和销毁用户会话的安全实践。
前端配合措施:
- 使用 HttpOnly 和 Secure 标记的 cookies
- 实施合理的会话超时
- 在用户登出时清除会话数据
- 使用 CSRF token 保护请求
- 避免在 URL 中传递会话 ID
- 使用 HTTPS 加密所有通信
- 实现重新认证机制用于敏感操作
示例(清除会话数据):
javascript
function logout() {
// 清除本地存储的会话数据
localStorage.removeItem('sessionData');
// 发送登出请求到服务器
fetch('/api/logout', { method: 'POST' })
.then(() => {
// 重定向到登录页面
window.location.href = '/login';
});
}