安全面试题:什么是 CSRF 攻击,如何避免?

CSRF(Cross-Site Request Forgery)攻击,也称为跨站请求伪造攻击,是一种利用受信任用户的身份进行恶意操作的攻击方式。攻击者通过伪造请求,诱使受害者在已登录的状态下执行恶意操作,从而导致安全漏洞。

什么是 CSRF 攻击?

CSRF(Cross-Site Request Forgery)攻击,也称为跨站请求伪造攻击,是一种利用受信任用户的身份进行恶意操作的攻击方式。攻击者通过伪造请求,诱使受害者在已登录的状态下执行恶意操作,从而导致安全漏洞。

CSRF 也被称为 one-click attack(单键攻击)或者 session riding(连线控制)。一般来说,攻击者通过伪造用户的浏览器的请求,向用户曾经认证访问过的网站发送请求,使目标网站(服务器)接收并误以为是用户的真实操作而去执行命令。常用于盗取账号、转账、发送虚假消息等。攻击者利用网站对请求的验证漏洞而实现这样的攻击行为,网站能够确认请求来源于用户的浏览器,却不能验证请求是否源于用户的真实意愿下的操作行为。

CSRF 攻击过程

(1)受害者登录一个受信任网站,并在其会话中获得一个有效的令牌(例如,通过 Cookie 存放 token)。

(2)攻击者通过各种方式(例如,通过电子邮件、社交媒体等)诱使受害者访问一个恶意网站。

(3)恶意网站中的代码会自动发送一个请求到受信任网站,其中包含了受害者的身份验证令牌,即在(1)中存放在 Cookie 中的 token。

(4)受信任网站接收到请求后,会根据令牌进行身份验证,并执行请求中的操作,因为请求是在受信任用户的身份下发起的,所以攻击成功。

如何避免 CSRF 攻击?

验证 HTTP Referer 字段

HTTP 协议头中的 Referer 字段记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站,而如果黑客要对其实施 CSRF

攻击,他一般只能在他自己的网站构造请求。因此,可以通过验证 Referer 值来防御 CSRF 攻击。

使用验证码

关键操作页面加上验证码,后台收到请求后通过判断验证码可以防御 CSRF。注意,这种方法对用户不太友好。

在请求地址中添加 token 并验证

CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证。要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。这种方法要比检查 Referer 要安全一些,token 可以在用户登陆后产生并放于session之中,然后在每次请求时把token 从 session 中拿出,与请求中的 token 进行比对,但这种方法的难点在于如何把 token 以参数的形式加入请求。

对于 GET 请求,token 将附在请求地址之后,这样 URL 就变成 http://url?csrftoken=tokenvalue

而对于 POST 请求来说,要在 form 的最后加上 <input type="hidden" name="csrftoken" value="tokenvalue"/>,这样就把 token 以参数的形式加入请求了。

在 HTTP 头中自定义属性并验证

这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。

限制敏感操作的访问权限

对于一些敏感操作(例如修改密码、删除账户等),可以要求用户再次进行身份验证,例如要求输入密码或使用双因素身份验证。

看书和学习是思想的经常营养,是思想的无穷发展。 —— 冈察洛夫
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号