一文读懂 Web 安全(面试必备)

622次阅读  |  发布于4年以前

Web 安全是互联网中不可或缺的一个领域,这个领域中诞生了大量的黑帽子与白帽子,他们都是安全领域的王者,在平时里,他们利用各种巧妙的技术互相博弈,时不时就会掀起一场 Web 安全浪潮,真可谓神仙打架,各显神通。

本文从一个吃瓜群众的角度,聊一聊 Web 安全的一些有趣故事。

安全世界观

在互联网发展之初,IE 浏览器垄断的时期,大家上网的目的都很单纯,主要通过浏览器分享信息,获取新闻。但随着互联网的不断发展发展,一个网页能做的事情越来越多,除了看新闻,我们还可以看视频、玩游戏、购物、聊天等,这些功能都大大丰富了我们的生活。

随着网页功能的逐渐增多,就开始出现了一些黑帽子,他们试图通过一些技术手段来牟取利益。在我小的时候,印象最深的就是木马病毒,它可以监控你的键盘,将你在键盘上敲打的内容发送到黑客的机器上,黑客通过分析这些内容,很容易就能得到你的游戏账号和密码。

在这之后,就诞生出了一些杀毒软件,致力于解决网络上的各种病毒,随着不断地发展,杀毒软件已经成为一台电脑必不可少的软件。

为什么会出现这样的安全问题?

安全归根到底是信任的问题,如果所有人都按照正常的流程去上网,不去谋取私利,也就没有安全问题可谈了。

安全的根本在于信任,但要让所有人互相信任谈何容易。在当前阶段,我们可以做到:持续做好安全防护,让漏洞越来越少,非法攻击越来越困难,这样就能逐渐减少黑帽子的数量,让病毒制造者越来越少。

如何做好安全

要做好安全,首先得理解安全问题的属性,前人通过无数实践,最后将安全的属性总结为安全三要素,分别为:机密性、完整性、可用性。

有了安全 3 要素之后,我们就可以对安全问题进行评估了。

做好安全评估之后,我们就有了一份安全解决方案,后续的安全工作只需按照这个方案去做,就没有任何问题。

安全的原则

有了安全解决方案之后,我们还可以制定一些安全原则,遵守原则做事,可以让我们事半功倍。

有了这些安全原则,我们就可以开干了,接下来介绍几个常见的攻防案例。

安全攻防案例

安全攻防的案例非常多,这里主要介绍几个出镜率比较高的安全问题。

客户端攻击

XSS 攻击

XSS 攻击的本质是将用户数据当成了 HTML 代码一部分来执行,从而混淆原本的语义,产生新的语义。

如图所示,我们注册了一个 <script>alert(document.cookie)</script> 的用户名,所有能看到此用户名字的页面,都会弹出当前浏览器的 Cookie,如果代码的逻辑是将 Cookie 发送到攻击者的网站,攻击者就能冒充当前用户进行登录了。

XSS 攻击方式有很多,所有和用户交互的地方,都有可能存在 XSS 攻击。

例如:

由于页面中与用户交互的地方非常多,肯定还有一些 XSS 的攻击方式没有被发现,而一旦被黑帽子发现,就可能造成严重的影响,所以我们务必引起重视。

XSS 攻击影响

被 XSS 攻击成功后,攻击者就可以获取大量的用户信息,例如:

XSS 攻击防御

目前来说,XSS 已经得到了互联网行业的重视,许多开发框架都内置了安全的 HTML 渲染方法。

我们也可以自定义进行一些安全配置。

CSRF 攻击

CSRF(Cross-site request forgery)跨站请求伪造,是一种利用用户身份,执行一些用户非本意的操作。

如图所示:

  1. 用户先登录了服务器 B,然后去访问服务器 C。
  2. 服务器 C 通过恶意脚本,冒充 A 去调用服务器 B 上的某个功能,
  3. 对于服务器 B 来说,还以为这是 A 发起的请求,就当作正常请求处理了。

试想一下,如果 C 冒充 A 进行了一次转账,必定会造成大量的经济损失。

CSRF 防御方式

防御 CSRF 主要有以下几种方式:

点击劫持

点击劫持是一种视觉欺骗的攻击手段。攻击者将需要攻击的网站通过 iframe 嵌套的方式嵌入自己的网页中,并将 iframe 设置为透明,在页面中透出一个按钮诱导用户点击。

就像一张图片上面铺了一层透明的纸一样,你看到的是攻击者的页面,但是其实这个页面只是在底部,而你真正点击的是被攻击者透明化的另一个网页。

如果所示,当你点击了页面上的按钮之后,本以为会...... ,而真正执行的操作是关注了某人的博客。

点击劫持防御

由于点击劫持主要通过 iframe,所以在防御时,主要基于 iframe 去做。

服务器端攻击

服务器端的攻击的方式也非常多,这里列举几个常见的。

SQL 注入攻击

SQL 注入和 XSS 一样,都是违背了数据和代码分离原则导致的攻击方式。

如图所示,我们利用 SQL 注入,就能在不需要密码的情况下,直接登录管理员的账号。

攻击的前提是:后端只用了简单的拼接 SQL 的方式去查询数据。

# 拼接出来的 sql 如下:
select * from user where username = 'admin' or 1=1 and password = 'xxx'
# 无论密码输入什么,这条 sql 语句都能查询到管理员的信息

除此之外,SQL 注入还有以下几种方式:

SQL 注入防御

防止 SQL 注入的最好的办法就是,不要手动拼接 SQL 语句。

CRLF 注入

在注入攻击中,换行符注入也是非常常见的一种攻击方式。

文件上传漏洞

上传文件是网页开发中的一个常见功能,如果不加处理,很容易就会造成攻击。

如图所示,攻击者上传了一个木马文件,并且通过返回的 URL 进行访问,就能控制服务器。

通常我们会控制上传文件的后缀名,但也不能完全解决问题,攻击者还可以通过以下方式进行攻击:

文件上传漏洞防御

防御文件上传漏洞,可以从以下几点考虑:

登录认证攻击

登录认证攻击可以理解为一种破解登录的方法。攻击者通常采用以下几种方式进行破解:

登录认证防御方式

除此之外,前端登录认证还有多种方式,如果你对此感兴趣,可以参考我之前写的《前端登录,这一篇就够了》。

应用层拒绝服务攻击

应用层拒绝服务攻击,又叫 DDOS 攻击,它指的是利用大量的请求造成资源过载,导致服务器不可用。

通常有以下几种 DDOS 攻击方式:

应用层拒绝服务攻击防御

对于应用层拒绝服务攻击,目前也没有特别完美的解决方案,不过我们还是可以进行一些优化。

其实,处理 DDOS 核心思路就是禁用不可信任的用户,确保资源都是被正常的用户所使用。

WebServer 配置安全

我们在部署 web 应用的时候,经常会用到 Nginx、Apache、IIS、Tomcat、Jboss 等 Web 服务器,这些服务器本身也存在一些安全隐患,如果配置不当,很容易收到攻击。

在配置 Web 服务器时,可以参考以下几点:

总结与思考

本文介绍了 Web 安全的基本概念,以及大量的攻防技巧,其实这只是 Web 安全中的冰山一角,如果你对此感兴趣,不妨在安全领域继续深耕学习,一定能看到更广阔一片天。

对于一个开发者来说,我们应该在写代码时就将安全考虑其中,形成自己的一套安全开发体系,做到心中有安全,时时考虑安全,就能无形之中化解不法分子的攻击。

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8