前言

这周末应该有很多人被叫去加班改bug了吧,因为出现了一个log4j的bug,可以让黑客进行攻击,所以都在紧急修复这个问题。
现在互联网的开发者最关心的问题是是什么?肯定是安全。不止是开发者会关心安全问题,就是普通用户也会关心这个问题,如果一个网站或者一个APP不安全,用户是不会选择使用的,谁愿意让自己的信息公布于众,而随着技术的发展各种各样的攻击手段层出不穷。这里有一个网站,隔一段时间就会统计各种web攻击的排名前十:owasp,感兴趣的可以点进去看看,下面我先列出2017年和2021年攻击手段排名top10:

从图上可以看到作为一名前端开发者经常听到的一些攻击:XSS、Injection等等,为啥这里面没有CSRF呢,目前为止我们对CSRF的防范已经很成熟了,现在使用的token就是为了防止CSRF的攻击而产生,而且它的攻击手段简单,不像XSS难以防范,所以已经跌出前十了,在前几年还能排进前十。

XSS

下面就开始讲我们本篇文章的重点了,那就是XSS(跨站脚本攻击)。先来看一下XSS的定义:XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
我们想个问题:如果你能够在别人的网站里植入JS,你会干嘛?如果我们可以在一个网站里植入自己的js代码,我们就拥有了无限的可能,比如:无限弹窗、篡改网站页面、获取用户信息等等。甚至你可以在网站里植入广告,以此来获取大量利润,这都是完全可以实现的。所以XSS的危害是巨大的,作为一个前端开发人员不得不小心。

XSS分类

根据攻击的来源可以分为三种类型:存储型、反射型、DOM型三种。

存储型XSS

存储型 XSS 的攻击步骤:

  1. 攻击者将恶意代码提交到目标网站的数据库中。
  2. 用户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。
  3. 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
  4. 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
  5. 这种攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。

反射型XSS

反射型 XSS 的攻击步骤:

  1. 攻击者构造出特殊的 URL,其中包含恶意代码。
  2. 用户打开带有恶意代码的 URL 时,网站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器。
  3. 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
  4. 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

反射型 XSS 跟存储型 XSS 的区别是:存储型 XSS 的恶意代码存在数据库里,反射型 XSS 的恶意代码存在 URL 里。
反射型 XSS 漏洞常见于通过 URL 传递参数的功能,如网站搜索、跳转等。
由于需要用户主动打开恶意的 URL 才能生效,攻击者往往会结合多种手段诱导用户点击。
POST 的内容也可以触发反射型 XSS,只不过其触发条件比较苛刻(需要构造表单提交页面,并引导用户点击),所以非常少见。

DOM型XSS

  1. 攻击者构造出特殊的 URL,其中包含恶意代码。
  2. 用户打开带有恶意代码的 URL。
  3. 用户浏览器接收到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行。
  4. 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞。

攻击举例


随便在一个html文件里写一个input和button,假设现在是一个文章的评论区,那么我们在这个input框里输入的文字就是我们要评论的内容,点击按钮发表评论,发表的内容会在下面展示出来,我们先测试一下:

很完美,可以打印出来了,那么普通文本可以展示出来,换成标签呢,我们在试试:

可以看到我们输入s标签就是加横线的,下面打印出来的和我们输入的不一样,这里我是使用的innerHTML展示的输入框内容。如果我们在一个网站里输入东西之后展示的是这样的结果,那么我们就可以做很多事情了,因为这代表着这个网站没有对XSS进行防御,我们可以为所欲为,下面就进行一个弹窗的测试,更直观的展示使用document.write()来实现,innerHTML需要一些特殊操作:

如上图所示,在输入框中输入一行js代码,点击打印文字就会执行。不要仅仅以为只能执行这几行js代码感觉做不了什么事情,script标签的src属性可以链接外部文件。加入一个黑客写了一堆代码,然后使用src加载这个文件并执行,这是一件非常可怕的事情。上面的演示只是本地模拟,真正的场景是会把评论内容存进数据库,这样会造成每个看到这个评论的用户都会执行这句恶意注入的代码,这就会造成很严重的影响,下面我们再来看一个改变DOM结构的XSS攻击:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><input type="text" id="inp"><button id="btn">打印文字</button><div id="box"></div><script>let inp = document.getElementById('inp');let btn = document.getElementById('btn');let box = document.getElementById('box');btn.onclick = function() {let value = inp.value;box.innerHTML = "<img src='"+value+"'></img>";}</script>
</body>
</html>

这是我们要测试的代码,可以看到这行代码里引入了一个img标签,输入的内容会作为这个img的src,这个场景也很常见,比如头像上传,图片上传等等。

我们在input框中输入1'onerror='alert("xss")也会执行这些代码,1’是为了闭合img标签的src,否则后面的js代码无法生效。我们甚至可以在输入框中执行一个函数添加一个诱导链接,然后获取用户信息。

XSS防御

通过上面的举例和分类可以看出xss攻击有两大要素:

  1. 攻击者提交恶意代码
  2. 浏览器执行恶意代码

解决方法:从输入到输出都要进行过滤、转义。永远不要相信用户的输入!!!

输入

  1. 用户输入
  2. url参数
  3. post参数
    我们需要对一些特殊的字符、标签进行编码展示:

输出

永远不要相信innerHTML、document.write()、eval这三兄弟,只要网站中使用了这三种输出方式,那么恭喜你,喜提XSS攻击,这三种输出方式可以做太多的事情。

CSP(Content Security Policy)

严格的 CSP 在 XSS 的防范中可以起到以下的作用:

  1. 禁止加载外域代码,防止复杂的攻击逻辑。
  2. 禁止外域提交,网站被攻击后,用户的数据不会泄露到外域。
  3. 禁止内联脚本执行(规则较严格,目前发现 GitHub 使用)。
  4. 禁止未授权的脚本执行(新特性,Google Map 移动版在使用)。
  5. 合理使用上报可以及时发现 XSS,利于尽快修复问题。

后记

大家在进行网站开发时一定不要盲目自信,尽量使用完善的防御工具或者防御库,在开发完成后请测试人员或者安全人员进行测试,确保没有问题后在进行上线,否则可能会带来一系列的灾难。
最后给大家提供一个XSS小游戏,一共有6关,都是实现XSS攻击的,每完成一个攻击就会进入下一关,要是通关了,我想你开发的网站在XSS防御方面应该是比较可靠的:xss小游戏

前端安全——XSS攻击与防御原理详解相关推荐

  1. csrf漏洞防御方案_CSRF 漏洞原理详解及防御方法

    跨站请求伪造:攻击者可以劫持其他用户进行的一些请求,利用用户身份进行恶意操作. 例如:请求http://x.com/del.php?id=1是一个删除ID为1的账号,但是只有管理员才可以操作,如果攻击 ...

  2. 深入理解XSS攻击与防御

    深入理解XSS攻击与防御 What is XSS XSS攻击的类型 XSS攻击原理 XSS攻击危害 XSS攻击方法 How to defense XSS 防御原则:永远不要相信用户的输入. 防御措施 ...

  3. 用WEB技术栈开发NATIVE应用(二):WEEX 前端SDK原理详解

    摘要: WEEX依旧采取传统的web开发技术栈进行开发,同时app在终端的运行体验不输native app.其同时解决了开发效率.发版速度以及用户体验三个核心问题.那么WEEX是如何实现的?目前WEE ...

  4. 网络层(TCP/UDP)攻击与防御原理

    应用层攻击 :HTTP.DNS.FTP等 应用层攻击可参考:应用层(DNS/HTTP/HTTPS)攻击与防御原理 网络层攻击防御 网络层攻击防御主要分为以下三类: TCP类报文攻击防御 UDP类报文攻 ...

  5. AI 以 5:0 比分击败美顶级飞行员;经典对抗攻击 Deepfool 原理详解

    开发者社区技术周刊又和大家见面了,快来看看这周有哪些值得我们开发者关注的重要新闻吧. 2019 年全球公共云服务市场总额达 2334 亿美元 新里程碑!IBM 宣布最高量子体积 64 马斯克将通过实时 ...

  6. 应用层(DNS/HTTP/HTTPS)攻击与防御原理

    网络层攻击:TCP.UDP类攻击 网络层攻击可参考:网络层(TCP/UDP)攻击与防御原理 DNS类报文攻击防御 简要笔记: 针对DNS Anti-ddos ,针对缓存服务器 虚假源 (1)源认证 发 ...

  7. Web网络安全漏洞分析,SQL注入原理详解

    本文主要为大家介绍了Web网络安全漏洞分析SQL注入的原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪 一.SQL注入的基础 1.1 介绍SQL注入 SQL注入就是 ...

  8. 计算机组织与结构poc,CPU漏洞原理详解以及POC代码分享

    原标题:CPU漏洞原理详解以及POC代码分享 首先,这个漏洞已经公布近一周时间了,看到各大媒体.公众号到处在宣传,本打算不再发布类似信息,但是发现很多媒体的报道达到了一个目的--几乎所有的CPU都有漏 ...

  9. HTTPS 加密算法原理详解

    本文讲的是HTTPS 加密算法原理详解, 前言 HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer),其实 HTTPS 并不是一 ...

  10. 前端实现动画的6种方式详解

    前端实现动画的6种方式详解 一.总结 一句话总结:一般是css样式改变加setInterval 二.[前端动画]实现动画的6种方式 通常在前端中,实现动画的方案主要有6种: javascript直接实 ...

最新文章

  1. week6 10 后端backend server和mongoDB通信
  2. MSXML解析[转]
  3. git提交过滤target文件 idea_找不到或无法加载主类(IDEA中启动spring boot项目)
  4. DataFrame 拼接,筛选,修改
  5. Mac OS包管理器Homebrew
  6. java可存储100个整数的数组_定义一个一维整数数组,其中储存1000个1至100以内的整数,并统计出整数出现的次数(Java写出来)...
  7. cd短是什么意思_每日命令|pwd、cd
  8. php curl密码控件,检索通过curl传递的用户名,密码参数 - php
  9. Android Studio导入model
  10. mysql数据库表格导出为excel表格
  11. 学硕论文选题计算机,研究生计算机论文题目大全 研究生计算机论文题目哪个好...
  12. linux台式机怎么用无线网卡,台式机无线网卡怎么用 台式机USB无线网卡安装使用教程...
  13. numpy中的ones函数
  14. word文档删除空白页
  15. gateway官网文档解读(六) 汇总
  16. Jenkins Pipeline预研
  17. 五种提高 SQL 性能的方法 [来源:MSDN Johnny Papa]
  18. HTML做表单联系地址选择省,HTML 表单
  19. 顺序表 - 地址计算
  20. 最近感觉公司的福利还不错

热门文章

  1. 【MIT 6.S081】实验四:traps (实验暂停)
  2. python贪吃蛇的实验报告_贪吃蛇游戏程序设计实验报告.doc
  3. VC6.0和VC2012的全局对象的释放!!!
  4. python app开发框架_Python可以开发APP吗?用哪个框架?
  5. 数车计算机编程教学caxa,CAXA数控车(数控车床编程工具)V2018.1.0 正式版
  6. vivo和OPPO手机刷机
  7. linux 测试post接口
  8. 面试必考之Java三大特性
  9. 常用的网络传输协议:UDP和TCP
  10. 基于Matlab使用激光雷达从点云到跟踪列表跟踪车辆仿真(附源码)