XSS攻击的预防

结合上一篇文章知道了XSS的基本攻击方式和基本概念,这里就主要讲一下如何预防XSS的攻击。

上面是我在网上找的一个可以作为简单理解的概念图,如果不理解可以根据顺序参照理解。

预防储存型和反射型XSS攻击

存储型和反射型 XSS 都是在服务端取出恶意代码后,插入到响应 HTML 里的,攻击者刻意编写的“数据”被内嵌到“代码”中,被浏览器所执行。

预防这两种漏洞,有两种常见做法:

改成纯前端渲染,把代码和数据分隔开。
对 HTML 做充分转义。
纯前端渲染
纯前端渲染的过程:

浏览器先加载一个静态 HTML,此 HTML 中不包含任何跟业务相关的数据。
然后浏览器执行 HTML 中的 JavaScript。
JavaScript 通过 Ajax 加载业务数据,调用 DOM API 更新到页面上。
在纯前端渲染中,我们会明确的告诉浏览器:下面要设置的内容是文本(.innerText),还是属性(.setAttribute),还是样式(.style)等等。浏览器不会被轻易的被欺骗,执行预期外的代码了。

但纯前端渲染还需注意避免 DOM 型 XSS 漏洞(例如 onload 事件和 href 中的 javascript:xxx 等,请参考下文”预防 DOM 型 XSS 攻击“部分)。

在很多内部、管理系统中,采用纯前端渲染是非常合适的。但对于性能要求高,或有 SEO 需求的页面,我们仍然要面对拼接 HTML 的问题。

转义 HTML
如果拼接 HTML 是必要的,就需要采用合适的转义库,对 HTML 模板各处插入点进行充分的转义。

常用的模板引擎,如 doT.js、ejs、FreeMarker 等,对于 HTML 转义通常只有一个规则,就是把 & < > " ’ / 这几个字符转义掉,确实能起到一定的 XSS 防护作用,但并不完善:

XSS 安全漏洞 简单转义是否有防护作用
HTML 标签文字内容
HTML 属性值
CSS 内联样式
内联 JavaScript
内联 JSON
跳转链接

所以要完善 XSS 防护措施,我们要使用更完善更细致的转义策略。

<!-- HTML 标签内文字内容 -->
<div><%= Encode.forHtml(UNTRUSTED) %></div><!-- HTML 标签属性值 -->
<input value="<%= Encode.forHtml(UNTRUSTED) %>" /><!-- CSS 属性值 -->
<div style="width:<= Encode.forCssString(UNTRUSTED) %>"><!-- CSS URL -->
<div style="background:<= Encode.forCssUrl(UNTRUSTED) %>"><!-- JavaScript 内联代码块 -->
<script>var msg = "<%= Encode.forJavaScript(UNTRUSTED) %>";alert(msg);
</script><!-- JavaScript 内联代码块内嵌 JSON -->
<script>
var __INITIAL_STATE__ = JSON.parse('<%= Encoder.forJavaScript(data.to_json) %>');
</script><!-- HTML 标签内联监听器 -->
<buttononclick="alert('<%= Encode.forJavaScript(UNTRUSTED) %>');">click me
</button><!-- URL 参数 -->
<a href="/search?value=<%= Encode.forUriComponent(UNTRUSTED) %>&order=1#top"><!-- URL 路径 -->
<a href="/page/<%= Encode.forUriComponent(UNTRUSTED) %>"><!--URL.注意:要根据项目情况进行过滤,禁止掉 "javascript:" 链接、非法 scheme 等
-->
<a href='<%=urlValidator.isValid(UNTRUSTED) ?Encode.forHtml(UNTRUSTED) :"/404"
%>'>link
</a>

可见,HTML 的编码是十分复杂的,在不同的上下文里要使用相应的转义规则。
预防 DOM 型 XSS 攻击
DOM 型 XSS 攻击,实际上就是网站前端 JavaScript 代码本身不够严谨,把不可信的数据当作代码执行了。

在使用 .innerHTML、.outerHTML、document.write() 时要特别小心,不要把不可信的数据作为 HTML 插到页面上,而应尽量使用 .textContent、.setAttribute() 等。

如果用 Vue/React 技术栈,并且不使用 v-html/dangerouslySetInnerHTML 功能,就在前端 render 阶段避免 innerHTML、outerHTML 的 XSS 隐患。

DOM 中的内联事件监听器,如 location、onclick、onerror、onload、onmouseover 等,a 标签的 href 属性,JavaScript 的 eval()、setTimeout()、setInterval() 等,都能把字符串作为代码运行。如果不可信的数据拼接到字符串中传递给这些 API,很容易产生安全隐患,请务必避免。

<!-- 内联事件监听器中包含恶意代码 -->
![](https://awps-assets.meituan.net/mit-x/blog-images-bundle-2018b/3e724ce0.data:image/png,)<!-- 链接内包含恶意代码 -->
<a href="UNTRUSTED">1</a><script>
// setTimeout()/setInterval() 中调用恶意代码
setTimeout("UNTRUSTED")
setInterval("UNTRUSTED")// location 调用恶意代码
location.href = 'UNTRUSTED'// eval() 中调用恶意代码
eval("UNTRUSTED")
</script>

如果项目中有用到这些的话,一定要避免在字符串中拼接不可信数据。

其他 XSS 防范措施

虽然在渲染页面和执行 JavaScript 时,通过谨慎的转义可以防止 XSS 的发生,但完全依靠开发的谨慎仍然是不够的。以下介绍一些通用的方案,可以降低 XSS 带来的风险和后果。

Content Security Policy

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

  • 禁止加载外域代码,防止复杂的攻击逻辑。
  • 禁止外域提交,网站被攻击后,用户的数据不会泄露到外域。
  • 禁止内联脚本执行(规则较严格,目前发现 GitHub 使用)。
  • 禁止未授权的脚本执行(新特性,Google Map 移动版在使用)。
  • 合理使用上报可以及时发现 XSS,利于尽快修复问题。
  • 关于 CSP 的详情,请关注前端安全系列后续的文章。

输入内容长度控制

对于不受信任的输入,都应该限定一个合理的长度。虽然无法完全防止 XSS 发生,但可以增加 XSS 攻击的难度。

其他安全措施

  • HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此
    Cookie。
  • 验证码:防止脚本冒充用户提交危险操作。

参考网址,内容转载为美团技术团队

XSS攻击的预防措施相关推荐

  1. 计算机网络之XSS攻击

    文章目录 计算机网络之XSS攻击 1.什么是XSS攻击 2.预防XSS攻击措施 计算机网络之XSS攻击 1.什么是XSS攻击 XSS也称 cross-site scripting,跨站脚本,因为会与层 ...

  2. XSS攻击(出现的原因、预防措施)

    XSS攻击(出现的原因.预防措施......) 验证XSS攻击重点不是去查找可输入哪些内容会出现什么样的bug就是测试XSS攻击,重点是了解它出现的原理,为什么会出现XSS攻击,导致一些问题出现?如何 ...

  3. XSS攻击(出现的原因、预防措施......)

    验证XSS攻击重点不是去查找可输入哪些内容会出现什么样的bug就是测试XSS攻击,重点是了解它出现的原理,为什么会出现XSS攻击,导致一些问题出现?如何防御与解决XSS攻击?以下我将简单介绍以上提出的 ...

  4. 如何防止跨站点脚本 (XSS) 攻击完整指南

    跨站点脚本 (XSS) 攻击的完整指南.如何防止它以及 XSS 测试. 跨站点脚本 (XSS) 是每个高级测试人员都知道的最流行和易受攻击的攻击之一.它被认为是对 Web 应用程序最危险的攻击之一,也 ...

  5. 安全测试之xss攻击和mysql注入

    xss概念: xss(Cross Site Script)跨站脚本攻击,为不和层叠样式表(css)混淆,写为xss 存在位置:web应用系统最常见软件安全漏洞 后果:代码植入到系统页面,篡改数据.盗取 ...

  6. vue 如何防止xss攻击 框架_LearningNotes-1/Vue/Vue中防止XSS脚本攻击 at master · axuu/LearningNotes-1 · GitHub...

    Vue中防止XSS脚本攻击 最近写了一个博客评论模块,因为引入了表情包,所以就将原来的v-text的形式,改成了v-html,也就是渲染html标签,但是这样不可不免的会带来问题,就是XSS跨站脚本攻 ...

  7. 安全测试之XSS攻击

    XSS (跨站脚本攻击)是什么?它的全名是:Cross-site scripting,为了和CSS层叠样式表区分所以取名XSS.是一种网站应用程序的安全漏洞攻击,是代码注入的一种.它允许恶意用户将代码 ...

  8. AntiXSS - 支持Html同时防止XSS攻击

    跨站脚本攻击(XSS)已经不是什么新鲜的话题了,甚至很多大公司也为此吃尽苦头.最简单直接的防范方法,就是不允许任何html标签输入,对用户输入进行编码(htmlencode). 但是如果想用户输入支持 ...

  9. 如何php防止XSS攻击

    什么是XSS:这里通俗的讲,就像是SQL注入一样,XSS攻击也可以算是对HTML和JS的一种注入.你本来希望得到是从用户那得到一段有用的文本文字,但用户提交给你的却是别有用心的可执行javascrip ...

最新文章

  1. python range从大到小排列_python 十大经典排序算法
  2. 全球及中国绝缘材料用沸石行业“十四五”前景规划及未来发展趋势报告2021年版
  3. python 图片上传到minio时,在minio不是显示图片格式
  4. 四种struts2访问web元素的方式
  5. 最优化方法:梯度下降法、SGD
  6. BZOJ3038 上帝造题的七分钟
  7. 两阶段3D目标检测网络 SIENet: Spatial Information Enhancement Network for 3D Object Detection from Point Cloud
  8. java拼装树_java 数据拼装成树结构
  9. RabbitMQ中basicConsume、basicCancel、basicPublish方法
  10. [HNOI2010] 城市建设_动态最小生成树(Dynamic_MST)
  11. JavaScript怎么安装_WebStrom 2019安装教程
  12. si446使用记录(一):基本资料获取
  13. 微信小程序轮播图,图片自适应,图片循环播放,图片之间有空白空间
  14. Adobe完全卸载工具
  15. swagger 修改dto注解_Swagger注解及参数细节的正确书写。
  16. RS-232与RS485通信方式区别
  17. Python基于OpenCV的人脸表情识别系统[源码&部署教程]
  18. 温度滞回程序C语言,滞回比较器在温度控制器中的作用
  19. 用Python去优惠券,看到结果我惊呆了!
  20. java jta mysql_JTA实现跨数据库操作

热门文章

  1. Python:善用query,从excel数据中批量提取数据到新文件
  2. vb吐槽班02 不要以为学生信息管理系统很难啊魂淡!
  3. Android系统学习---基础知识
  4. 风神小度_风神与野面具:设计出色的像素艺术角色
  5. 思岚机器人移动底盘传感器位置坐标及底盘配置工具的使用说明
  6. Linux -- lvm逻辑卷管理和RAID
  7. 2022四非计算机保研经验贴
  8. 高等数学学习笔记——第三讲——集合与映射(2. 确界与连续性公理)
  9. 猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求
  10. 0.96寸OLED(三)汉字显示改进