2016年9月23日星期五

csrf(跨站请求伪造)流程

1。用户正常登录了正规网站A。产生了cookie。
2。用户没退出的情况时,访问了网站B。B的页面里面,有网站A的连接,比如http://www.a.com/xxx,比如<img src="http://www.a.com/xxx/yyy"/>
3。用户往往B的他页面时,会去访问A,访问A时也会带上A的cookie,由于cookie是正常的,A会认为是一个合法的请求,进而进行处理。自然B网站也可以搞自动post等背后动作,只要cookie有效。

对于这样的情况,网站A的可以检查http_Referer来判断,但是referer也是可以伪造的,不保险。
所以有效的还是在form里面,埋入token。

spring security里面的csrf对策,就是埋入token,来检测请求的有效性。但是,一旦启用了csrf,就必须用到session。有没有不用session的csrf的检测方法呢?
【仔细看了文档,spring也可以将csrf写入cookie里,来做到stateless,CookieCsrfTokenRepository】


考虑到的方法有,写cookie,cookie里面埋入token,并且form里面也埋入hash过的token。服务器端来比较两个token是否一样。这里用到的原理是,第三方网站(比如上面的B)没法获取A的cookie【也是理论上的】,所以B的页面的form里面,也就没法埋入A的cookie了。

 http://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html
的文档里面,描述了为啥没用CookieCsrf作为默认而用Session作为默认的原因。如果要用session,那么普通的rest也就是有状态了,所有的请求都需要提交csrf字段。
 
https://www.blogger.com/blogger.g?blogID=8899947124180453470#editor/target=post;postID=327728104436759904

如果cookie泄漏了怎么办?XSS(跨站脚本攻击)手法是可以偷cookie的。
 怎么偷,首先,网站得是一个可以运行人发言的网站,比如论坛。A在发言代码里面嵌入javascript,如果网站没有做处理,照本显示,那么B浏览网站时就会执行A嵌入的代码。由于是网站页面自身的script,script就可以拿到B的cookie了,自然也可写script将偷来的cookie发给A。
spring security里面对xss,没有特别的招,就是3个encoding。
1。ouput文字的时候,html encoding
2。 ouput javascript的时候,javascript encoding
3。事件绑定时,handler encoding。

没有评论:

发表评论