防止基于 DOM 的 XSS

2023-10-30

防止基于 DOM 的 XSS

规则1

原则:HTML 转义,然后 JavaScript 转义,然后再将不受信任的数据插入到执行上下文中的 HTML 子上下文中
有多种方法和属性可用于在 JavaScript 中直接呈现 HTML 内容。这些方法构成了执行上下文中的 HTML 子上下文。如果这些方法提供了不受信任的输入,则可能会导致 XSS 漏洞
属性

 element.innerHTML = "<HTML> Tags and markup";
 element.outerHTML = "<HTML> Tags and markup";

方法

 document.write("<HTML> Tags and markup");
 document.writeln("<HTML> Tags and markup");

方案:
1、HTML 编码
2、JavaScript 编码
所有不受信任的输入

 var ESAPI = require('node-esapi');
 element.innerHTML = "<%=ESAPI.encoder().encodeForJS(ESAPI.encoder().encodeForHTML(untrustedData))%>";
 element.outerHTML = "<%=ESAPI.encoder().encodeForJS(ESAPI.encoder().encodeForHTML(untrustedData))%>";
 var ESAPI = require('node-esapi');
 document.write("<%=ESAPI.encoder().encodeForJS(ESAPI.encoder().encodeForHTML(untrustedData))%>");
 document.writeln("<%=ESAPI.encoder().encodeForJS(ESAPI.encoder().encodeForHTML(untrustedData))%>");

规则 2

在执行上下文中将不受信任的数据插入 HTML 属性子上下文之前进行 JavaScript 转义
的HTML属性的子上下文的内执行上下文是从标准编码规则发散。这是因为在 HTML 属性呈现上下文中对 HTML 属性编码的规则是必要的,以减轻尝试退出 HTML 属性或尝试添加可能导致 XSS 的其他属性的攻击。

规则 3

在执行上下文中将不受信任的数据插入事件处理程序和 JavaScript 代码子上下文时要小心
将动态数据放入 JavaScript 代码尤其危险,因为与其他编码相比,JavaScript 编码对 JavaScript 编码的数据具有不同的语义。在许多情况下,JavaScript 编码不会阻止执行上下文中的攻击。
例如,即使是 JavaScript 编码的字符串,也会执行 JavaScript 编码的字符串。
因此,主要建议是避免在此上下文中包含不受信任的数据。如果必须,以下示例描述了一些有效和无效的方法。
例子

var x = document.createElement("a");
x.href="#";
// In the line of code below, the encoded data on the right (the second argument to setAttribute)
// is an example of untrusted data that was properly JavaScript encoded but still executes.
x.setAttribute("onclick", "\u0061\u006c\u0065\u0072\u0074\u0028\u0032\u0032\u0029");
var y = document.createTextNode("Click To Test");
x.appendChild(y);
document.body.appendChild(x);

该setAttribute(name_string,value_string)方法很危险,因为它隐式地将value_string 强制转换为name_string的 DOM 属性数据类型。

规则 4

在执行上下文中将不受信任的数据插入 CSS 属性子上下文之前进行 JavaScript 转义

规则 5

在将不受信任的数据插入执行上下文中的 URL 属性子上下文之前,先进行 URL 转义,然后进行 JavaScript 转义

规则 6

使用安全的 JavaScript 函数或属性填充 DOM
使用不受信任的数据填充 DOM 的最基本的安全方法是使用安全分配属性textContent。
例如:这是一个安全的函数

<script>
element.textContent = untrustedData;  //does not execute code
</script>

规则 7

修复 DOM 跨站脚本漏洞
修复基于 DOM 的跨站点脚本的最佳方法是使用正确的输出方法(接收器)。例如,如果想使用用户输入来写入div tag元素,请不要使用innerHtml,而是使用innerText或textContent。这样就解决了问题,也是修复基于DOM的XSS漏洞的正确方法。

<b>Current URL:</b> <span id="contentholder"></span>
...
<script>
document.getElementById("contentholder").textContent = document.baseURI;
</script>

在 eval 等危险源中使用用户控制的输入总是一个坏主意。在 99% 的情况下,这表明编程习惯不好或懒惰,所以不要这样做,而不要尝试清理输入。

使用 JavaScript 开发安全应用程序的指南

指南 1

不可信数据应仅被视为可显示文本,避免将不受信任的数据视为 JavaScript 代码中的代码或标记。

指南 2

在构建模板化 JavaScript 时,在进入应用程序时始终 JavaScript 将不受信任的数据编码和分隔为带引号的字符串

指南 3

使用 document.createElement("…")、element.setAttribute("…",“value”)、element.appendChild(…) 和类似的方法来构建动态接口。
document.createElement("…"),element.setAttribute("…",“value”),element.appendChild(…)和类似的是安全的办法,建立动态界面。
注意,element.setAttribute仅对有限数量的属性是安全的。
危险属性包括作为命令执行上下文的任何属性,例如onclick或onblur。
安全属性的例子包括:align,alink,alt,bgcolor,border,cellpadding,cellspacing,class,color,cols,colspan,coords,dir,face,height,hspace,ismap,lang,marginheight,marginwidth,multiple,nohref,noresize,noshade,nowrap,ref,rel,rev,rows,rowspan,scrolling,shape,span,summary,tabindex,title,usemap,valign,value,vlink,vspace,width。

指南 4

避免将不受信任的数据发送到 HTML 渲染方法中
避免使用不受信任的数据填充以下方法。

element.innerHTML = "...";
element.outerHTML = "...";
document.write(...);
document.writeln(...);

指南 5

避免使用大量隐式传递给它的 eval() 数据的方法
有许多方法eval()必须避免隐式传递给它的数据。
确保传递给这些方法的任何不受信任的数据是:
1、用字符串分隔符分隔
2、包含在闭包内或根据使用情况编码为 N 级的 JavaScript
3、封装在自定义函数中。
按照 3 操作确保不受信任的数据不会发送到自定义函数中的危险方法或通过添加额外的编码层来处理它。
Utilizing an Enclosure (as suggested by Gaz)

 var ESAPI = require('node-esapi');
 setTimeout((function(param) { return function() {
          customFunction(param);
        }
 })("<%=ESAPI.encoder().encodeForJS(untrustedData)%>"), y);

N 级编码
如果您的代码如下所示,您只需要对输入数据进行双重 JavaScript 编码。

setTimeout("customFunction('<%=doubleJavaScriptEncodedData%>', y)");
function customFunction (firstName, lastName)
     alert("Hello" + firstName + " " + lastNam);
}

在doubleJavaScriptEncodedData具有的JavaScript编码的它的第一层中的单引号反转(在执行时)。
然后隐式eval的setTimeout反转了另一层 JavaScript 编码以将正确的值传递给customFunction
您只需要双倍 JavaScript 编码的原因是该customFunction函数本身并没有将输入传递给另一个隐式或显式调用的方法eval如果firstName被传递给另一个隐式或显式调用的 JavaScript 方法,eval()则<%=doubleJavaScriptEncodedData%>上面需要更改为<%=tripleJavaScriptEncodedData%>.
一个重要的实现说明是,如果 JavaScript 代码尝试在字符串比较中使用双重或三重编码数据,则根据evals()传递给 if 比较和值被 JavaScript 编码的次数。
客户端编码(使用 JavaScript 编码库,如node-esapi)为不可信数据传递到的单个子上下文。
以下是它们如何使用的一些示例:

//server-side encoding
var ESAPI = require('node-esapi');
var input = "<%=ESAPI.encoder().encodeForJS(untrustedData)%>";
//HTML encoding is happening in JavaScript
var ESAPI = require('node-esapi');
document.writeln(ESAPI.encoder().encodeForHTML(input));

指南 6

仅在表达式的右侧使用不受信任的数据
仅在表达式的右侧使用不受信任的数据,尤其是看起来像代码并且可能传递给应用程序的数据(例如,location和eval())。

指南 7

在 DOM 中进行 URL 编码时要注意字符集问题。
当 DOM 中的 URL 编码时,请注意字符集问题,因为 JavaScript DOM 中的字符集没有明确定义(Mike Samuel)。

指南 8

使用 object[x] 访问器时限制对对象属性的访问
使用访问器时限制对对象属性的object[x]访问(Mike Samuel)。换句话说,在不受信任的输入和指定的对象属性之间添加一个间接级别。
实例

var myMapType = {};
myMapType[<%=untrustedData%>] = "moreUntrustedData";

编写上述代码的开发人员试图向myMapType对象添加额外的键控元素。但是,攻击者可以使用它来破坏myMapType对象的内部和外部属性。
更好的方法:

if (untrustedData === 'location') {
  myMapType.location = "moreUntrustedData";
}

指南 10

不要使用 eval() JSON 将其转换为原生 JavaScript 对象
不要使用eval()JSON 将其转换为原生 JavaScript 对象。而是使用JSON.toJSON()和JSON.parse()(克里斯施密特)

编码误解

许多安全培训课程和论文提倡盲目使用 HTML 编码来解决 XSS。这在逻辑上似乎是谨慎的建议,因为 JavaScript 解析器不理解 HTML 编码。但是,如果从您的 Web 应用程序返回的页面使用 的内容类型text/xhtml或文件类型扩展名,*.xhtml则 HTML 编码可能无法缓解 XSS。

实例

<form name="myForm" ...>
  <input type="text" name="lName" value="<%=ESAPI.encoder().encodeForHTML(last_name)%>">
 ...
</form>
<script>
  var x = document.myForm.lName.value;  //when the value is retrieved the encoding is reversed
  document.writeln(x);  //any code passed into lName is now executable.
</script>

最容易受攻击的代码

<script>
var x = location.hash.split("#")[1];
document.write(x);
</script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

防止基于 DOM 的 XSS 的相关文章

  • 类型“void”不可分配给类型“((event:MouseEvent) => void) |不明确的'

    import as React from react import App css import PageTwo from components PageTwo export interface IPropsk data Array
  • 如何将文件透明地传输到浏览器?

    受控环境 IE8 IIS 7 ColdFusion 当从 IE 发出指向媒体文件 例如 mp3 mpeg 等 的 GET 请求时 浏览器将启动关联的应用程序 Window Media Player 我猜测 IIS 提供文件的方式允许应用程序
  • 将 onclick 事件应用于页面加载时不存在的元素

    我将列表样式设置为看起来像选择框 并且当用户单击列表中的元素时我想触发一个函数 但是该元素是通过加载的AJAX因此 当页面加载并且我无法绑定时不存在onclick事件到它onDomReady 如果我把它作为一个普通的选择列表 我可以只标记一
  • 将 window.location 传递给 Flask url_for

    我正在使用 python 在我的页面上 当匿名用户转到登录页面时 我想将一个变量传递到后端 以便它指示用户来自哪里 发送 URL 因此 当用户单击此锚链接时 a href Sign in a 我想发送用户当前所在页面的当前 URL
  • 有没有办法伪造同步 XHR 请求?

    我正在使用 Emscripten 系统将一堆 C 代码移植到 Javascript C 代码有很多调用fopen这是一个同步 IO 调用 在 Emscripten 中 我们使用对本地资源的 XHR 请求来模拟这一点however 在 Fir
  • 为什么 Array.prototype.filter() 在 Magnolia JavaScript 模型中抛出错误?

    我正在尝试过滤 FreeMarker 列表Magnolia JavaScript 模型 https documentation magnolia cms com display DOCS61 How to work with JavaScr
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • 如何使用 JavaScript 获取元素的填充值?

    我有一个textarea在我的 HTML 中 我需要获取整数或浮点形式的填充数值 以像素为单位 我如何使用 JavaScript 获取它 我没有使用 jQuery 所以我正在寻找纯 JavaScript 解决方案 这将返回padding l
  • 根据特定字符获取整个字符串或子字符串

    我有一个包含 MIME 类型的字符串 例如application json 现在我想将其与实际的 HTTP 标头进行比较 在本例中content type 如果标头包含 MIME 类型 那么就很简单 if mimeType contentT
  • Windows 上的 Nifi 命令

    在我当前的项目中 我一直在Windows操作系统上使用apache nifi 我已经提取了nifi 0 7 0 bin zip文件输入C 现在 当我跑步时 bin run nifi bat as 管理员我在命令行上看到以下消息 但无法运行
  • 将2-3-4树转换为红黑树

    我正在尝试将 2 3 4 树转换为 java 中的红黑树 但我无法弄清楚它 我将这两个基本类编写如下 以使问题简单明了 但不知道从这里到哪里去 public class TwoThreeFour
  • 弹出窗口的动态高度取决于内容,可能吗?

    是否有可能获得一个宽度始终为 400px 的弹出窗口 但根据弹出窗口中的内容动态高度 我已经看到了这个 但不知道如何将其应用到弹出窗口 调整 iframe 的宽度高度以适应其中的内容 https stackoverflow com ques
  • 如何为 Imagus 悬停缩放扩展开发自定义过滤器?

    当我读到关于悬停缩放是邪恶的 http www reddit com r YouShouldKnow comments 1wjrc8 ysk that the hover zoom extension is spyware 哎呀 有两篇文章
  • java迭代器内部是如何工作的? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个员工列表 List
  • AngularJS 在指令运行之前通过 AJAX 检索数据

    我正在使用 AngularUIuiMap http angular ui github com directives map实例化谷歌地图的指令 uiMap 指令非常适合处理硬编码数据 mapOptions and myMarkers 但是
  • KeyPressed 和 KeyTyped 混淆[重复]

    这个问题在这里已经有答案了 我搜索过之间的区别KeyPressedand KeyTyped事件 但我仍然不清楚 我发现的一件事是 Keypressed 比 KeyTyped 首先被触发 请澄清一下这些事件何时被准确触发 哪个适合用于哪个目的
  • 搜索多维数组 JavaScript

    我有一个如下所示的数组 selected products 0 r1 7up 61 Albertsons selected products 1 r3 Arrowhead 78 Arrowhead selected products 2 r
  • D3 将现有 SVG 字符串(或元素)追加(插入)到 DIV

    我到处寻找这个问题的答案 并找到了一些我认为可能有用的资源 但最终没有让我找到答案 这里有一些 外部SVG http bl ocks org mbostock 1014829 嵌入SVG https stackoverflow com qu
  • Jackson 将单个项目反序列化到列表中

    我正在尝试使用一项服务 该服务为我提供了一个带有数组字段的实体 id 23233 items name item 1 name item 2 但是 当数组包含单个项目时 将返回该项目本身 而不是包含一个元素的数组 id 43567 item
  • JQuery 删除和内存泄漏

    我正在开发一个游戏 我看到了很多内存消耗 我使用jquery animate 动画完成后 我 remove 元素 我的问题是 从 dom 树中删除一个元素后 对象还存在记忆中吗 Javascript 是一种垃圾收集语言 这意味着当没有代码保

随机推荐

  • RBF神经网络对iris鸢尾花数据集进行分类识别

    RBF神经网络对iris鸢尾花数据集进行分类 http blog csdn net fubin0000 设计要求 iris以鸢尾花的特征作为数据来源 数据集包含150个数据集 分为3类 setosa versicolor virginica
  • Qt 界面加载卡顿或刷新问题

    主要有以下几个解决方案可以去尝试下 一 设置WA Mapped属性 让界面可以及时更新 void CMainStaticsWindows showEvent QShowEvent event 这句话解决第二次打开窗口没有刷新情况 窗口一片空
  • java fx数据库,Java FX中的数据库连接最佳实践

    目前我也在使用数据库连接的JavaFX应用程序 我选择的方式如下 创建一个SQL Controller Class 这个类应该包含处理你的SQL数据的所有东西 例如 一个连接方法来打开一个连接 一个close方法也没有错 在所有控制器类中使
  • Button 点击没有反应

    原因 检查一下你是不是把button TargetGraphic目标翻转了180度 因为UGUI的射线检测默认只检测正面 解决办法 在你的button检测目标也就是 TargetGraphic目标上加个GraphicRayCaster组件
  • 关于Java环境变量配置之后在CMD中键入JavaC、Java -version无反应

    本机装的是jdk 11 安装后配置环境 在cmd中键入JavaC Java version均无反应 如下图 上网查阅多方资料 终于在知乎大佬的分享贴下解决此问题 鸣谢 步骤如下 右键点击此电脑 gt 属性 gt 高级系统设置 gt 环境配置
  • CCF-CSP201903-4-消息传递接口

    首先应当思考的是如何对输入数据进行存储 通过样例输入可以看出 每一个进程执行的操作数量都是不定的 因此可以采用 vectorg N 进行存储 其中g i 表示i号进程应执行操作 也可以采用queueq N 进行存储q i 表示i号进程应执行
  • 传感器学习——ESP8266(无线串口使用)

    ESP8266模块是一款高性能的WIFI串口模块 只要知道串口怎么编程使用 就可以实现所谓的透明传输 将usb转ttl如下连接 USB转TTL模块上有3 3V和5V两个引脚可以作为VCC 但是一般选取5V作为VCC AT指令 在使用USB转
  • Python案例分析,streamlit模块,Python制作销售数据可视化看板

    前言 Python实战案例 streamlit模块 Python制作销售数据可视化看板 让我们愉快地开始吧 开发工具 Python版本 3 6 4 相关模块 streamlit模块 Plotly模块 Pandas模块 以及一些Python自
  • 比较两个float 2010-9-15 12:01

    float 类型不能比较相等或不等 但可以比较 gt lt gt lt 用 从语法上说没错 但是本来应该相等的两个浮点数由于计算机内部表示的原因可能略有微小的误差 这时用 就会认为它们不等 应该使用两个浮点数之间的差异的绝对值小于某个可以接
  • matlab基础语法总结

    文章目录 1 界面认识 2 变量命名 3 数据类型 4 矩阵构造和四则运算 5 程序结构 6 二维平面绘图 7 三维立体绘图 8 线性规划 9 积分 1 界面认识 命令行输入clc 清除命令行窗口 命令行输入clear all 清除右侧工作
  • IDEA 中 JUnit 的使用

    文章目录 1 JUnit 是什么 2 IDEA 的 JUnit 配置 3 测试类的生成 4 测试覆盖率的查看 1 JUnit 是什么 JUnit 是一个 Java 语言的回归测试框架 regression testing framework
  • 漏洞检查win

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 漏洞 SMB Signing not required 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门技术也越来
  • linux oracle pdb安装,Linux下安装Oracle(CentOS-Oracle 12c)的方法

    第一步 网络连接 在我的上一篇博客中有介绍 不再多说 网络连接的目的 为了能使用yum命令 在网上直接下载文件 第二步 前往oracle官网下载12c database服务器端的两个文件 安装在Linux linuxamd64 12102
  • 什么是WBS?

    我们可以从一下3点来说明WBS是什么 1 定义 指组织和定义整个项目范围的可交付成果 以逻辑的形式列出必须进行的全部活动的结构 2 图示 从图中可以看出WBS图是一个自上而下逐步分解的解构 3 作用 将大系统变成具体的小工作单元 是复杂变简
  • 元宇宙群涉及到技术

    元宇宙六大核心技术包括 1 物联网技术 分为感知层 网络层 应用层 2 区块链技术 算法及时间戳技术 数据传播及验证技术 共识机制 分布式存储 智能合约 分布式账本等 3 交互技术 VR虚拟现实技术 AR虚拟现实技术 MR混合现实技术 全息
  • 387. First Unique Character in a String

    暴力解法 两个循环 hashmap 两个循环 public int solution 1 String s if s null s length 0 return 1 Map
  • Arduino监控和可视化心率脉搏

    硬件 工作原理 光学心率传感器在理论上非常容易理解 如果您曾经通过指尖照过手电筒并且看到了心跳脉冲 那么您就可以很好地掌握光学心率脉搏传感器的理论 脉搏传感器或任何光学心率传感器都可以通过在手指上发出绿光 约550nm 并使用光电传感器测量
  • C++(32)——多线程编程(互斥、同步、CAS原子操作)

    线程 线程是进程内部的一条执行序列或执行路径 一个进程可以包含多条线程 从资源分配的角度来看 进程是操作系统进行资源分配的基本单位 从资源调度的角度来看 线程是资源调度的最小单位 是程序执行的最小单位 一个进程可以并发执行多个线程 每个线程
  • Web开发人员最关注的6款HTML5代码生成器

    在这篇文章中 小编为大家收集了6款Web开发中注度最高的HTML5代码生成器 希望能帮到Web开发者 Initializr Initializr是一款HTML5模板生成器 帮助你快速启动基于HTML5模板的新项目 总之 Initializr
  • 防止基于 DOM 的 XSS

    防止基于 DOM 的 XSS 规则1 原则 HTML 转义 然后 JavaScript 转义 然后再将不受信任的数据插入到执行上下文中的 HTML 子上下文中 有多种方法和属性可用于在 JavaScript 中直接呈现 HTML 内容 这些