Web 安全基础与常见攻击防护

常见Web安全威胁

XSS(跨站脚本攻击)

// 攻击示例
// 恶意脚本注入
<script>alert('XSS攻击')</script>

// 防护措施
// 1. 输入验证和过滤
function sanitizeInput(input) {
    return input
        .replace(/&/g, '&')
        .replace(//g, '>')
        .replace(/"/g, '"')
        .replace(/'/g, ''')
        .replace(/\//g, '/');
}

// 2. 使用Content Security Policy
// HTTP头部
Content-Security-Policy: default-src 'self'; script-src 'self' trusted.com;

CSRF(跨站请求伪造)

// 防护措施
// 1. 使用CSRF Token
// 服务器生成token
const csrfToken = generateToken();

// 在表单中嵌入token
<input type="hidden" name="_csrf" value="<%= csrfToken %>">

// 2. SameSite Cookie属性
Set-Cookie: sessionId=abc123; SameSite=Strict; HttpOnly

// 3. 验证Referer头部
if (req.headers.referer && !req.headers.referer.startsWith('https://yourdomain.com')) {
    throw new Error('Invalid request origin');
}

SQL注入防护

// 易受攻击的代码
const query = `SELECT * FROM users WHERE username = '${username}' AND password = '${password}'`;

// 防护措施
// 1. 使用参数化查询
const query = 'SELECT * FROM users WHERE username = ? AND password = ?';
db.execute(query, [username, password]);

// 2. 使用ORM框架
const user = await User.findOne({
    where: {
        username: username,
        password: password
    }
});

// 3. 输入验证
if (!isValidUsername(username) || !isValidPassword(password)) {
    throw new Error('Invalid input');
}

HTTPS和安全头部

// 安全的HTTP头部配置
const helmet = require('helmet');
app.use(helmet());

// 或手动设置
app.use((req, res, next) => {
    // 防止点击劫持
    res.setHeader('X-Frame-Options', 'SAMEORIGIN');
    
    // 启用XSS保护
    res.setHeader('X-XSS-Protection', '1; mode=block');
    
    // 防止MIME类型嗅探
    res.setHeader('X-Content-Type-Options', 'nosniff');
    
    // HSTS强制HTTPS
    res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
    
    // 内容安全策略
    res.setHeader('Content-Security-Policy', "default-src 'self'");
    
    next();
});