Skip to content

网络安全

网络安全简介

网络安全是指保护网络系统和数据免受未授权访问、使用、披露、破坏、修改或销毁的技术和实践。

常见网络攻击

1. XSS攻击

XSS简介

XSS(Cross-Site Scripting)攻击是一种注入攻击,攻击者将恶意脚本注入到受信任的网站中。

XSS类型

  • 存储型XSS:恶意脚本存储在服务器数据库中
  • 反射型XSS:恶意脚本包含在URL中,服务器反射回客户端
  • DOM型XSS:恶意脚本通过操作DOM执行

XSS攻击示例

html
<!-- 存储型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防护

javascript
// 输入验证
function sanitizeInput(input) {
  return input
    .replace(/&/g, '&amp;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;')
    .replace(/'/g, '&#039;');
}

// 使用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攻击流程

  1. 用户登录正常网站A
  2. 网站A返回Cookie
  3. 用户访问恶意网站B
  4. 恶意网站B发送请求到网站A
  5. 浏览器携带Cookie发送请求
  6. 网站A执行恶意操作

CSRF攻击示例

html
<!-- 恶意网站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防护

javascript
// 使用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=Strict

3. SQL注入攻击

SQL注入简介

SQL注入攻击是通过在用户输入中插入恶意SQL代码,使服务器执行非预期的SQL语句。

SQL注入示例

javascript
// 恶意输入
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注入防护

javascript
// 使用参数化查询
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. 点击劫持

点击劫持简介

点击劫持是一种通过覆盖透明或半透明层,欺骗用户点击预期之外的内容的攻击。

点击劫持示例

html
<!-- 恶意网站 -->
<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>

点击劫持防护

javascript
// 设置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工作原理

  1. 客户端发起HTTPS请求
  2. 服务器返回证书
  3. 客户端验证证书
  4. 客户端生成随机对称密钥
  5. 客户端使用服务器公钥加密密钥
  6. 服务器使用私钥解密密钥
  7. 双方使用对称密钥加密通信

HTTPS握手过程

  1. Client Hello:客户端发送支持的SSL/TLS版本、加密套件
  2. Server Hello:服务器选择SSL/TLS版本、加密套件
  3. Certificate:服务器发送证书
  4. Server Hello Done:服务器完成初始握手
  5. Client Key Exchange:客户端发送加密的预主密钥
  6. Change Cipher Spec:客户端通知切换到加密模式
  7. Finished:客户端发送加密的握手验证
  8. Change Cipher Spec:服务器通知切换到加密模式
  9. Finished:服务器发送加密的握手验证

HTTPS证书

证书类型

  • 域名验证(DV):验证域名所有权
  • 组织验证(OV):验证组织信息
  • 扩展验证(EV):最高级别的验证

证书链

  • 根证书:自签名,内置在浏览器中
  • 中间证书:由根证书签名
  • 服务器证书:由中间证书签名

证书验证

  • 有效性:检查证书是否在有效期内
  • 完整性:检查证书是否被篡改
  • 可信度:检查证书是否由受信任的CA签发
  • 域名匹配:检查证书域名是否匹配

密码安全

密码存储

javascript
// 不好的做法:明文存储
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使用

html
<!-- 使用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报告

javascript
// 服务器端处理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端口不同

跨域解决方案

  1. CORS:跨域资源共享
  2. JSONP:使用&lt;script&gt;标签的跨域能力
  3. WebSocket:不受同源策略限制
  4. 代理服务器:使用服务器代理请求
  5. PostMessage:窗口间通信

安全头

常见安全头

头部描述示例
Strict-Transport-Security强制使用HTTPSmax-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)

安全头配置

javascript
// 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的工作原理?

  1. 客户端发起HTTPS请求
  2. 服务器返回证书
  3. 客户端验证证书
  4. 客户端生成随机对称密钥
  5. 客户端使用服务器公钥加密密钥
  6. 服务器使用私钥解密密钥
  7. 双方使用对称密钥加密通信

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应用的安全。

好好学习,天天向上