缘起

经过一番 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安全】常见的网站安全及解决方案相关推荐

  1. Web系统常见安全漏洞介绍及解决方案-sql注入

    先看一下目录 一.常见漏洞类型 二.SQL注入 1.SQL 注入危险性.可能原因 2.场景重现 3.sql盲注 4.检测⽅法 5.防护⽅案 三.使用ORM框架 一.常见漏洞类型 关于web安全测试,目 ...

  2. Web系统常见安全漏洞介绍及解决方案-XSS攻击

    漏洞档案 XSS简介 XSS分类介绍 XSS 的威力和危害 XSS防御措施 HttpOnly 输入检查 输出检查 小结 XSS简介 跨站脚本攻击(Cross Site Script),为了和众所周知的 ...

  3. JSON Web Token(缩写 JWT) 目前最流行、最常见的跨域认证解决方案,前端后端都需要会使用的东西

    JSON Web Token(缩写 JWT)是目前最流行,也是最常见的跨域认证解决方案.无论是咱们后端小伙伴,还是前端小伙伴对都是需要了解. 本文介绍它的原理.使用场景.用法. 关于封面:这个冬天你过 ...

  4. 前端 web端常见的攻击有那几种类型 网站瘫痪 崩溃的原因

    前端 web端常见的攻击有那几种类型 文章目录 前端 web端常见的攻击有那几种类型 dos攻击和ddos攻击 dos攻击的原理 ddos攻击 dos攻击的类型 CSRF攻击 CSRF防御 XXS攻击 ...

  5. WEB应用常见15种安全漏洞一览

    摘要: 安全第一! 原文:web 应用常见安全漏洞一览 作者:深予之 (@senntyou) Fundebug遵循创意共享3.0许可证转载,版权归原作者所有. 1. SQL 注入 SQL 注入就是通过 ...

  6. .NET应用程序7种最常见的性能问题及其解决方案

    译者注:这篇文章依然是介绍.NET Framework框架下的性能问题排查,可能并不直接适用于.NET Core,但有时也能提供一些参考. .NET应用程序7种最常见的性能问题及其解决方案 原文地址: ...

  7. ssm基于Java web 的人人影视网站管理系统毕业设计源码290915

    目  录 摘  要 Abstract 第1章  前  言 1.1  研究背景 1.2  研究现状 1.3  系统开发目标 第2章  技术与原理 2.1  开发技术 2.2  JAVA技术 2.3  M ...

  8. ssm基于Java web 的人人影视网站管理系统 毕业设计-附源码290915

    目  录 摘  要 Abstract 第1章  前  言 1.1  研究背景 1.2  研究现状 1.3  系统开发目标 第2章  技术与原理 2.1  开发技术 2.2  JAVA技术 2.3  M ...

  9. (附源码)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技术 ...

最新文章

  1. c++ 函数指针_开发经验分享(5) 修改Makefile实现C/C++混合编程
  2. 【ACM】最长公共子序列 - 动态规划
  3. 认认真真推荐几个机器学习和Python类的公众号
  4. 代画PCB及C语言编程
  5. Apicloud开发之V7包继承AppCompactActivity后云编译资源找不到的解决办法
  6. 为什么玩我的世界老提示Java se错误_我的世界error错误信息 error could解决方法
  7. ZSKAME大白菜2013官网下载
  8. python改错题重要的事情说三遍_5个很好的Python面试题问题答案及分析
  9. Mysql安装 | 跟着黑马程序员视频安装Mysql,少走随机密码错误的弯路【有手就行系列】
  10. 国仁猫哥:视频号超详细运营攻略教程;教你如何打造一个优质的视频号【建议收藏】
  11. 【CicadaPlayer】初始化ffmpeg及设置ffmpeg日志
  12. 《经济半小时》 20130906 指尖上的商机(五)数据时代
  13. 8本书助你了解人民日报“创作大脑”
  14. 工信部通报下架60款APP:关联有赞、三六零、唯品会等上市公司
  15. Mysql8.0和Mysql5.0访问jdbc连接
  16. PTA C语言 素数对猜想
  17. 产品经理入门必备书籍
  18. 独家思维导图!让你秒懂李宏毅2020深度学习(五)—— Tips for Deep Leaning Why Deep?
  19. hdu 2829 Lawrence 斜率优化
  20. 藏在80年代的儿时游戏里的”通证经济“

热门文章

  1. linux常用基础命令整理
  2. STM32标准外设库
  3. python机械编程入门先学什么_编程入门先学什么
  4. vue 获取当前时间(并与演出时间对比做出状态改变)
  5. STM32F103+FFT+OLED25664的音乐频谱制作分享(继续干货)
  6. 什么是回滚事务rollback?
  7. 六十星系之33紫微贪狼坐卯酉
  8. 2021-03-13 软件工程导论-自我简介
  9. IIS - IIS重启方式
  10. 人脸识别智能锁的发展选择