XSS攻击与CSRF攻击比较
XSS:Cross Site Scripting,跨站脚本攻击
原理:
网站webA的授信用户userA,利用网站合法接口输入或提交非法数据,而影响网站其他用户。
比如网站webA有允许用户评论的入口,正常用户发布的评论可能是“我是评论!”,而userA发的评论是“<a href='http://www.xss.com'>点我进入大保健</a>”。
网页显示评论的代码可能是这样的"<p>用户的评论</p>",网页在加载userA的评论时就会是“<p><a href='http://www.xss.com'>点我进入大保健</a></p>”,相当于在评论中插入了一个非法链接,网站其他用户加载评论时都将看到这个非法链接。
除了插入非法链接之外,userA甚至还可以插入script脚本,脚本可做的事情就更多了,修改dom、自动跳转页面、非法提交表单等等。
预防:
要预防跨站脚本攻击其实比较简单,就是不信任任何用户的输入,对用户输入进行过滤转义等。
比如对上面例子中的“<a href='http://www.xss.com'>点我进入大保健</a>”进行转义之后就变成了“<a href='http://www.xss.com'>点我进入大保健</a>”,这样其他用户看到的就不再是一个跳转链接了。
CSRF:Cross Site Request Forgery, 跨站域请求伪造
原理:
通过伪装来自受信任用户的请求来利用受信任的网站。
通俗的说就是攻击者利用了你的身份,发送了恶意请求。就好比黑客盗用了你的qq然后假装是你,骗你朋友要钱。
如上图所示,用户先登录网站A,然后访问恶意站点B,用户在恶意站点B中点击了一个链接,这个链接跳转回A网站的同时发送了一个恶意get请求,类似“http://weba.com/comment?comment=这个评论是webB伪造的”。除了get请求外,webB也可以伪造post请求。
预防:
验证Referer
webB伪造webA的请求时,Referer是webB,webA发现referer非法的时候就可以拒绝这个请求。
token校验
比如用户在访问webA时,会生成一个随机的token,以后每次访问webA时都带上token,服务端校验token是否合法。因为token具有随机性,所以webB就不能用普适的方法来伪造webA的请求。
token有各种实现方式,可以放在请求参数中也可以放在请求头中。