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攻击。

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

相关文章
|
4月前
|
JavaScript 安全 前端开发
js开发:请解释什么是XSS攻击和CSRF攻击,并说明如何防范这些攻击。
XSS和CSRF是两种常见的Web安全威胁。XSS攻击通过注入恶意脚本盗取用户信息或控制账户,防范措施包括输入验证、内容编码、HTTPOnly Cookie和CSP。CSRF攻击则诱使用户执行未经授权操作,防范手段有CSRF Tokens、双重验证、Referer检查和SameSite Cookie属性。开发者应采取这些防御措施并定期进行安全审计以增强应用安全性。
89 0
|
10月前
|
安全 NoSQL Java
互联网并发与安全系列教程(06) - 常见的Web安全漏洞(CSRF攻击)
互联网并发与安全系列教程(06) - 常见的Web安全漏洞(CSRF攻击)
101 0
|
11月前
|
SQL 安全 前端开发
渗透攻击实例-邪恶的CSRF(社会工程学)
渗透攻击实例-邪恶的CSRF(社会工程学)
|
4月前
|
缓存 安全 JavaScript
前端安全:Vue应用中防范XSS和CSRF攻击
【4月更文挑战第23天】本文探讨了在Vue应用中防范XSS和CSRF攻击的重要性。XSS攻击通过注入恶意脚本威胁用户数据,而CSRF则利用用户身份发起非授权请求。防范措施包括:对输入内容转义、使用CSP、选择安全的库;采用Anti-CSRF令牌、同源策略和POST请求对抗CSRF;并实施代码审查、更新依赖及教育团队成员。通过这些实践,可提升Vue应用的安全性,抵御潜在攻击。
690 0
|
2月前
|
SQL 安全 数据库
Python Web开发者必学:SQL注入、XSS、CSRF攻击与防御实战演练!
【7月更文挑战第26天】在 Python Web 开发中, 安全性至关重要。本文聚焦 SQL 注入、XSS 和 CSRF 这三大安全威胁,提供实战防御策略。SQL 注入可通过参数化查询和 ORM 框架来防范;XSS 则需 HTML 转义用户输入与实施 CSP;CSRF 防御依赖 CSRF 令牌和双重提交 Cookie。掌握这些技巧,能有效加固 Web 应用的安全防线。安全是持续的过程,需贯穿开发始终。
59 1
Python Web开发者必学:SQL注入、XSS、CSRF攻击与防御实战演练!
|
29天前
|
Web App开发 存储 安全
就一次!带你彻底搞懂CSRF攻击与防御
与XSS攻击相比,利用CSRF漏洞发动攻击会比较困难,这也是在网络上看起来CSRF的人气小于XSS的原因之一。下面我们来利用CSRF漏洞发起攻击,并针对攻击进行防御,彻底弄懂CSRF,话不多说,我们直接开冲。
|
2月前
|
运维 安全 Java
什么是 CSRF?如何防止 CSRF 攻击?
CSRF 攻击是一种常见且危险的 Web 安全漏洞,攻击者可以通过伪造用户请求,执行恶意操作,作为程序员,为了防御 CSRF 攻击,常见的策略包括使用 CSRF Token、检查 Referer 或 Origin 头、设置 SameSite Cookie 属性以及双重提交 Cookie。 因为程序员对于 CSRF 攻击可以做的事情还是很有限,所以,承担主要责任的是安全部门或者运维部门,但是作为程序员,我们需要具备这些安全意识,在安全等级比较高的需求中也需要把这些安全因素考虑在内。
|
3月前
|
前端开发 安全 JavaScript
XSS和CSRF攻击概览
【6月更文挑战第27天】**XSS和CSRF攻击概览** - XSS:利用未验证用户输入的Web应用,注入恶意脚本到浏览器,盗取信息或控制用户账户。防御措施包括输入验证、内容编码、HttpOnly Cookie和CSP。 - CSRF:攻击者诱使用户执行非授权操作,利用现有会话。防御涉及CSRF Tokens、双重验证、Referer检查和SameSite Cookie属性。 应用这些策略可提升Web安全,定期审计和测试同样重要。
41 3
|
2月前
|
前端开发 安全 JavaScript
CSRF 攻击是什么?如何防范?
CSRF 攻击是什么?如何防范?
35 0
|
4月前
|
存储 JavaScript 前端开发
Django的CSRF防攻击原理详解
Django的CSRF防攻击原理详解