以前就了解过这方面的知识,可是没有系统地总结。今天在这总结一下,也让本身在接下来的面试有个清晰的概念。html
XSS跨站脚本攻击:java
xss 跨站脚本攻击(Cross Site Scripting),为了避免和层叠样式表(Cascading Style Sheets,CSS)缩写混淆,因此将跨站脚本攻击缩写为xss。Xss是攻击者在web页面插入恶意的代码。当用户浏览该页面的时候,代码执行,从而实现攻击目的。对受害用户可能采起Cookie资料窃取、会话劫持、钓鱼欺骗等各类攻击。node
XSS跨站脚本攻击分为:git
- 反射型XSS
反射性XSS,也就是非持久性XSS。用户点击攻击连接,服务器解析后响应,在返回的响应内容中出现攻击者的XSS代码,被浏览器执行。一来一去,XSS攻击脚本被web server反射回来给浏览器执行,因此称为反射型XSS。
下面举例子说明:github
http://xxx.com?username=yang
//页面输出
hello yang
//若是我把上面的url变成这样,同时服务器没有作过滤
http://xxx.com?username=<script>alert("xss")</script>
//页面会出现弹框,显示xss;
你也许会说,这样的URL一看就有问题,怎么会有人点击?,是的,这类的URL会让人怀疑,但若是使用短网址服务将之缩短,你还看得出来么?golang
- 持久型XSS
指经过提交恶意数据到服务器的数据库。应用程序从数据库中查询数据,在页面中显示出来,攻击者在相关页面输入恶意的脚本数据后,用户浏览此类页面时就可能受到攻击。这个流程简单能够描述为:恶意用户的Html输入Web程序->进入数据库->Web程序->用户浏览器。
说一个很常见的微博评论:若是不作过滤的话,很容易形成持久性xss攻击,当用户访问已经被插入恶意代码的页面,很容易被攻击。web
- DOM-based XSS
基于DOM的XSS,也就是web server不参与,仅仅涉及到浏览器的XSS。好比根据用户的输入来动态构造一个DOM节点,若是没有对用户的输入进行过滤,那么也就致使XSS攻击的产生。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="#">
<label>please input your name:</label>
<input type="text" id="username">
<input id="sbm" type="submit" value="submit">
</form>
<div id="container">
</div>
<script> function getUserName(){ var btn=document.getElementById("sbm"); btn.addEventListener("click",function(e){ e.preventDefault(); document.getElementById("container").innerHTML=document.getElementById("username").value; },false) } getUserName(); </script>
</body>
</html>
若是我在输入框中输入<img src="1" onerror="alert('xss')">
会出现什么状况
这时候很容易被攻击了。面试
xss的防护
如今的XSS如此流行,缘由何在。我想你们应该都知道,就是在输入的时候没有作严格的过滤,而在输出的时候,也没有进行检查,转义,替换等。chrome
下面说几点防护的方法:
原则:不相信客户输入的数据
注意: 攻击代码不必定在<script></script>中
1.使用XSS Filter。
输入过滤,对用户提交的数据进行有效性验证,仅接受指定长度范围内并符合咱们指望格式的的内容提交,阻止或者忽略除此外的其余任何数据。好比:电话号码必须是数字和中划线组成,并且要设定长度上限。过滤一些些常见的敏感字符,例如:< > ‘ “ & # \ javascript expression "οnclick=" "onfocus";过滤或移除特殊的Html标签, 例如: <script>, <iframe> , < for <, > for >, " for;过滤JavaScript 事件的标签,例如 "οnclick=", "onfocus" 等等。
输出编码,当须要将一个字符串输出到Web网页时,同时又不肯定这个字符串中是否包括XSS特殊字符(如< > &‘”等),为了确保输出内容的完整性和正确性,可使用编码(HTMLEncode)进行处理。
2.DOM型的XSS攻击防护
把变量输出到页面时要作好相关的编码转义工做,如要输出到 <script>中,能够进行JS编码;要输出到HTML内容或属性,则进行HTML编码处理。根据不一样的语境采用不一样的编码处理方式。
3.HttpOnly Cookie
将重要的cookie标记为http only, 这样的话当浏览器向Web服务器发起请求的时就会带上cookie字段,可是在脚本中却不能访问这个cookie,这样就避免了XSS攻击利用JavaScript的document.cookie获取cookie:
CSRF跨站请求伪造攻击
CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。危害是攻击者能够盗用你的身份,以你的名义发送恶意请求。好比能够盗取你的帐号,以你的身份发送邮件,购买商品等。
下面是借用别人的一张原理图:来自:http://www.nodeclass.com/articles/27062
从上图能够看出,要完成一次CSRF攻击,受害者必须依次完成两个步骤 :
1.登陆受信任网站A,并在本地生成Cookie 。
2.在不退出A的状况下,访问危险网站B。
下面用具体的代码说明:
//若是一个博客删除文章是使用的是get方法,如
http://xxx.com?delete=2016063022222
//那么网站serverB只要伪造一个get请求就能够实现上面的目的
<img src="http://xxx.com?delete=2016063022222">
//若是是post方法的话,也能够用javascript实现。
<form action="http://xxx.com" method="POST">
<input type="text" name="delete" value="2016063022222" />
</form>
<script> document.forms[0].submit(); </script>
//但这里强调一点:如今游览器(chrome,firfox)为了安全考虑,默认都作了必定的限制,form标签发送到其余网站的请求会被拦截,你们有兴趣模拟这种状况时须要注意这个问题。
既然CSRF攻击危害那么严重,咱们如何去防范呢?下面总结几种防范的知识点;服务端的预防CSRF攻击的方式方法有多种,但思想上都是差很少的,主要从如下2个方面入手:一、正确使用GET,POST和Cookie;二、在非GET请求中增长伪随机数。
1.对于关键操做咱们应该采用post方法。
2.CSRF在攻击的时候每每是在用户不情的状况下提交的,咱们可使用验证码来强制跟用户交互,可是太多强制性的操做对用户来讲体验感很差,因此要权衡利弊。
3.在重要的请求中添加Token,目前主流的作法是使用Token抵御CSRF攻击。CSRF攻击成功的条件在于攻击者可以预测全部的参数从而构造出合法的请求,因此咱们能够加大这个预测的难度,加入一些黑客不能伪造的信息。咱们在提交表单时,保持原有参数不变,另外添加一个参数Token,该值能够是随机而且加密的,当提交表单时,客户端也同时提交这个token,而后由服务端验证,验证经过才是有效的请求。可是因为用户的Cookie很容易因为网站的XSS漏洞而被盗取,因此这个方案必需要在没有XSS的状况下才安全。
4.检测Referer.所谓Referer,就是在一个网络请求头中的键值对,标示着目前的请求是从哪一个页面过来的。服务器经过检查Referer的值,若是判断出Referer并不是本站页面,而是一个外部站点的页面,那么咱们就能够判断出这个请求是非法的。与此同时,咱们也就检测到了一次csrf攻击。可是,服务器有时候并不能接收Referer值,因此单纯地只经过Referer来防护是不太合理的,它所以常常用于csrf的检测。
参考资料连接:
http://www.cnblogs.com/wqhwe/p/5416976.html
https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/09.3.md
http://www.nodeclass.com/articles/27062
https://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/
https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/09.1.md