一分钟了解【CSRF攻击与防御】

编程

实例

用户首先登录B网站,然后打开A网站(恶意网站),A通过Script标签加载了一个B网站的URL,由于用户登录了B网站,该URL刚好是一个写数据的接口,就会造成数据损失。

<script type="text/javascript" src="https://www.test.com/api/update"></script>

防御方式

根据上面的实例,A是攻击网站,B是被攻击网站。这种攻击的特殊之处就在于,用户侧很难感知到自己被“绑架”做了一个“可怕”的操作。这就是为什么我们不能随便打开一个陌生的网站。

我们从B网站的角度来分析,如何避免CSRF攻击。由于请求是从A网站发起的,所以服务端只要能识别请求是来自B网站自身,就能阻止这样的攻击。

最简单的办法,我们可以校验请求的来源,也就是Referer,来判断请求是否来自B网站。不过这种方式并不可靠,因为Referer是浏览器传递的,不能保证绝对的可靠性。

if (strpos($_SERVER["HTTP_REFERER"], "www.test.com") === false) {

// CSRF攻击

return;

}

另外一种办法是B网站在请求服务端时让用户输入密码,服务端先对密码进行校验。A网站不知道密码,自然也就束手无策了。这种方法,可以很好地防御CSRF攻击。

$.post(url, {

password:"输入密码"

});

有些网站采用的是用户在登录B网站后生成一个秘钥存储到cookie中,或者是在需要的时候调用一个接口获取秘钥,请求URL的时候带上这个秘钥。这种方式也是可行的,但是存储到cookie中就有被窃取的风险,使用单独的接口获取秘钥,这个接口本身也有可能被CSRF攻击。所以,我认为最可靠的方式还是校验登录密码,这是用户自身安全级别最高的数据。

以上是 一分钟了解【CSRF攻击与防御】 的全部内容, 来源链接: utcz.com/z/513522.html

回到顶部