Web 安全是互联网中不可或缺的一个领域,这个领域中诞生了大量的黑帽子与白帽子,他们都是安全领域的王者,在平时里,他们利用各类巧妙的技术互相博弈,时不时就会掀起一场 Web 安全浪潮,真可谓神仙打架,各显神通。php
本文从一个吃瓜群众的角度,聊一聊 Web 安全的一些有趣故事。css
在互联网发展之初,IE 浏览器垄断的时期,你们上网的目的都很单纯,主要经过浏览器分享信息,获取新闻。但随着互联网的不断发展发展,一个网页能作的事情愈来愈多,除了看新闻,咱们还能够看视频、玩游戏、购物、聊天等,这些功能都大大丰富了咱们的生活。前端
随着网页功能的逐渐增多,就开始出现了一些黑帽子,他们试图经过一些技术手段来牟取利益。在我小的时候,印象最深的就是木马病毒,它能够监控你的键盘,将你在键盘上敲打的内容发送到黑客的机器上,黑客经过分析这些内容,很容易就能获得你的游戏帐号和密码。web
在这以后,就诞生出了一些杀毒软件,致力于解决网络上的各类病毒,随着不断地发展,杀毒软件已经成为一台电脑必不可少的软件。正则表达式
为何会出现这样的安全问题?安全归根究竟是信任的问题,若是全部人都按照正常的流程去上网,不去谋取私利,也就没有安全问题可谈了。算法
安全的根本在于信任,但要让全部人互相信任谈何容易。在当前阶段,咱们能够作到:持续作好安全防御,让漏洞愈来愈少,非法攻击愈来愈困难,这样就能逐渐减小黑帽子的数量,让病毒制造者愈来愈少。sql
要作好安全,首先得理解安全问题的属性,前人经过无数实践,最后将安全的属性总结为安全三要素,分别为:机密性、完整性、可用性。shell
机密性数据库
完整性后端
可用性
有了安全 3 要素以后,咱们就能够对安全问题进行评估了。
资产等级划分
威胁分析
风险分析
确认解决方案
作好安全评估以后,咱们就有了一份安全解决方案,后续的安全工做只需按照这个方案去作,就没有任何问题。
有了安全解决方案以后,咱们还能够制定一些安全原则,遵照原则作事,可让咱们事半功倍。
黑名单、白名单原则
最小权限原则
~
文件夹下的目录,若是有人想删库跑路,在执行 rm -rf /
时,就会提示无权限。纵深防护原则
木桶理论
,安全水平每每取决于最短的那块板。数据与代码分离原则
不可预测性原则
有了这些安全原则,咱们就能够开干了,接下来介绍几个常见的攻防案例。
安全攻防的案例很是多,这里主要介绍几个出镜率比较高的安全问题。
XSS 攻击的本质是将用户数据当成了 HTML 代码一部分来执行,从而混淆本来的语义,产生新的语义。
如图所示,咱们注册了一个 <script>alert(document.cookie)</script>
的用户名,全部能看到此用户名字的页面,都会弹出当前浏览器的 Cookie,若是代码的逻辑是将 Cookie 发送到攻击者的网站,攻击者就能冒充当前用户进行登陆了。
XSS 攻击方式有不少,全部和用户交互的地方,都有可能存在 XSS 攻击。
例如:
因为页面中与用户交互的地方很是多,确定还有一些 XSS 的攻击方式没有被发现,而一旦被黑帽子发现,就可能形成严重的影响,因此咱们务必引发重视。
被 XSS 攻击成功后,攻击者就能够获取大量的用户信息,例如:
识别用户浏览过的网站。
获取用户真实的 IP。
盗取 Cookie
XSS 钓鱼。
目前来讲,XSS 已经获得了互联网行业的重视,许多开发框架都内置了安全的 HTML 渲染方法。
咱们也能够自定义进行一些安全配置。
CSRF(Cross-site request forgery)跨站请求伪造,是一种利用用户身份,执行一些用户非本意的操做。
如图所示:
试想一下,若是 C 冒充 A 进行了一次转帐,一定会形成大量的经济损失。
防护 CSRF 主要有如下几种方式:
验证码
Referer 检查
Token
点击劫持是一种视觉欺骗的攻击手段。攻击者将须要攻击的网站经过 iframe 嵌套的方式嵌入本身的网页中,并将 iframe 设置为透明,在页面中透出一个按钮诱导用户点击。
就像一张图片上面铺了一层透明的纸同样,你看到的是攻击者的页面,可是其实这个页面只是在底部,而你真正点击的是被攻击者透明化的另外一个网页。
若是所示,当你点击了页面上的按钮以后,本觉得会...... ,而真正执行的操做是关注了某人的博客。
因为点击劫持主要经过 iframe,因此在防护时,主要基于 iframe 去作。
方案一:frame busting
if (self !== top) { // 跳回原页面 top.location = self.location;}
方案二:使用 HTTP 中的 x-frame-options 头,控制 iframe 的加载,它有 3 个值可选:
配置 iframe 的 sandbox 属性
服务器端的攻击的方式也很是多,这里列举几个常见的。
SQL 注入和 XSS 同样,都是违背了数据和代码分离原则致使的攻击方式。
如图所示,咱们利用 SQL 注入,就能在不须要密码的状况下,直接登陆管理员的帐号。
攻击的前提是:后端只用了简单的拼接 SQL 的方式去查询数据。
# 拼接出来的 sql 以下:select * from user where username = 'admin' or 1=1 and password = 'xxx'# 不管密码输入什么,这条 sql 语句都能查询到管理员的信息
除此以外,SQL 注入还有如下几种方式:
使用 SQL 探测,猜数据库表名,列名。
select database as current if current[0]==='a',benchmark(10000,'猜对了')
若是代表猜对了,就延迟 10 s 并返回成功。使用存储过程执行系统命令
字符串截断
防止 SQL 注入的最好的办法就是,不要手动拼接 SQL 语句。
最佳方案,使用预编译语句绑定变量
在注入攻击中,换行符注入也是很是常见的一种攻击方式。
上传文件是网页开发中的一个常见功能,若是不加处理,很容易就会形成攻击。
如图所示,攻击者上传了一个木马文件,而且经过返回的 URL 进行访问,就能控制服务器。
一般咱们会控制上传文件的后缀名,但也不能彻底解决问题,攻击者还能够经过如下方式进行攻击:
伪造正常文件
Apache 解析方式是从后往前解析,直到找到一个认识的后缀名为止
abc.php.rar.rar.rar
能绕事后缀名检查,但在执行时,被当成一个 php 文件进行执行。IIS 会截断分号进行解析
abc.asp;xx.png
能绕事后缀名检查,但在执行时,被当成一个 asp 文件进行执行。HTTP PUT 方法容许将文件上传到指定位置
PHP CGI 路径问题
http://abc.com/test.png/xxx.php
时,会把 test.png 当作 php 文件去解析。防护文件上传漏洞,能够从如下几点考虑:
判断文件类型
使用随机数改写文件名和文件路径
单独设置文件服务器的域名
登陆认证攻击能够理解为一种破解登陆的方法。攻击者一般采用如下几种方式进行破解:
彩虹表
Session Fixation 攻击
Session 保持攻击
多因素认证
除此以外,前端登陆认证还有多种方式,若是你对此感兴趣,能够参考我以前写的 前端登陆,这一篇就够了。
应用层拒绝服务攻击,又叫 DDOS 攻击,它指的是利用大量的请求形成资源过载,致使服务器不可用。
一般有如下几种 DDOS 攻击方式:
SYN Flood 洪水攻击
Slowloris 攻击
HTTP POST DOS
CC 攻击
Server Limit DOS
ReDOS
对于应用层拒绝服务攻击,目前也没有特别完美的解决方案,不过咱们仍是能够进行一些优化。
应用代码作好性能优化
网络架构上作好优化
限制请求频率
其实,处理 DDOS 核心思路就是禁用不可信任的用户,确保资源都是被正常的用户所使用。
咱们在部署 web 应用的时候,常常会用到 Nginx、Apache、IIS、Tomcat、Jboss 等 Web 服务器,这些服务器自己也存在一些安全隐患,若是配置不当,很容易收到攻击。
在配置 Web 服务器时,能够参考如下几点:
以用户权限运行 Web 服务器
删除可视化后台
及时更新版本
本文介绍了 Web 安全的基本概念,以及大量的攻防技巧,其实这只是 Web 安全中的冰山一角,若是你对此感兴趣,不妨在安全领域继续深耕学习,必定能看到更广阔一片天。
对于一个开发者来讲,咱们应该在写代码时就将安全考虑其中,造成本身的一套安全开发体系,作到心中有安全,时时考虑安全,就能无形之中化解不法分子的攻击。
最后,若是你对此有任何想法,欢迎留言评论!