Web 安全已经是 Web 开发中一个重要的组成部分,而许多程序猿往往希望专注于程序的实现,而忽略了信息安全的实质。如果没有严谨地考虑到信息安全问题,等出了乱子之后反而会造成更严重的损失。所以要在开发网络应用时更注重 Web 安全,甚至努力成为一个白帽黑客。
常见 Web 信息安全
一般来说 Web 安全需要符合三点安全要素:
- 保密性:通过加密等方法确保数据的保密性
- 完整性:要求用户取得的资料是完整而不可被篡改的
- 可用性:保证网站服务的持续可访问性
以下是常见的影响 Web 安全的攻击手段:
1. SQL注入
使用恶意的 SQL 语法去影响数据库内容:
// “--” 是 SQL 语句的注释符号
/user/profile?id=1";DROP TABLE user--
SELECT * FROM USER WHERE id = "1"; DROP TABLE user--
用户登录:
// password" AND 1=1--
SELECT * FROM USER WHERE username = "Mark"; AND 1=1-- AND PASSWORD="1234"
简单的防范手段:
不信任用户输入的数据,确保用户输入必须经过检查,目前许多成熟的 Web 框架都支持ORM 服务,大部分都基本防范了 SQL 注入。
2. XSS(Cross-Site Scripting)
XSS 也很容易将恶意代码植入到网页,让看到网页的用户受到干扰,常见的重灾区包括BBS、留言板等。实际上 XSS 的概念很简单,通过表单输入建立一些恶意网址、恶意图片网址或把 JavsScript 代码注入到 HTML中,当用户浏览页面时就会被触发。
<IMG SRC="" onerror="alert('XSS')">
更多关于XSS资料可以参考 XSS Filter Evasion Cheat Sheet(https://www.owasp.org/index.p...)。另外也有中文版(链接是乌云镜像备份,顺便怀念一下)
简易的防范手段方式:
不信任用户输入的任何资料,将所有输入内容编码并过滤。
3. CSRF
CSRF 跨站请求伪造又被称为 one-click attack 或者 session riding,通常缩写为CSRF 或 XSRF。在已登录的 Web 应用上执行非本意的操作的攻击方法。
举一个例子:假如一家银行执行转帐操作的 URL 地址如下:
http://www.examplebank.com/withdraw?account=AccoutName&amount=10000&for=PayeeName
那么,一个恶意攻击者可以在另一个网站上放置如下代码:
<img src="http://www.examplebank.com/withdraw?account=Mark&amount=10000&for=Bob">
如果用户的登录信息尚未过期的话,就会损失 10000 元。
简单的防范手段:
- 检查 Referer 头字段
这是比较基本的验证方式,通常 HTTP 头中有一个 Referer 字段,它的值应该和请求位置在同一个域下,因此可以通过验证网址是否相同来验证是不是恶意请求,但是有被伪造的可能。
- 添加验证 token
现在许多 Web 框架都提供在表单加入由服务器生成的随机验证 CSRF 的代码,可以辅助防止 CSRF 攻击。
4. DoS
DoS 攻击具体可以分为两种形式:带宽消耗型以及资源消耗型,它们都是通过大量合法或伪造的请求大量消耗网络以及硬件资源,以达到瘫痪网络和系统的目的。
带宽消耗型又分为分布式拒绝服务攻击和放大攻击:分布式拒绝服务攻击的特点是利用僵尸网络向受害者的服务器发送大量流量,目的在于占用其带宽。放大攻击和分布式拒绝服务攻击类似,是通过恶意放大流量限制受害者系统的带宽;其特点是利用僵尸网络通过伪造的源 IP(即攻击目标)向某些存在漏洞的服务器发送请求,服务器在处理请求后向伪造的源 IP 传送应答包,由于这些服务的特殊性导致应答包比请求包更大,因此只使用少量的带宽就可以使服务器器传送大量的响应到目标主机上。
资源消耗型又分为协议分析攻击(SYN Flood)、LAND攻击、CC攻击、僵尸网络攻击,应用程序级洪水攻击(Application level floods)等。
简易的防范手段:
- 防火墙
设定规则阻挡简单攻击
- 交换机
大多交换机都有限制访问的控制功能
- 路由器
大多交换机都有限制访问的控制功能 - 黑洞启动
将请求转发到不存在的位置
5.文件上传漏洞
许多 web 应用都允许用户把文件上传到服务器,由于我们不知道用户会上传什么类型的文件,如果不加注意的话就会引发很大的问题。
简单的防范手段:
阻止非法文件上传
- 设定文件名白名单
- 判断文件标头
阻止非法文件执行
- 存储目录与 Web 应用分离
- 存储目录无执行权限
- 文件重命名
- 图片压缩
- 加密安全
6. 加密安全
大多数网站都会提供会员注册的功能,要注意不要将密码的明文存入数据库。要如果你所登陆的网站在你忘记密码时,取回口令的功能会把密码明文发到你的邮箱,那么这个网站十有八九是没有做加密或者是用的是可逆加密算法。这时你的密码很容易会出现在“我的密码没加密”(http://plainpass.com/)这个网站上。不过即使将密码加密也未必安全,网上存在大量的破解网站(http://www.cmd5.com/),使用彩虹表就可以破解加密的密码。所以一般会针对不同用户使用随机产生的 salt 字符串加盐只后再进行加密的方式来提高密码的强健性。
sha3(salt + gap + password)
简单的入侵流程
- 侦查(Reconnaissance)
攻击者准备攻击之前进行的调查行为,使用搜索引擎或社工手段寻找目标的相关信息,方便之后的攻击
- 扫描(Scanning)
扫描目标主机的弱点,获取服务器操作系统、服务和运行状况等相关信息 - 获取权限(Gaining Access)
利用系统弱点获得服务器权限 - 维护权限(Maintaining Access)
维护当前获取到的权限,以便日后再次操作 - 清除痕迹(Clearing Tracks)
清除入侵的痕迹
总结
随着网络技术的发展,信息安全会越来越重要,当有系统上线时,最好按照《信息安全检查清单》(https://github.com/FallibleIn...)检查一下有哪些安全事项是被你忽略掉的。
本文首发微信公众号:前端先锋
欢迎扫描二维码关注公众号,每天都给你推送新鲜的前端技术文章
欢迎继续阅读本专栏其它高赞文章:
- 深入理解Shadow DOM v1
- 一步步教你用 WebVR 实现虚拟现实游戏
- 13个帮你提高开发效率的现代CSS框架
- 快速上手BootstrapVue
- JavaScript引擎是如何工作的?从调用栈到Promise你需要知道的一切
- WebSocket实战:在 Node 和 React 之间进行实时通信
- 关于 Git 的 20 个面试题
- 深入解析 Node.js 的 console.log
- Node.js 究竟是什么?
- 30分钟用Node.js构建一个API服务器
- Javascript的对象拷贝
- 程序员30岁前月薪达不到30K,该何去何从
- 14个最好的 JavaScript 数据可视化库
- 8 个给前端的顶级 VS Code 扩展插件
- Node.js 多线程完全指南
- 把HTML转成PDF的4个方案及实现
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。