前端安全: 如何防止 XSS 攻击?

分享简介

今天想分享给大家的是 如何防止 XSS 攻击.
为什么想分享的原因是: 感觉大家对前端安全了解不够, 重视不够.

内容是:

  • 什么是 xss, 常见 xss 的类型. 并且通过小游戏来实践.
  • 如何去防止 xss 攻击

如何利用 XSS 进行攻击

什么是 XSS 攻击

Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。

XSS 的本质是:恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。

XSS 有哪些类型

  • 存储型
  • 反射型
  • DOM 型

存储型

场景: 用户发表评论, 论坛发帖, 用户私信等

  • 攻击者将恶意的代码, 提交到数据库中.
  • 后端服务器, 从数据库中获取的内容拼接成 html, 返回给浏览器
  • 用户打开页面, 混入其中的恶意代码被浏览器执行.
  • 恶意代码获取浏览器端的关键信息发送给攻击者的服务器
<% @post.comments.each.do |_c| %><%= _c.comment %>
<% end %><%= link_to "Personal Website", @user.website %>

反射型

场景: 网站搜索, 分享链接, 恶意邮件等

反射型 XSS 漏洞常见于通过 URL 传递参数的功能。
由于需要用户主动打开恶意的 URL 才能生效,攻击者往往会结合多种手段诱导用户点击。

  • 攻击者构造出特殊的 URL,其中包含恶意代码。
  • 用户打开带有恶意代码的 URL 时,网站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器。
  • 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
  • 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
http://xxx/search?keyword=<script>alert('XSS');</script>
<input type="text" value="<%= params[:keyword] %>">
<button>搜索</button>
<div>您搜索的关键词是:<%= params[:keyword] %>
</div>

DOM 型

场景: 网站搜索, 分享链接, 恶意邮件等

DOM 型其实算上反射型的一种.
DOM XSS 是由于浏览器解析机制导致的漏洞,服务器不参与,而存储型与反射型都需要服务器响应参与.

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

https://www.abc.com/hello#<img%20src=""%20onerror="alert('xss')">

<div id="box"></div><script>var hash = window.location.hash.slice(1);var box = document.getElementById('box');box.innerHTML = unescape(hash);
</script>

容易出现 xss 漏洞的 js 方法

  • innerHTML, outerHTML
  • document.write
  • eval

XSS 小游戏

xss-game 讲前三个就够了

如何防止 XSS 攻击

XSS 的本质是:恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行

防止的方式有:

  • 过滤恶意的输入
  • 转义输出
    • 纯前端渲染
    • 服务端渲染(模板渲染)
  • 通过浏览器的限制

过滤恶意输入

前端过滤不靠谱, 主要还是由后端去处理. 并且过滤恶意输入适用范围有限.
适用于: 明确的输入类型,例如数字、URL、电话号码、邮件地址等等内容

例如: 5 < 7, 在数据库中存储成了 5 &lt; 7

  • 通过页面拼接 html 是可以的
  • 通过 ajax 返回 json 对象, 直接会是 5 &lt; 7, 不能够直接用户计算字符串长度, 展示标题等等

输入侧过滤能够在某些情况下解决特定的 XSS 问题,但会引入很大的不确定性和乱码问题。在防范 XSS 攻击时应避免此类方法。

既然输入过滤并非完全可靠,我们就要通过防止浏览器执行恶意代码来防范 XSS。
方式有 2 种

  • 转义输出
  • 通过浏览器限制

转义输出

  • 纯前端渲染
  • 服务端渲染

纯前端渲染

在纯前端渲染中(例如 vue 项目)

Vue 的安全措施 中,提到 vue 的模板渲染, 默认提供转义; (v-html不会转义), 并且框架内部会明确的告诉浏览器:下面要设置的内容是文本(.innerText),还是属性(.setAttribute),还是样式(.style)等等。浏览器不会被轻易的被欺骗,执行预期外的代码了。

<h1>{{ userProvidedString }}</h1>

如果 userProvidedString 是 <script>alert('hi');</script>, 则它会被转义成为如下 HTML:

&lt;script&gt;alert(&quot;hi&quot;)&lt;/script&gt;

但是, 注意 url 的问题, vue 不会处理.
我们可以使用sanitize-url进行处理;

<!-- 如果 evil_url 的值是 javascript:alert('xss') -->
<a :href="evil_url"></a>

服务端渲染

但对于性能要求高,或有 SEO 需求的页面,我们仍然要面对拼接 HTML 的问题。

rails security中提及到了sanitize.
它可以强有效地避免 xss 攻击.

tags = %w(a acronym b strong i em li ul ol h1 h2 h3 h4 h5 h6 blockquote br cite sub sup ins p)
s = sanitize(user_input, tags: tags, attributes: %w(href title))# https://edgeguides.rubyonrails.org/3_0_release_notes.html#action-view
# You no longer need to call h(string) to escape HTML output, it is on by default in all view templates. If you want the unescaped string, call raw(string).<%= name %><%= h(name) %>#  html_safe 是我们认为是可以不经过转义直接输出的 https://groups.google.com/g/rubyonrails-core/c/T9N5wexIg80?pli=1
<%= name.html_safe %>

浏览器限制

CSP

Content Security Policy (简称 CPS)可以限制代码的执行.
只加载限定域名下 js 文件, 并同时不执行行内的 js 代码.

http-only

JavaScript document.cookie API 无法访问带有 HttpOnly 属性的 cookie;
此类 Cookie 仅作用于服务器。例如,持久化服务器端会话的 Cookie 不需要对 JavaScript 可用,而应具有 HttpOnly 属性。此预防措施有助于缓解跨站点脚本(XSS)攻击。

// 无法获取到设置 http-only 的cookie
document.cookie;

总结

XSS 攻击的类型

  • 存储型
  • 反射型
  • dom 型

如何防止 XSS 的攻击

  • 过滤恶意的输入
  • 转义输出
  • 浏览器限制

实际工作中, 可以直接使用成熟的库.

参考

  • 大部分借鉴: 前端安全系列(一):如何防止 XSS 攻击?
  • 前端安全系列之二:如何防止 CSRF 攻击?
  • Preventing Cross-site Scripting Vulnerabilities When Developing Ruby on Rails Web Applications
  • ruby on rails security
  • Prevent Cross-site Scripting Attacks with Rails 2.3.5 and rails_xss
  • Unleashing an Ultimate XSS Polyglot
  • Cross_Site_Scripting_Prevention_Cheat_Sheet
  • Ruby_on_Rails_Cheat_Sheet
  • 驱散前端安全梦魇——DOM XSS 典型场景分析与修复指南
  • google app security xss
  • Basics_of_HTTP Data_URIs
  • vue 安全
  • 安全 别用 raw 和 html_safe
  • Replace “raw” & “html_safe” with “sanitize” for security reasons #532

前端安全: 如何防止 XSS 攻击?相关推荐

  1. 前端拦截url参数xss攻击_闲庭信步聊前端 - 漫谈XSS

    闲庭信步聊前端 - 漫谈XSS 什么是XSS? 众所周知XSS是Cross-Site Scripting(跨站脚本攻击)的简称,但是英文的缩写明明是CSS为什么叫XSS呢?---历史遗留问题,因为CS ...

  2. 【Web 安全】XSS 攻击详解

    文章目录 一.XSS 攻击概述 二.XSS 攻击原理 1. XSS的攻击载荷 (1) script 标签 (2) svg 标签 (3) img 标签 (4)body 标签 (5) video 标签 ( ...

  3. xss植入_前端安全之XSS攻击

    XSS(cross-site scripting跨域脚本攻击)攻击是最常见的Web攻击,其重点是"跨域"和"客户端执行".有人将XSS攻击分为三种,分别是: 1 ...

  4. 前端安全 -- XSS攻击

    XSS漏洞是最广泛.作用最关键的web安全漏洞之一.在绝大多数网络攻击中都是把XSS作为漏洞链中的第一环,通过XSS,黑客可以得到的最直接利益就是拿到用户浏览器的cookie,从而变相盗取用户的账号密 ...

  5. 前端Hack之XSS攻击个人学习笔记

    简单概述 **        此篇系本人两周来学习XSS的一份个人总结,实质上应该是一份笔记,方便自己日后重新回来复习,文中涉及到的文章我都会在末尾尽可能地添加上,此次总结是我在学习过程中所写,如有任 ...

  6. 【前端安全系列】【万字详解】如何防止XSS攻击?

    本文我们会了解 XSS ,主要包括: XSS 攻击的介绍 XSS 攻击的分类 XSS 攻击的预防和检测 XSS 攻击的总结 XSS 攻击案例 一.XSS攻击的介绍 跨站脚本攻击(XSS)是指通过存在安 ...

  7. 前端安全系列(一):如何防止XSS攻击?

    前端安全 随着互联网的高速发展,信息安全问题已经成为企业最为关注的焦点之一,而前端又是引发企业安全问题的高危据点.在移动互联网时代,前端人员除了传统的 XSS.CSRF 等安全问题之外,又时常遭遇网络 ...

  8. 前端安全系列:如何防止XSS攻击?

    前端安全 随着互联网的高速发展,信息安全问题已经成为企业最为关注的焦点之一,而前端又是引发企业安全问题的高危据点.在移动互联网时代,前端人员除了传统的 XSS.CSRF 等安全问题之外,又时常遭遇网络 ...

  9. xss攻击-面向前端的安全攻击 ─=≡Σ(((つ•̀ω•́)つ 知己知彼百战百胜 web安全

    文章目录 XSS简介 测试环境 XSS工具步骤与分类 XSS用到的一些HTML和JS HTML表单文本框介绍 探测xss 反射型XSS 常用的反射型XSS攻击方法 闭合标签 使用下拉菜单 使用隐藏输入 ...

  10. XSS攻击,XSS预防(前端安全),XSS练习

    XSS攻击,XSS预防(前端安全),XSS练习 文章目录 XSS攻击,XSS预防(前端安全),XSS练习 1:什么是XSS 2:XSS 分类 2.1:存储型 XSS 2.2:反射型 XSS 2.3:D ...

最新文章

  1. 顺F速运国际版,你的密码漏点了
  2. android中的Json一
  3. 微信jsapi支付获取code_微信支付(公众号支付JSAPI)
  4. 蓝桥杯java第八届第六题--最大公共子串
  5. Oracle 11g 安装后续——开发工具篇
  6. 数据可视化的利器-Seaborn简易入门
  7. 理解:TI C6000 数据存储处理与性能优化
  8. 为Tiny4412设备驱动在proc目录下添加一个可读版本信息的文件
  9. 《人生不设限》力克的生命故事
  10. 怎么写显示商品图片_虾皮商店封面图片 虾皮商店介绍怎么写吸引人
  11. Tiny Jpeg Decoder (JPEG解码程序) 源代码分析 1:解码文件头
  12. WPF几个核心类的类层次结构
  13. 辰信领创:下一代信息安全是认知安全
  14. 20200113每日一句
  15. 算法与数据结构1800题 之线性表 (一)
  16. 已解决IndentationError: unindent does not match any oute r indentation Level
  17. UART2USB芯片PL2303驱动安装说明
  18. 【软件】debussy安装过程记录
  19. 计算机科学导论【第四版】读书笔记 (一)
  20. Vite+Vue3+TypeScript

热门文章

  1. A Game with Traps—— 二分
  2. 安装office2010常见的提示错误解决办法
  3. 用户故事讲解(看最后的例子,你应该就知道怎么样写用户故事了)
  4. 编程软件有哪些比较好用
  5. HTML5+CSS3+Bootstrap开发静态页面嵌入android webview中
  6. atmega328p引脚图_Arduino UNO兼容ATmega328开发板-Seeeduino v4.0,附原理图/PCB/使用说明等...
  7. Android SDK的环境变量配置
  8. uboot移植主要思路
  9. 我的世界java启动失败_我的世界游戏启动失败怎么办 PC版游戏崩溃解决办法
  10. matlab的otdr仿真,OTDR仿真分析软件