xiaof 2019-07-01
昨天晚上偶然看到csrf这个问题,所以就去了解了一下csrf到底是个什么东西。
百度定义:
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装成受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性
一个简单的例子:
某网上商城获取一个订单详情的接口是127.0.0.1/orders/orderId,并且需要认证过后才能访问这个接口 口。小明是这个商城的一个用户,已经通过了认证,并且是通过cookie实现认证的。现在一个黑客也想要访问小 明在商城中某个订单的详情,他该怎么做呢?很简单,只要在某个地方发布一个链接地址是 127.0.0.1/orders/orderId这个接口,诱使小明去点击这个链接发送请求。浏览器就会自动在这个请求上加上 之前认证过的cookie,而服务端是通过这个cookie验证是否本人操作的,这样黑客就在小明完全不知情的情况下 就得到了这个订单的详情。这个接口的操作如果是 购买一个商品,删除邮件的话,后果将非常可怕。
为什么会出现上面这种情况呢?
因为cookie是在向这个网页发送请求时自动携带的,而我昨天困扰的问题就是为什么token会比cookie安全。 原因其实就是token一般存在sessionStorage或localStorage中,而它不能在本站点之外的其他站点获取 到,所以就算你在别处点击了一个包含这个接口的链接也不会导致token泄露。
如何防范csrf攻击?
1.尽量使用POST,限制GET
post相对get来说更安全,但是还是能在链接中嵌套一个表单然后提交
2.设置浏览器cookie策略
禁止在第三方网站上使用cookie
3.加验证码
每次发送重要请求都通过验证码和服务端进行认证,这也非常安全,但是用户体验不好,重要的操作可以这也,但你不能关注一个用户或者发布一个帖子也需要认证一次吧。
4.增加referer请求头检查
referer请求头的值就是请求来源的地方,服务端可以通过判断这个来源去分辨是否时csrf攻击,但是一些黑客还是能通过一些技术很容易的去更改这个请求头的值
5.使用token
这是最普遍的方法,每次发送请求都携带这个token,它与cookie不同的是,token可以是无状态的,即服务端可以不用保存关于token的值,而是每次通过计算验证这个token来判断是否是当前用户。
黑客还有没有其他方法能获取到小明订单的详情?
是可以的。黑客可以在商城一个商品的评价下面写入一个js脚本并且通过图片伪装起来,只要小明查看了这个评价,这个js脚本就会自动加载,黑客就可以通过这个js脚本去获取token值并且发送请求,因为当前js脚本是在本站内执行的,所以是可以访问到token。上面这个攻击方式就是xss,通过在用户访问的页面嵌入js代码使用户或服务端受到攻击。
其实xss就是csrf的一种实现方式,xss的防范比较困难,因为黑客可以通过很多方法在网页中插入js或html代码。可以通过在cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击。而关于xss防范又是另一个话题了.....
可以简单理解为csrf是让用户在不知情的情况,冒用其身份发起了一个请求,而xxs就是通过在网页上插入js或html代码发动攻击
写的比较乱,就是token和cookie这里没有理解透导致这么久才搞懂这个问题。