CSRF 攻击

简介: 本文主要介绍了什么是 CSRF 攻击,以及如何防御 CSRF 攻击

简介

CSRF(Cross Site Request Forgery),跨站域请求伪造,也被称为 XSRF。简单来说,攻击者通过伪装成来自受信任用户的请求来利用受信任的网站。比如通过伪造受信任的网站的 Cookie 来模拟 HTTP 请求,如下图:

在步骤5中,浏览器向A发送了请求,但这个请求并非是由用户主观发起的,而是被网站B诱导产生的,而这个请求中携带了用户的Cookie,所以网站A无法辨别出该请求是个攻击请求。

一、攻击类型

1、Get类型

假设网站 A 修改密码的方式为 Get 请求,在请求时通过携带 Cookie 来验证用户信息,请求地址为:a.com/changePassword?newPassword=123456 ,攻击者获取 A 网站修改密码的链接和参数后,将其伪装

在网站 B 中,并诱导用户点击伪装链接:a.com/changePassword?newPassword=654321 ,若用户不小心点击了这个链接,那么用户的密码就会被改为 654321 。

2、POST类型

还是以修改密码为例,此时 A 网站将请求方式改为了 POST 请求,B 网站在 index 页面中含有以下代码:

<formaction="https://a.com/changePassword"method="post"><inputtype="hidden"name="newPassword"value="654321"><buttontype="submit">提交</button></form><scripttype="text/javascript">$(function(){
$("button")[0].click();
 });
</script>


上述代码当用户访问 B 网站的 index 页面时,就会自动提交更改密码的请求,从而将用户的密码改为 654321 。如果换成扣费请求,并且 A 网站存在这样的漏洞,那么当用户访问这种攻击性网站时就会产生不必要的损失。

二、防御方法

1、验证HTTP请求中的Referer

如上图,无论是 GET 还是 POST 请求,或者其他类型的请求,在 HTTP 的请求标头中我们可以通过获取 HTTP 请求头中的 Referer 字段来进行黑白名单判断。通过匹配来源的域名,如果不在白名单内的,那么网站可以拒绝此类请求。

此处以PHP代码为例:

function checkRefer(){
    $referer= isset($_SERVER["HTTP_REFERER"])?$_SERVER["HTTP_REFERER"]:"";
    $matches=array();
    if(preg_match("@^(?:http://|https://)?([^/]+)@i", $referer,$matches))
    {
        $host=$matches[1];
        preg_match('/[^.]+\.[^.]+$/', $host, $matches);
        $domain=isset($matches[0])?$matches[0]:'';
        $whiteDomain = ["a.com","b.com"];
        if($domain == ''){
            return false;
        }
        foreach ($whiteDomain as $curDomain) {
            if(strpos($domain,$curDomain)!==false){
                return true;
            }
        }
        return false;
    }
    else {
        return false;
    }
}

 

这种方法的弊端是如果攻击者通过伪造 Referer 来发起请求,那么就无法判断其真实性了。

2、添加验证码

对于一些重要业务的请求,可增设图形验证码、短信验证码措施,以防止用户账号被盗用产生不必要的损失。但这种措施,如果对于全站来实施不太可行,会影响用户的体验感。

3、增加 CSRF Token 验证

根据上述的介绍可知 CSRF 攻击主要借助于存储用户验证信息的 Cookie,攻击者通过伪造用户请求,在用户不知道的情况下利用用户的 Cookie 来通过安全验证。因此要想抵御 CSRF 攻击,我们可以在请求中增加一些攻击者不可伪造的信息,并且这个信息不可存储在 Cookie 中。比如可以参数的形式传递一个随机生成的 token 串,当服务器接收到请求后,会验证这个 token,如果请求中缺失或者经过加密解密后这个token不正确,那么可判定为 CSRF 攻击并拒绝该请求。

以 PHP 的 Laravel 框架为例,已经加入了 CSRF Token 的处理,开发者只需要进行简单的配置就可以开启这个功能。

但这个方法的缺点就是难以保证 token 信息的安全,比如攻击者可以通过伪造 Referer 等手段,获取源站的 token 值,从而发起 CSRF攻击。

无论选择哪种方式进行防御,开发者在码代码的同时,除了完成需求功能时,还应该加入安全性相关因素作为考虑点。

相关文章
|
7月前
|
JavaScript 安全 前端开发
js开发:请解释什么是XSS攻击和CSRF攻击,并说明如何防范这些攻击。
XSS和CSRF是两种常见的Web安全威胁。XSS攻击通过注入恶意脚本盗取用户信息或控制账户,防范措施包括输入验证、内容编码、HTTPOnly Cookie和CSP。CSRF攻击则诱使用户执行未经授权操作,防范手段有CSRF Tokens、双重验证、Referer检查和SameSite Cookie属性。开发者应采取这些防御措施并定期进行安全审计以增强应用安全性。
132 0
|
安全 NoSQL Java
互联网并发与安全系列教程(06) - 常见的Web安全漏洞(CSRF攻击)
互联网并发与安全系列教程(06) - 常见的Web安全漏洞(CSRF攻击)
128 0
|
SQL 安全 前端开发
渗透攻击实例-邪恶的CSRF(社会工程学)
渗透攻击实例-邪恶的CSRF(社会工程学)
|
7月前
|
缓存 安全 JavaScript
前端安全:Vue应用中防范XSS和CSRF攻击
【4月更文挑战第23天】本文探讨了在Vue应用中防范XSS和CSRF攻击的重要性。XSS攻击通过注入恶意脚本威胁用户数据,而CSRF则利用用户身份发起非授权请求。防范措施包括:对输入内容转义、使用CSP、选择安全的库;采用Anti-CSRF令牌、同源策略和POST请求对抗CSRF;并实施代码审查、更新依赖及教育团队成员。通过这些实践,可提升Vue应用的安全性,抵御潜在攻击。
1006 0
|
22天前
|
安全 前端开发 JavaScript
什么是 CSRF 攻击?如何启用 CSRF 保护来抵御该攻击?
什么是 CSRF 攻击?如何启用 CSRF 保护来抵御该攻击?
60 5
|
1月前
|
存储 Web App开发 安全
如何防范 CSRF 攻击
CSRF(跨站请求伪造)攻击是一种常见的安全威胁。防范措施包括:使用Anti-CSRF Token、检查HTTP Referer、限制Cookie作用域、采用双重提交Cookie机制等,确保请求的合法性与安全性。
|
1月前
|
网络安全 数据安全/隐私保护
什么是 CSRF 攻击
CSRF(跨站请求伪造)攻击是指攻击者诱导用户点击恶意链接或提交表单,利用用户已登录的身份在目标网站上执行非授权操作,如转账、修改密码等。这种攻击通常通过嵌入恶意代码或链接实现。
|
1月前
|
安全 前端开发 Java
Web安全进阶:XSS与CSRF攻击防御策略深度解析
【10月更文挑战第26天】Web安全是现代软件开发的重要领域,本文深入探讨了XSS和CSRF两种常见攻击的原理及防御策略。针对XSS,介绍了输入验证与转义、使用CSP、WAF、HTTP-only Cookie和代码审查等方法。对于CSRF,提出了启用CSRF保护、设置CSRF Token、使用HTTPS、二次验证和用户教育等措施。通过这些策略,开发者可以构建更安全的Web应用。
93 4
|
1月前
|
安全 Go PHP
Web安全进阶:XSS与CSRF攻击防御策略深度解析
【10月更文挑战第27天】本文深入解析了Web安全中的XSS和CSRF攻击防御策略。针对XSS,介绍了输入验证与净化、内容安全策略(CSP)和HTTP头部安全配置;针对CSRF,提出了使用CSRF令牌、验证HTTP请求头、限制同源策略和双重提交Cookie等方法,帮助开发者有效保护网站和用户数据安全。
74 2
|
1月前
|
存储 安全 Go
Web安全基础:防范XSS与CSRF攻击的方法
【10月更文挑战第25天】Web安全是互联网应用开发中的重要环节。本文通过具体案例分析了跨站脚本攻击(XSS)和跨站请求伪造(CSRF)的原理及防范方法,包括服务器端数据过滤、使用Content Security Policy (CSP)、添加CSRF令牌等措施,帮助开发者构建更安全的Web应用。
97 3