XSS 与 CSRF 跨站攻击

先作个名词解释:php

XSS:跨站脚本(Cross-site scripting)html

CSRF:跨站请求伪造(Cross-site request forgery)web

看了估计也不清楚什么意思吧?数据库

那么,详细解释下:windows

XSS: 其实就是Html的注入问题,攻击者的输入没有通过严格的控制进入了数据库,最终显示给来访的用户,致使能够在来访用户的浏览器里以浏览用户的身份执行Html代码。浏览器

一个例子:某文章的评论区,某个攻击者输入一段js代码做为评论:windows.alert("我是攻击者"); , 这段评论提交以后,服务端没有通过严格校验,就直接入库,下次有用户浏览这个文章时,这段评论会加载并做为html、js被浏览器解释执行,而后,用户就看到了“我是攻击者”的弹窗了。安全

以上是一个无恶意的攻击例子,若是攻击者有恶意的话。。。获取你的cookie,使用cookie登陆你的帐户,转帐。。cookie

 

CSRF:主要利用用户浏览器的cookie来进行的攻击行为。xss

假设有恶意网站X,页面上有这么一段代码:工具

<img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000>

这段代码会尝试从mybank中,往个人帐户转帐1000元。这个行为大部分状况会失败,由于这个转帐接口是须要登陆后的受权信息的。可是,

若是用户先登陆了mybank, 而后不当心(好比在qq收到链接并点击了)打开恶意网站X,那么,这个攻击就生效了。登陆mybank后,会产生mybank的受权cookie, 网站X请求mybank时,浏览器会带上受权cookie,致使被攻击。

 

如何防护

xss相对比较好防护,只要对输入进行过滤便可,如今不少webframework都提供了输入校验和xss过滤工具

csrf就不是那么好防护了。它是请求伪造,服务端要识别出这个是伪造的请求是有难度的,这个大概有几个防范思路

一、提升伪造的难度,好比不要随便经过HTTP GET来提交、操做数据,GET太容易被攻击了。GET方式的url能够轻易被各类途径传播。

二、服务端增长请求令牌, 这个令牌不写入cookie,每次返回给用户的页面带有这个随机生成的令牌,用户提交数据时,这个令牌做为隐藏域也一同提交,只有验证令牌一致,才可提交成功。嗯,增长了破解难度,但也不是没法破解,能够经过获取htm代码的方式获取令牌。

三、使用验证码, 这个方式比较安全了, 复杂的验证码不是那么容易破解的,有时候连人本身都认不出来。因此一样的,这种方式也给了用户很是很差的使用体验,慎重使用。

四、增长referer来源页判断,能够防一些小白(其实不少攻击者都是小白,从这点上看,仍是颇有效的)。