JavaScript DOM 内容操作常用方法和 XSS 注入攻击
myzbx 2025-07-02 23:15 11 浏览
当项目的安全团队找上门告诉您,您开发的项目存在 XSS 安全漏洞,作为一个开发人员,就问您慌不慌??
HTML 内容写入的时候,如果稍不注意就会触发隐藏 BOSS 漏洞 XSS。
XSS 漏洞原理就是利用了网站上内容输入的地方,比如说常见的评论提交,老六 通过输入评论的地方,提交一些 包含 JS 代码的内容 到服务器,服务器没做任何操作直接写入到数据库,最后在评论查询的时候直接将数据库的内容原样返给前端,而前端拿到此内容的时候,也不做任何处理,直接将内容以 HTML 的形式渲染的页面中,这时候 老六 输入的非法内容就会被当做 JS 代码执行,这就是典型的 XSS 注入攻击。
要避免 XSS 漏洞,就需要对不可信的内容进行过滤;或者不要把这部分内容当做 HTML 处理,直接当做文本渲染也可以避免 XSS 注入。
DOM 属性操作
在了解 DOM 内容操作之前,先学习几个常用的 DOM 属性操作方法,毕竟 JS 与 CSS 联动一般都是通过 DOM 属性进行关联。
比如 JS 控制 class 属性的变化,再在 CSS 中编写不同的 class 样式,就可以让 HTML 元素渲染成不同的样子。
// 获取 DOM 属性值
element.getAttribute(name)
// 设置 DOM 属性值,已存在的属性值会被修改
element.setAttribute(name, value)
// 删除 DOM 属性
element.removeAttribute(name)
// 操作 class 方法
element.classList.add(c1, c2, c3, ...) // 添加
element.classList.remove(c1, c2, c3, ...) // 删除
// force 使用布尔值将强制只允许删除或者只允许修改
element.classList.toggle(className, force) // 如果存在则删除,不存在则添加
element.classList.contains(className) // 判断是否存在
// 其他常用属性
element.id // 设置 id
element.className // 设置 class
element.style // 直接设置样式
// 特定标签属性
img.src // 设置图片地址
通过 className 可直接设置元素的 class 属性,这儿有一个问题,为什么不是直接使用 class 设置呢?
原因是:class 是 JS 中的关键字,为避免引起一些语法问题,所以就换了一个名字 className。
通过 className 控制类名的增删改虽然也不是不能做,但是始终有那么一点点麻烦,所以后来就引入了 classList 用来专门控制 class 属性。
而 Attribute 相关的几个方法,则是可以用来控制元素的所有属性,包括自定义属性和一些默认的属性 id、style、className 等。所以记住 Attribute 几个方法就已经可以打穿 DOM 属性操作了。
示例:
<style>
.red {
color: red;
}
.blue {
color: blue;
}
[data-type="bold"] {
font-weight: bold;
}
[data-type="italic"] {
font-style: italic;
}
</style>
<div id="test">哈哈哈哈哈</div>
<img id="img">
<script>
const test = document.getElementById('test');
const img = document.getElementById('img');
// 设置属性
test.setAttribute('data-type', 'bold')
// 获取属性值
const type = test.getAttribute('data-type')
console.log(' ~ type:', type);
// 移除属性
test.removeAttribute('data-type')
// 添加新的属性
test.setAttribute('data-type', 'italic')
// 判断是否存在Class
const hasRed = test.classList.contains('red')
console.log(' ~ hasRed:', hasRed);
// 添加Class
test.classList.add('red')
// 移除Class
test.classList.remove('red')
// 如果不存在则添加 blue,存在 blue 则移除
test.classList.toggle('blue')
// 给图片设置地址
img.src = 'https://developer.mozilla.org/static/media/firefox.1eabb4da07c095ca04fa.svg'
// 获取图片地址
console.log(' ~ img.src:', img.src);
// 换个 ID 属性
img.id = 'img-1'
// 获取 ID 属性
console.log(' ~ img.id:', img.id);
// 设置图片的 class
img.className = 'img-1'
// 获取图片的 class
console.log(' ~ img.className:', img.className);
// 设置图片边框
img.style.border = '1px solid red'
img.style.borderWidth = '4px'
img.style['border-color'] = 'blue'
// 设置图片宽度
img.style.width = '100px'
// 获取图片的样式
console.log(' ~ img.style:', img.style['border-width']);
</script>
在使用 style 属性设置样式的时候,如果使用的是 . 语法赋值,那么必须要改为 小驼峰命名,原因是 JS 中的 . 语法不支持短横线,比如 borderWidth,不能使用 border-width。
在使用数组取值语法的时候,可以直接使用 css 的属性赋值,比如 img.style['border-color'] = 'blue'。
DOM 内容操作
DOM 属性操作一般不会触发安全问题, XSS 注入都是发生在 DOM 内容操作的时候,所以在使用 JS 进行 DOM 内容操作时需特别小心。
常用的两个个方法:
// 设置 DOM HTML 内容
element.innerHTML = htmlString;
// 设置 DOM 文本内容
element.textContent = textString;
实例:
<div id="test1">哈哈哈哈哈</div>
<div id="test2">哈哈哈哈哈</div>
<script>
const test1 = document.getElementById('test1');
const test2 = document.getElementById('test2');
// 写入 HTML 内容
test1.innerHTML = '<strong>警告</strong>:用户输入内容';
// 写入文本内容
test2.textContent = '<strong>安全文本</strong>'; // 直接显示文本,不解析 HTML
// 区别对比
console.log(test2.innerHTML); // 输出: <strong>安全文本</strong>
console.log(test2.textContent); // 输出: <strong>安全文本</strong>
</script>
运行结果:
XSS 注入
在使用 innerHTML 设置 HTML 内容时,如果用户输入的内容中包含 JS 脚本,那么就会导致 XSS 注入。
比如这样:
<div id="test1">哈哈哈哈哈</div>
<div id="test2">哈哈哈哈哈</div>
<script>
const test1 = document.getElementById('test1');
const h1 = `<script>alert("XSS");<\/script>`;
// 直接插入 script 标签被浏览器拦截了,不会引发 XSS 注入
test1.innerHTML = h1;
const test2 = document.getElementById('test2');
// 但可以换一种变体,使用 img 标签也可以做到 XSS 注入
const h2 = `<img src=x onerror="alert('XSS')">`;
test2.innerHTML = h2;
</script>
HTML5 规范规定:通过 innerHTML 动态插入的 <script> 标签不会执行其中的 JavaScript 代码。
这是浏览器的一种安全机制,目的是防止开发者无意或恶意插入可执行脚本。
XSS 注入可能导致的问题:非法用户直接在网站中运行 JS 代码,可以获取用户信息,从而伪造一些请求,达到非法目的。
相关推荐
- 重庆机场T3B航站楼正式启用!乘机全流程,看这篇就够了→
-
4月9日重庆江北国际机场T3B航站楼正式投用T3B全景图。怎样办理值机?哪些旅客需要在T3B登机?如何到达T3B?小布丁为你梳理乘机全流程快来看↓↓↓在哪儿值机?依然在T3A航站楼L4层和B1层可以值...
- 为什么猫咪会对着空气踩奶?_猫咪对着空气乱叫
-
你见过你家猫咪前爪有节奏的揉踏吗?按摩揉捏,一开一合。这个动作俗称”踩奶“...图自:猫研所@疯车车摆拍那你又是否见过,你家猫咪对着空气一顿“猛踩”?TA们可能眼神迷离,但动作却无比专注...图自:油...
- Blender 入门教程(三):骨骼绑定_blender骨架绑定
-
一、前言不知道大家有没有玩过一些单机游戏的Mod,比如《侠盗猎车》里主角变成奥特曼,各种新能源汽车乱入等等。这些都是别人对原有模型就行修改换皮,并重新绑定骨骼完成的,所以如果会了骨骼绑定后,你也就可...
- 新手做公众号,20个常见问题汇总_做公众号的问题
-
新手运营公众号常遇诸多困惑,从账号注册、流量获取到内容创作、变现等方面均有挑战,明确平台规则、聚焦内容价值、持续优化运营策略,是突破困境的关键。你好,我是成哥,专注公众号运营和AI写作,希望每一次的分...
- Vue 3 运行机制_vue程序运行过程
-
当你写下<div>{{msg}}</div>,浏览器最终看到的却是一连串精确到像素的绘制指令。Vue3在这条链路里扮演了「翻译官+调度者」的双重角色:把声明式模板...
- 如何给网站添加 https_如何给网站添加图片
-
一、简介相信大家都知道https是更加安全的,特别是一些网站,有https的网站更能够让用户信任访问接下来以我的个人网站五岁小孩为例子,带大家一起从0到1配置网站https本次配置的...
- 前端高效开发必备的 JS 库梳理_前端函数库
-
来源:前端大全之前有很多人问学好前端需要学习哪些js库,主流框架应该学vue还是react?针对这些问题,笔者来说说自己的看法和学习总结.首先我觉得在学习任何知识之前必须要有一个明...
- 微信小程序双向数据绑定,父子传参
-
双向数据绑定微信小程序本身并不直接支持像Vue或Angular这样的框架中的双向数据绑定。但是可以通过一些技巧来模拟实现双向数据绑定的效果。使用input组件的bindinput事件:当输入框...
- Linux下C++程序符号延迟绑定_linux c 延时
-
动态库使用方式分为:隐式链接(隐式加载),编译时通过编译选项指定动态库显式链接(显式加载),通过代码调用dlopen、dlsym、dlclose指定动态库动态库的符号解析分为:立即绑定延迟绑定使用方法...
- 50 道高频 JavaScript 面试题,从基础到进阶 (附答案)
-
在前端面试中,JavaScript一直是重中之重。它不仅是一门脚本语言,更是现代Web开发的核心技术。无论是页面交互、异步处理,还是框架与库的运行机制,几乎都离不开对JavaScript的深...
- 前端必学——函数式编程(一)_前端函数库
-
重要性函数式编程(FP),不是一个新的概念,它几乎贯穿了整个编程史。直到最近几年,函数式编程才成为整个开发界的主流观念。函数式编程有完善且清晰的原则,一旦我们知道这些原则,我们将能更加快速地读懂代码,...
- Rust + wasm 简单游戏尝试_rust ?
-
1.创建一个Rust+WASM项目新建一个项目:cargonewwasm-game--libcdwasm-game编辑Cargo.toml,加上依赖:[package]nam...
- python入门到脱坑函数—定义函数_如何定义函数python
-
Python函数定义:从入门到精通一、函数的基本概念函数是组织好的、可重复使用的代码块,用于执行特定任务。在Python中,函数可以提高代码的模块性和重复利用率。二、定义函数的基本语法def函数名(...
- js基础篇之——JavaScript的柯里化函数详解
-
柯里化,或者说部分应用,是一种函数式编程的技术,对于熟悉以传统方式编写JavaScript代码的人来说可能会很费解。但如果使用得当,它可以使你的JavaScript函数更具可读性。更具可读性和...
- 转载--HART 475手操器调试EJA变送器步骤
-
来源:热控圈HART475手操器进行变送器调试一、准备工具1.475手操器2.变送器3.DC24V供电电源,4.250欧电阻。二、用24V电源与变送器供电连接后并串行电阻后。把手操器的两个挂勾,...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)
- JS Loop For (32)