网络安全
网络安全简介
网络安全是指保护网络系统和数据免受未授权访问、使用、披露、破坏、修改或销毁的技术和实践。
常见网络攻击
1. XSS攻击
XSS简介
XSS(Cross-Site Scripting)攻击是一种注入攻击,攻击者将恶意脚本注入到受信任的网站中。
XSS类型
- 存储型XSS:恶意脚本存储在服务器数据库中
- 反射型XSS:恶意脚本包含在URL中,服务器反射回客户端
- DOM型XSS:恶意脚本通过操作DOM执行
XSS攻击示例
<!-- 存储型XSS -->
<div class="comment">
<p>这是一条评论</p>
<script>alert('XSS')</script>
</div>
<!-- 反射型XSS -->
<!-- URL: https://example.com/search?q=<script>alert('XSS')</script> -->
<div class="search-results">
<p>搜索结果: <script>alert('XSS')</script></p>
</div>
<!-- DOM型XSS -->
<div id="result"></div>
<script>
const query = new URLSearchParams(location.search).get('q');
document.getElementById('result').innerHTML = `搜索结果: ${query}`;
</script>XSS防护
// 输入验证
function sanitizeInput(input) {
return input
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
// 使用textContent而非innerHTML
document.getElementById('result').textContent = `搜索结果: ${query}`;
// 使用DOMPurify
// npm install dompurify
import DOMPurify from 'dompurify';
document.getElementById('result').innerHTML = DOMPurify.sanitize(`搜索结果: ${query}`);
// 设置Content-Security-Policy
// Content-Security-Policy: default-src 'self'; script-src 'self'2. CSRF攻击
CSRF简介
CSRF(Cross-Site Request Forgery)攻击是一种欺骗用户在已认证的Web应用上执行非预期操作的攻击。
CSRF攻击流程
- 用户登录正常网站A
- 网站A返回Cookie
- 用户访问恶意网站B
- 恶意网站B发送请求到网站A
- 浏览器携带Cookie发送请求
- 网站A执行恶意操作
CSRF攻击示例
<!-- 恶意网站B -->
<img src="https://example.com/transfer?amount=1000&to=attacker" style="display: none;">
<form action="https://example.com/change-password" method="POST" style="display: none;">
<input type="hidden" name="password" value="attacker123">
<input type="submit" id="submit">
</form>
<script>
document.getElementById('submit').click();
</script>CSRF防护
// 使用CSRF Token
// 服务器生成Token
const csrfToken = crypto.randomBytes(32).toString('hex');
req.session.csrfToken = csrfToken;
// 前端包含Token
<form action="/transfer" method="POST">
<input type="hidden" name="_csrf" value="<%= csrfToken %>">
<input type="text" name="amount">
<input type="text" name="to">
<input type="submit">
</form>
// 服务器验证Token
function validateCsrfToken(req, res, next) {
if (req.body._csrf !== req.session.csrfToken) {
return res.status(403).send('Invalid CSRF token');
}
next();
}
// 检查Referer和Origin头
function validateReferer(req, res, next) {
const referer = req.headers.referer;
const origin = req.headers.origin;
if (!referer || !referer.includes('example.com')) {
return res.status(403).send('Invalid referer');
}
next();
}
// 使用SameSite Cookie
// Set-Cookie: sessionId=abc123; SameSite=Strict3. SQL注入攻击
SQL注入简介
SQL注入攻击是通过在用户输入中插入恶意SQL代码,使服务器执行非预期的SQL语句。
SQL注入示例
// 恶意输入
const username = "admin' --";
const password = "anything";
// 原始SQL
const sql = `SELECT * FROM users WHERE username = '${username}' AND password = '${password}'`;
// 执行的SQL
// SELECT * FROM users WHERE username = 'admin' --' AND password = 'anything'SQL注入防护
// 使用参数化查询
const sql = "SELECT * FROM users WHERE username = ? AND password = ?";
db.query(sql, [username, password], (err, results) => {
// 处理结果
});
// 使用ORM框架
const user = await User.findOne({
where: {
username: username,
password: password
}
});
// 输入验证
function validateInput(input) {
return input.replace(/['";]/g, '');
}
// 最小权限原则
// 数据库用户只授予必要的权限4. 点击劫持
点击劫持简介
点击劫持是一种通过覆盖透明或半透明层,欺骗用户点击预期之外的内容的攻击。
点击劫持示例
<!-- 恶意网站 -->
<style>
#target {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 0;
z-index: 2;
}
#decoy {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1;
}
</style>
<iframe id="target" src="https://example.com/transfer"></iframe>
<div id="decoy">
<button>点击领取奖品</button>
</div>点击劫持防护
// 设置X-Frame-Options
// X-Frame-Options: DENY
// X-Frame-Options: SAMEORIGIN
// X-Frame-Options: ALLOW-FROM https://example.com
// 使用Content-Security-Policy
// Content-Security-Policy: frame-ancestors 'self';
// JavaScript防护
if (top !== self) {
top.location = self.location;
}5. DDoS攻击
DDoS简介
DDoS(Distributed Denial of Service)攻击是通过分布式网络发送大量请求,使服务器无法正常响应的攻击。
DDoS类型
- SYN Flood:发送大量SYN包,占用服务器资源
- UDP Flood:发送大量UDP包,占用带宽
- HTTP Flood:发送大量HTTP请求,占用服务器资源
- DNS Amplification:利用DNS服务器放大流量
DDoS防护
- CDN:使用内容分发网络
- 负载均衡:分散流量
- 速率限制:限制单个IP的请求速率
- 防火墙:过滤恶意流量
- 黑洞路由:丢弃特定IP的流量
HTTPS
HTTPS简介
HTTPS(HTTP Secure)是HTTP的安全版本,通过SSL/TLS协议提供加密通信和身份验证。
HTTPS工作原理
- 客户端发起HTTPS请求
- 服务器返回证书
- 客户端验证证书
- 客户端生成随机对称密钥
- 客户端使用服务器公钥加密密钥
- 服务器使用私钥解密密钥
- 双方使用对称密钥加密通信
HTTPS握手过程
- Client Hello:客户端发送支持的SSL/TLS版本、加密套件
- Server Hello:服务器选择SSL/TLS版本、加密套件
- Certificate:服务器发送证书
- Server Hello Done:服务器完成初始握手
- Client Key Exchange:客户端发送加密的预主密钥
- Change Cipher Spec:客户端通知切换到加密模式
- Finished:客户端发送加密的握手验证
- Change Cipher Spec:服务器通知切换到加密模式
- Finished:服务器发送加密的握手验证
HTTPS证书
证书类型
- 域名验证(DV):验证域名所有权
- 组织验证(OV):验证组织信息
- 扩展验证(EV):最高级别的验证
证书链
- 根证书:自签名,内置在浏览器中
- 中间证书:由根证书签名
- 服务器证书:由中间证书签名
证书验证
- 有效性:检查证书是否在有效期内
- 完整性:检查证书是否被篡改
- 可信度:检查证书是否由受信任的CA签发
- 域名匹配:检查证书域名是否匹配
密码安全
密码存储
// 不好的做法:明文存储
const user = {
username: 'admin',
password: 'password123'
};
// 好的做法:使用bcrypt
// npm install bcrypt
import bcrypt from 'bcrypt';
const saltRounds = 12;
const password = 'password123';
// 哈希密码
bcrypt.hash(password, saltRounds, (err, hash) => {
const user = {
username: 'admin',
passwordHash: hash
};
});
// 验证密码
bcrypt.compare(password, user.passwordHash, (err, result) => {
if (result) {
console.log('密码正确');
} else {
console.log('密码错误');
}
});密码策略
- 长度:至少8位
- 复杂度:包含大小写字母、数字、特殊字符
- 定期更换:建议90天更换一次
- 多因素认证:使用短信、邮箱或App验证
内容安全策略
CSP简介
CSP(Content Security Policy)是一种安全机制,通过指定允许的资源来源,减少XSS等攻击的风险。
CSP指令
| 指令 | 描述 | 示例 |
|---|---|---|
| default-src | 默认资源来源 | 'self' |
| script-src | 脚本来源 | 'self' https://cdn.example.com |
| style-src | 样式来源 | 'self' 'unsafe-inline' |
| img-src | 图片来源 | 'self' data: |
| font-src | 字体来源 | 'self' https://fonts.googleapis.com |
| connect-src | 连接来源 | 'self' https://api.example.com |
| frame-src | 框架来源 | 'self' |
| object-src | 插件来源 | 'none' |
| base-uri | 基础URI | 'self' |
| form-action | 表单提交目标 | 'self' |
| report-uri | 违规报告地址 | /csp-report |
CSP使用
<!-- 使用meta标签 -->
<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:">
<!-- 使用HTTP头部 -->
<!-- Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com -->CSP报告
// 服务器端处理CSP报告
app.post('/csp-report', (req, res) => {
console.log('CSP违规:', req.body);
res.status(204).send();
});
// CSP配置
// Content-Security-Policy: default-src 'self'; script-src 'self'; report-uri /csp-report同源策略
同源策略简介
同源策略是浏览器的安全机制,限制不同源的脚本访问资源。
同源定义
同源是指协议、域名、端口都相同。
| URL | 是否同源 | 原因 |
|---|---|---|
| https://example.com/page2.html | 是 | 协议、域名、端口相同 |
| http://example.com/page2.html | 否 | 协议不同 |
| https://www.example.com/page2.html | 否 | 域名不同 |
| https://example.com:8080/page2.html | 否 | 端口不同 |
跨域解决方案
- CORS:跨域资源共享
- JSONP:使用
<script>标签的跨域能力 - WebSocket:不受同源策略限制
- 代理服务器:使用服务器代理请求
- PostMessage:窗口间通信
安全头
常见安全头
| 头部 | 描述 | 示例 |
|---|---|---|
| Strict-Transport-Security | 强制使用HTTPS | max-age=31536000; includeSubDomains |
| X-Content-Type-Options | 防止MIME类型嗅探 | nosniff |
| X-Frame-Options | 防止点击劫持 | DENY |
| X-XSS-Protection | 防止XSS攻击 | 1; mode=block |
| Referrer-Policy | 控制Referer头 | strict-origin-when-cross-origin |
| Feature-Policy | 控制浏览器功能 | camera 'none'; microphone 'none' |
| Permissions-Policy | 控制浏览器权限 | geolocation=(self) |
安全头配置
// Express.js配置
app.use((req, res, next) => {
// HSTS
res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
// MIME类型嗅探
res.setHeader('X-Content-Type-Options', 'nosniff');
// 点击劫持
res.setHeader('X-Frame-Options', 'DENY');
// XSS保护
res.setHeader('X-XSS-Protection', '1; mode=block');
// Referrer策略
res.setHeader('Referrer-Policy', 'strict-origin-when-cross-origin');
// 功能策略
res.setHeader('Feature-Policy', 'camera \'none\'; microphone \'none\'');
// 权限策略
res.setHeader('Permissions-Policy', 'geolocation=(self)');
next();
});面试常见问题
1. 什么是XSS攻击?如何防护?
XSS攻击是一种注入攻击,攻击者将恶意脚本注入到受信任的网站中。防护措施包括:
- 输入验证和转义
- 使用textContent而非innerHTML
- 使用DOMPurify
- 设置Content-Security-Policy
2. 什么是CSRF攻击?如何防护?
CSRF攻击是一种欺骗用户在已认证的Web应用上执行非预期操作的攻击。防护措施包括:
- 使用CSRF Token
- 检查Referer和Origin头
- 使用SameSite Cookie
3. 什么是SQL注入攻击?如何防护?
SQL注入攻击是通过在用户输入中插入恶意SQL代码,使服务器执行非预期的SQL语句。防护措施包括:
- 使用参数化查询
- 使用ORM框架
- 输入验证
- 最小权限原则
4. HTTPS的工作原理?
- 客户端发起HTTPS请求
- 服务器返回证书
- 客户端验证证书
- 客户端生成随机对称密钥
- 客户端使用服务器公钥加密密钥
- 服务器使用私钥解密密钥
- 双方使用对称密钥加密通信
5. 什么是CSP?如何使用?
CSP(Content Security Policy)是一种安全机制,通过指定允许的资源来源,减少XSS等攻击的风险。使用方法包括:
- 使用meta标签
- 使用HTTP头部
- 配置各种指令
6. 什么是同源策略?如何解决跨域问题?
同源策略是浏览器的安全机制,限制不同源的脚本访问资源。跨域解决方案包括:
- CORS
- JSONP
- WebSocket
- 代理服务器
- PostMessage
7. 什么是DDoS攻击?如何防护?
DDoS攻击是通过分布式网络发送大量请求,使服务器无法正常响应的攻击。防护措施包括:
- CDN
- 负载均衡
- 速率限制
- 防火墙
- 黑洞路由
8. 密码如何安全存储?
使用bcrypt等哈希算法存储密码,而不是明文存储。bcrypt会自动处理盐值,并具有适当的计算成本。
9. 什么是点击劫持?如何防护?
点击劫持是一种通过覆盖透明或半透明层,欺骗用户点击预期之外的内容的攻击。防护措施包括:
- 设置X-Frame-Options
- 使用Content-Security-Policy
- JavaScript防护
10. 常见的安全头有哪些?
- Strict-Transport-Security
- X-Content-Type-Options
- X-Frame-Options
- X-XSS-Protection
- Referrer-Policy
- Feature-Policy
- Permissions-Policy
通过理解网络安全的各种威胁和防护措施,可以更好地保护Web应用的安全。