什么是CSRF?
攻击者盗用合法用户的身份,以你的名义向第三方网站发送恶意请求。 CRSF能作的事情包括利用你的身份发邮件、发短信、进行交易转帐等,甚至盗取你的帐号。数据库
所以,站点A会报据用户C的权限来处理恶意站点B所发起的请求,而这个请求可能以用户C的身份发送 邮件、短信、消息,以及进行转帐支付等操做,这样恶意站点B就达到了伪造用户C请求站点 A的目的。
受害者只须要作下面两件事情,攻击者就可以完成CSRF攻击:浏览器
不少状况下所谓的恶意站点,颇有多是一个存在其余漏洞(如XSS)的受信任且被不少人访问的站点,这样,普通用户可能在不知不觉中便成为了受害者安全
CSRF防护服务器
目前防护CSRF攻击有三种策略:cookie
一、尽可能使用POST,限制GET
GET接口太容易被拿来作CSRF攻击,只要构造一个img标签,而img标签又是不能过滤的数据。接口最好限制为POST使用,GET则无效,下降攻击风险。
固然POST并非万无一失,攻击者只要构造一个form就能够,但须要在第三方页面作,这样就增长暴露的可能性。
二、将cookie设置为HttpOnly
CRSF攻击很大程度上是利用了浏览器的cookie,为了防止站内的XSS漏洞盗取cookie,须要在cookie中设置“HttpOnly”属性,这样经过程序(如JavaScript脚本、Applet等)就没法读取到cookie信息,避免了攻击者伪造cookie的状况出现。
在Java的Servlet的API中设置cookie为HttpOnly的代码以下: response.setHeader( "Set-Cookie", "cookiename=cookievalue;HttpOnly");
三、增长token
CSRF攻击之因此可以成功,是由于攻击者能够伪造用户的请求,该请求中全部的用户验证信息都存在于cookie中,所以攻击者能够在不知道用户验证信息的状况下直接利用用户的cookie来经过安全验证。由此可知,抵御CSRF攻击的关键在于:在请求中放入攻击者所不能伪造的信息,而且该信总不存在于cookie之中。鉴于此,系统开发人员能够在HTTP请求中以参数的形式加入一个随机产生的token,并在服务端进行token校验,若是请求中没有token或者token内容不正确,则认为是CSRF攻击而拒绝该请求。
假设请求经过POST方式提交,则能够在相应的表单中增长一个隐藏域: <input type="hidden" name="_toicen" value="tokenvalue"/>
token的值经过服务端生成,表单提交后token的值经过POST请求与参数一同带到服务端,每次会话可使用相同的token,会话过时,则token失效,攻击者因没法获取到token,也就没法伪造请求。
四、经过Referer识别
根据HTTP协议,在HTTP头中有一个字段叫Referer,它记录了该HTTP请求的来源地址。在一般状况下,访问一个安全受限的页面的请求都来自于同一个网站。但这种方法不是万无一失的,referer的值是由浏览器提供的,咱们并不能保证浏览器没有安全漏洞,目前已有一些方法能够篡改referer值,并且有些用户为了保护本身的隐私能够设置浏览器在发送请求时再也不提供referer值。cors
什么是XSS?简单来讲,就是在页面中植入恶意代码。xss
xss一般能够分为两大类:网站
(1)反射型xss。出如今URL中做为参数提交到服务器,服务器解析并响应,响应结果中包含xss代码,最后浏览器解析执行。spa
(2)存储型xss。攻击者输入恶意的脚本数据存入数据库,当其余用户读取时,用户浏览器将解析执行这段脚本。code
防护XSS攻击
坚定不要相信用户的任何输入,并过滤掉输入中的全部特殊字符。这样就能消灭绝大部分的XSS攻击。
解决办法
若是为Cookie中用于用户认证的关键值设置httponly属性,浏览器将会禁止js经过同源策略访问cookie中设有httponly属性的信息,所以以劫持用户认证cookie为目的XSS攻击将会失败。
但很明显,只为cookie中的值设置Httponly是不够的,由于XSS攻击并非只能获取用户COOKIE,它还能够窃取用户浏览器信息,模拟用户身份执行操做等等。
CSRF攻击是攻击者利用用户的身份操做用户账户的一种攻击方式,一般使用Anti CSRF Token来防护CSRF攻击,同时要注意Token的保密性和随机性。 而且CSRF攻击问题通常是由服务端解决