安全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;
	}
}
### DVWA 中 CSRF跨站请求伪造攻击)的相关信息 #### CSRF 攻击简介 跨站请求伪造 (CSRF) 是一种网络攻击方式,攻击者可以利用已认证用户的身份,在未经用户同意的情况下发送恶意请求。这种攻击具有很大的隐蔽性和危害性,因为整个过程可能在用户毫不知情的情况下完成[^1]。 #### CSRF 原理流程 为了成功实施一次 CSRF 攻击,需满足几个条件:受害者必须处于登录状态并持有有效会话;目标站点未部署有效的 CSRF 防护机制。一旦这些条件达成,只要受害者触发了由攻击者预设的动作——可能是点击某个链接或是加载特定网页内容,那么攻击便得以实现[^2]。 #### 实际案例分析-DVWA 平台上的 CSRF 模拟练习 以 DVWA (Damn Vulnerable Web Application)为例,这是一个用于测试和学习的安全漏洞平台。在这个平台上可以通过不同级别的难度设置来模拟真实的 CSRF 场景: - **Low Level**: 用户可以直接通过构造 URL 来更改其他用户的密码而无需任何额外验证。 ```http GET /dvwa/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change HTTP/1.1 Host: 192.168.0.181 ``` - **Medium Level**: 此级增加了简单的 token 校验,但是这个 token 不是动态变化的,因此仍然容易受到攻击。 ```html <!-- HTML Form with static hidden input field --> <form action="http://192.168.0.181/dvwa/vulnerabilities/csrf/" method="POST"> <input type="hidden" name="user_token" value="static_value"/> New Password:<br> <input type="text" name="password_new"/><br> Confirm new password:<br> <input type="text" name="password_conf"/><br><br> <input type="submit" value="Change"/> </form> ``` - **High Level & Impossible Levels**: 这两个等级引入了更复杂的防护措施,如每次提交都会更新的一次性使用的随机 token 和严格的 Referer 头部检查等,使得攻击变得极其困难甚至不可能实现[^3]。 #### 解决方案与防御策略 针对 CSRF 的常见防范手段包括但不限于以下几个方面: - **使用 Anti-CSRF Tokens**:为每一个表单添加唯一且不可预测的令牌,并确保服务器端能够正确检验此令牌的有效性; - **检查 Referer Header**:确认请求确实来自预期的应用程序源地址; - **采用 POST 方法代替 GET**:虽然这并不能彻底解决问题,但在一定程度上提高了攻击门槛; - **增加 CAPTCHA 或二次确认步骤**:对于涉及重要数据变更的操作,要求用户提供进一步的人机交互证明[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值