【Web安全】常见的网站安全及解决方案
缘起
经过一番 996,精心打造的网站眼看就要部属上线了,但在网站正式上线之前,你有没有想过自己的网站是否安全吗?尽管你的网站用了很多高大上的技术,但是如果网站的安全性不足,无法保护网站的数据,甚至成为恶意程序的寄生温床,那前面堆砌了再多的美好也都成了枉然。
SQL 注入
在众多安全性漏洞中,SQL 注入绝对是最严重但也是最好处理的一种安全漏洞。在数据库执行查询句时,如果将恶意用户给出的参数直接拼接在查询句上,就有可能发生。
举个例子,假设原本某网站登录验证的查询句长这样:
strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');"
而恶意用户输入的参数为:
userName = "1' OR '1'='1";
passWord = "1' OR '1'='1";
由于代码中是直接将参数与查询句做字串做的拼接,所以 SQL 就成为了这样:
strSQL = "SELECT * FROM users WHERE (name = '1' OR '1'='1') and (pw = '1' OR '1'='1');"
// 相当于
strSQL = "SELECT * FROM users;"
这样一来,账号密码就形同虚设,甚至可以拿到整个数据库的结构(SELECT * FROM sys.tables
)、任意修改、查询数据,整个网站的数据就全部泄露了。
不过解决方法也很简单,只要通过参数化查询来避免直接将参数与查询句拼接,并进行适当的输入检查、插入转义字符、严格设定程序权限,就能够有效避免 SQL 注入了。
XSS
XSS(跨站攻击)也叫JavaScript 注入,是现代网站最频繁出现的问题之一,它指的是网站被恶意用户植入了其他代码,通常发生在网站将用户输入的内容直接放到网站内容时。例如论坛、留言板等可以输入任意文字的网站,恶意用户如果写入一小段 <script>
,并且前、后端都没有针对输入内容做字符转换和过滤处理,直接把用户输入的字串作为页面内容的话,就有可能遭到 XSS。
常见的 XSS 有几个类型:将恶意代码写入数据库,当数据被读取出来时就会执行的储存型 XSS;将用户输入的内容直接带回页面上的反射型 XSS;以及利用 DOM 的特性,各种花式执行恶意代码的DOM-based 型 XSS。
储存型及反射型都很好理解,DOM-based 型就非常有意思了;可以参考OSWAP 整理的XSS Filter Evasion Cheat Sheet,绝大多数的 XSS 方式,都是通过各个元素的 background-image
属性或者元素上的各种事件回调来实现;其中特别值得注意的是 SVG,由于 SVG 中可以写入任意 HTML,还可以加上 onload
事件,如果把 SVG 当成普通图片处理,直接作为网站内容使用,如果遇到恶意用户的话,后果不堪设想。所以在上线上传图片功能时,务必要把 SVG 过滤掉!
避免 XSS 的方法其实也很简单,只要在数据输入输出时做好字符转换,使恶意代码不被执行,而是被解析成字符就可以了。
CSRF
CSRF(跨站请求伪造)是一种利用 Cookie 及 Session 认证机制进行攻击的手段;由于 Session 认证的其实不是用户本人,而是浏览器,那么只要通过网页DOM 元素可以跨域的机制,对已经得到认证的网站发出请求,就可以假冒用户,从而拿到敏感信息。
例如某家银行的转账 API 的URL 是这样的:
http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName
而恶意用户如果在网站中塞进一个 <img />
的话:
<img src="http://www.examplebank.com/withdraw?account=Alice&amount=1000&for=Badman">
当不知情的用户浏览到攻击者的网站时,<img/>
会自动发出这个请求,如果用户登录银行的 Session 尚未过期,那么这个请求很可能就会被银行接受,最后会在用户本人不知情的情况下“被”转帐。
这种攻击方式可以与前面所说的 XSS 是相辅相成,例如在没有防范 XSS 的论坛网站中植入 <img/>
,那么其 src
属性就应该是获取敏感信息的 API URL。
解决方法主要有以下几种:
- 检查 Referer:在服务器端检查请求头中 Referer 的值,也就是检查请求的来源,如果是来自允许的网站,才会正常执行 API 的功能。
- CSRF Token:在 Cookie 及请求发送的数据中都加上
csrftoken
,并检查值是否相同,如果请求来源是自己的网站验证就会通过;反之,由于外部网站无法在代码中得到其他网站的 Cookie,因此无法在请求中带上csrftoken
。 - SameSite Cookie:在 Cookie 中加上
SameSite
属性,确保 Cookie 仅能在自己的网站使用。
JSON 劫持
JSON 劫持是利用现代网站前后端通过 API 进行数据交换的特性,只要能获得使用者权限,并调用获取资料的 API,再加上改写原生的 JavaScript 对象,就可以窃取用户的敏感信息。
获得权限的部分于 CSRF 相同,通过 <script>
可以跨域的特性直接使用浏览器用户的 Cookie;攻击者只需要在网页上通过 <script>
调用获取数据的 API 完成对数据的窃取。
例如:
Object.prototype.__defineSetter__('user',function(obj){for(var i in obj) {alert(i + '=' + obj[i]);}
});
当回传的数据中含有 user
属性时,由于 Setter 通过 Object.prototype.__defineSetter__
改写了,user
中的值会被全部读取。
然而 Object.prototype.__defineSetter__
可以修改原生对象所造成的问题,早已经在 ES4 中就被修复了,JSON 劫持也因此销声匿迹,但是从 ES6 开始又添加了 Proxy,使 JSON 劫持又再次成为可能:
<script> <script> Object.setPrototypeOf(__proto__,new Proxy(__proto__, {has: function(target, name) {alert(name.replace(/./g, function(c) {c = c.charCodeAt(0)return String.fromCharCode(c >> 8, c & 0xff)}))}})) </script>
<script charset="UTF-16BE" src="external-script-with-array-literal"></script>
看起来很恐怖,那么该如何解决呢?除了前面所说的 CSRF Token 外,许多大公司还采用了另一种有趣的解决方式。即 API 的响应内容开头为 for (;;);
,这也是利用 了<script>
引入的 JavaScript 会立即执行的特性,把攻击者的网站卡死在循环里。
总结
除了文中提到的四种常见的网站安全漏洞外,一个网站还有很多细节需要考虑,例如不要用明码存储密码等敏感信息,针对来源 IP 做流量限制防止 DOS 等等。所以在进行网站开发时要保持安全意识,尽可能做好基本的防护措施。
网络安全学习路线
近几年,随着移动互联网、大数据、云计算、人工智能等新一代信息技术的快速发展,围绕网络和数据的服务与应用呈现爆发式增长,丰富的应用场景下暴露出越来越多的网络安全风险和问题。
但是,我国网络安全整体投入不高。据腾讯安全《2017上半年互联网安全报告》显示,近年我国高校教育培养的信息安全专业人才仅3万余人,而网络安全人才总需求量则超过70万人,缺口高达95%。
网络安全工程师毋庸置疑会成为下一个热门程序员类目。最后就给大家分享一份企业级网络安全工程师学习成长路线。
网络安全工程师学习成长路线
第一阶段:安全基础(入门)
第二阶段:Web渗透(初级网安工程师)
第三阶段:进阶部分(中级网络安全工程师)
学习资源分享
扫描下方二维码可免费领取
【Web安全】常见的网站安全及解决方案相关推荐
- Web系统常见安全漏洞介绍及解决方案-sql注入
先看一下目录 一.常见漏洞类型 二.SQL注入 1.SQL 注入危险性.可能原因 2.场景重现 3.sql盲注 4.检测⽅法 5.防护⽅案 三.使用ORM框架 一.常见漏洞类型 关于web安全测试,目 ...
- Web系统常见安全漏洞介绍及解决方案-XSS攻击
漏洞档案 XSS简介 XSS分类介绍 XSS 的威力和危害 XSS防御措施 HttpOnly 输入检查 输出检查 小结 XSS简介 跨站脚本攻击(Cross Site Script),为了和众所周知的 ...
- JSON Web Token(缩写 JWT) 目前最流行、最常见的跨域认证解决方案,前端后端都需要会使用的东西
JSON Web Token(缩写 JWT)是目前最流行,也是最常见的跨域认证解决方案.无论是咱们后端小伙伴,还是前端小伙伴对都是需要了解. 本文介绍它的原理.使用场景.用法. 关于封面:这个冬天你过 ...
- 前端 web端常见的攻击有那几种类型 网站瘫痪 崩溃的原因
前端 web端常见的攻击有那几种类型 文章目录 前端 web端常见的攻击有那几种类型 dos攻击和ddos攻击 dos攻击的原理 ddos攻击 dos攻击的类型 CSRF攻击 CSRF防御 XXS攻击 ...
- WEB应用常见15种安全漏洞一览
摘要: 安全第一! 原文:web 应用常见安全漏洞一览 作者:深予之 (@senntyou) Fundebug遵循创意共享3.0许可证转载,版权归原作者所有. 1. SQL 注入 SQL 注入就是通过 ...
- .NET应用程序7种最常见的性能问题及其解决方案
译者注:这篇文章依然是介绍.NET Framework框架下的性能问题排查,可能并不直接适用于.NET Core,但有时也能提供一些参考. .NET应用程序7种最常见的性能问题及其解决方案 原文地址: ...
- ssm基于Java web 的人人影视网站管理系统毕业设计源码290915
目 录 摘 要 Abstract 第1章 前 言 1.1 研究背景 1.2 研究现状 1.3 系统开发目标 第2章 技术与原理 2.1 开发技术 2.2 JAVA技术 2.3 M ...
- ssm基于Java web 的人人影视网站管理系统 毕业设计-附源码290915
目 录 摘 要 Abstract 第1章 前 言 1.1 研究背景 1.2 研究现状 1.3 系统开发目标 第2章 技术与原理 2.1 开发技术 2.2 JAVA技术 2.3 M ...
- (附源码)ssm基于Java web 的人人影视网站管理系统 毕业设计290915
目 录 摘 要 2 Abstract 4 第1章 前 言 5 1.1 研究背景 5 1.2 研究现状 5 1.3 系统开发目标 6 第2章 技术与原理 7 2.1 开发技术 7 2.2 JAVA技术 ...
最新文章
- c++ 函数指针_开发经验分享(5) 修改Makefile实现C/C++混合编程
- 【ACM】最长公共子序列 - 动态规划
- 认认真真推荐几个机器学习和Python类的公众号
- 代画PCB及C语言编程
- Apicloud开发之V7包继承AppCompactActivity后云编译资源找不到的解决办法
- 为什么玩我的世界老提示Java se错误_我的世界error错误信息 error could解决方法
- ZSKAME大白菜2013官网下载
- python改错题重要的事情说三遍_5个很好的Python面试题问题答案及分析
- Mysql安装 | 跟着黑马程序员视频安装Mysql,少走随机密码错误的弯路【有手就行系列】
- 国仁猫哥:视频号超详细运营攻略教程;教你如何打造一个优质的视频号【建议收藏】
- 【CicadaPlayer】初始化ffmpeg及设置ffmpeg日志
- 《经济半小时》 20130906 指尖上的商机(五)数据时代
- 8本书助你了解人民日报“创作大脑”
- 工信部通报下架60款APP:关联有赞、三六零、唯品会等上市公司
- Mysql8.0和Mysql5.0访问jdbc连接
- PTA C语言 素数对猜想
- 产品经理入门必备书籍
- 独家思维导图!让你秒懂李宏毅2020深度学习(五)—— Tips for Deep Leaning Why Deep?
- hdu 2829 Lawrence 斜率优化
- 藏在80年代的儿时游戏里的”通证经济“