Debian Apache日志中CSRF攻击的防范方法
mod_csrf是针对Apache设计的开源模块,通过生成/验证CSRF令牌机制防范攻击。其工作原理为:服务器处理表单时自动添加隐藏令牌字段,记录令牌值;表单提交时校验令牌是否匹配,不匹配则拒绝请求。部署步骤如下:
apt install libapache2-mod-csrf);a2enmod csrf;/etc/apache2/sites-available/000-default.conf)中添加CsrfProtectUri指令指定需保护的URI(如CsrfProtectUri "/admin/*"),设置令牌存储的Cookie名称(CsrfCookieName)和路径(CsrfCookiePath);systemctl restart apache2。CSRF Token是防御CSRF的最可靠方法,原理是令牌无法被攻击者伪造(仅服务器和合法用户持有)。具体实现:
random_bytes()等函数生成随机Token(如32位),存入$_SESSION(PHP示例),并通过隐藏字段嵌入表单(<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">);$_SESSION中的值,不一致则拒绝请求(如if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) die('CSRF detected');)。通过检查HTTP请求的Referer头部,确认请求来源为合法域名。配置Apache的mod_rewrite模块,在配置文件中添加规则:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain\.com [NC] # 替换为你的域名
RewriteRule \.(php|pl|py|jsp|asp|htm|html|css|js)$ - [F,L] # 拒绝非法Referer的请求
</IfModule>
注意:Referer可能被用户禁用或中间设备修改,需与其他方法结合使用。
通过SameSite属性控制Cookie在跨站请求中的发送,降低CSRF风险。配置Apache的mod_headers模块,在配置文件中添加:
<IfModule mod_headers.c>
Header edit Set-Cookie ^(.*)$ $1;SameSite=Strict;Secure; # Strict模式禁止跨站发送Cookie,Secure要求HTTPS
</IfModule>
SameSite=Strict:完全禁止跨站发送Cookie(适用于敏感操作);SameSite=Lax:允许GET请求跨站发送Cookie(适用于普通浏览,平衡安全性与用户体验);Secure:确保Cookie仅通过HTTPS传输,防止中间人攻击。验证码强制用户与服务器交互,确保请求来自真实用户,有效遏制CSRF。常见场景:
iptables或ufw限制入站连接,仅允许必要端口(如80、443)访问,阻断非法请求;/var/log/apache2/access.log),识别异常请求(如频繁的POST请求、陌生Referer),及时响应。