欢迎光临散文网 会员登陆 & 注册

知了堂Java | Java基础面试题(13)

2021-11-24 16:18 作者:汇智知了堂  | 我要投稿

6.什么是 CSRF 攻击,如何避免?

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

如何避免

1、验证 HTTP Referer 字段 

HTTP头中的Referer字段记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请 求来自于同一个网站,而如果黑客要对其实施 CSRF 攻击,他一般只能在他自己的网站构造请求。因此,可以通过验证Referer值来防御CSRF 攻击 

2、使用验证码 

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

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

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

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

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

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

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

知了堂Java | Java基础面试题(13)的评论 (共 条)

分享到微博请遵守国家法律