CSRF(跨站请求伪造)是一种常见的Web安全威胁,攻击者利用用户已认证的会话来执行未经授权的操作。以下是在Linux服务器环境中保护Web接口免受CSRF攻击的详细方案。
// PHP示例 - 生成和验证CSRF令牌
session_start();
function generate_csrf_token() {
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
return $_SESSION['csrf_token'];
}
function validate_csrf_token($token) {
return isset($_SESSION['csrf_token']) &&
hash_equals($_SESSION['csrf_token'], $token);
}
在Apache/Nginx配置中设置:
Set-Cookie: PHPSESSID=value; Path=/; Secure; HttpOnly; SameSite=Strict
或通过PHP代码设置:
session_set_cookie_params([
'lifetime' => 0,
'path' => '/',
'domain' => 'yourdomain.com',
'secure' => true,
'httponly' => true,
'samesite' => 'Strict'
]);
# Nginx配置示例 - 验证Referer
location /api/ {
valid_referers none blocked server_names *.yourdomain.com;
if ($invalid_referer) {
return 403;
}
# 其他配置...
}
对于敏感操作(如密码更改、支付等),要求用户: - 重新输入密码 - 提供二次认证(2FA) - 使用一次性令牌
在Web服务器配置中添加安全头部:
Nginx示例:
add_header X-Frame-Options "DENY";
add_header X-Content-Type-Options "nosniff";
add_header Content-Security-Policy "default-src 'self'";
add_header Referrer-Policy "same-origin";
Apache示例:
Header always set X-Frame-Options "DENY"
Header always set X-Content-Type-Options "nosniff"
Header always set Content-Security-Policy "default-src 'self'"
Header always set Referrer-Policy "same-origin"
对于API端点: - 使用API密钥认证 - 实现OAuth 2.0 - 为每个请求添加自定义头部(如X-Requested-With) - 限制CORS策略
# 限制CORS
location /api/ {
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' 'https://trusted.domain.com';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,Content-Type,Authorization';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}
}
# 在表单模板中
<form method="post">
{% csrf_token %}
...
</form>
# 视图装饰器
from django.views.decorators.csrf import csrf_protect
@csrf_protect
def my_view(request):
# 视图逻辑
const csrf = require('csurf');
const csrfProtection = csrf({ cookie: true });
app.get('/form', csrfProtection, (req, res) => {
res.render('form', { csrfToken: req.csrfToken() });
});
app.post('/process', csrfProtection, (req, res) => {
// 处理表单数据
});
速率限制:防止暴力攻击
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
location /api/ {
limit_req zone=api burst=20 nodelay;
}
WAF集成:使用ModSecurity等Web应用防火墙
定期更新:保持所有软件和框架最新
通过实施这些多层次的安全措施,您可以显著降低Linux服务器上Web接口遭受CSRF攻击的风险。记住,安全是一个持续的过程,需要定期审查和更新防御策略。