jQuery使用中可能被XSS攻击的一些危险环节提醒


Posted in Javascript onMay 24, 2016

$
我们经常使用向 $ 内传入一个字符串的方式来选择或生成 DOM 元素,但如果这个字符串是来自用户输入的话,那么这种方式就是有风险的。

先看一个 DEMO:http://jsbin.com/duwuzonife/1/edit?html,js,output

$("<img src='' onerror='alert();'>");

当用户输入的字符串是像这样的时,虽然这个 <img> 元素不会马上被插入到网页的 DOM 中,但这个 DOM 元素已经被创建了,并且暂存在内存里。而对于 <img> 元素,只要设置了它的 src 属性,浏览器就会马上请求 src 属性所指向的资源。我们也可以利用这个特性做图片的预加载。在上面的示例代码中,创建元素的同时,也设置了它的属性,包括 src 属性和 onerror 事件监听器,所以浏览器会马上请求图片资源,显然请求不到,随机触发 onerror 的回调函数,也就执行了 JavaScript 代码。

推荐阅读 $ 的官方文档:http://api.jquery.com/jQuery/

类似的其他方法

.after()
.append()
.appendTo()
.before()
.html()
.insertAfter()
.insertBefore()
.prepend()
.prependTo()
.replaceAll()
.replaceWith()
.unwrap()
.wrap()
.wrapAll()
.wrapInner()
.prepend()

以上这些方法不仅创建 DOM 元素,并且会马上插入到页面的 DOM 树中。如果使用 <script> 标签插入了内联 JS 会立即执行。

不安全的输入来源

document.URL *
document.location.pathname *
document.location.href *
document.location.search *
document.location.hash
document.referrer *
window.name
document.cookie

document 的大多数属性都可以通过全局的 window 对象访问到。加 * 的属性返回的时编码 (urlencode) 后的字符串,需要解码才可能造成威胁。

不安全的操作
把可以被用户编辑的字符串,用在以下场景中,都是有隐患的。总体来说,任何把字符串作为可执行的代码的操作,都是不安全的。

1.通过字符串创建函数

(1)eval
(2)new Function
(3)setTimeout/setInterval
2.跳转页面

location.replace/location.assign
修改 <script> 标签的 src 属性
修改事件监听器
总结
如果发生在用 jQuery 时被 DOM-XSS 攻击的情况,大多是因为忽视了两个东西:
1. 在给$传参数时,对参数来源的把控。
2. 用户的输入途径不只有表单,还有地址栏,还可以通过开发者工具直接修改 DOM ,或者直接在控制台执行 JS 代码。

Javascript 相关文章推荐
代码生成器 document.write()
Apr 15 Javascript
基于jQuery判断两个元素是否有重叠部分的代码
Jul 25 Javascript
纯css实现窗户玻璃雨滴逼真效果
Aug 23 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
Nov 25 Javascript
JavaScript+CSS无限极分类效果完整实现方法
Dec 22 Javascript
javascript基础语法学习笔记
Jan 04 Javascript
EditPlus 正则表达式 实战(3)
Dec 15 Javascript
微信小程序 同步请求授权的详解
Aug 04 Javascript
详解Vue路由钩子及应用场景(小结)
Nov 07 Javascript
基于vue v-for 循环复选框-默认勾选第一个的实现方法
Mar 03 Javascript
微信小程序实现日历效果
Dec 28 Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
Apr 25 Javascript
详解Node.js模块间共享数据库连接的方法
May 24 #Javascript
轻松掌握jQuery中wrap()与unwrap()函数的用法
May 24 #Javascript
使用jQuery中的wrap()函数操作HTML元素的教程
May 24 #Javascript
实例解析jQuery中proxy()函数的用法
May 24 #Javascript
jQuery前端开发35个小技巧
May 24 #Javascript
JS+Canvas绘制时钟效果
Aug 20 #Javascript
基于JQuery实现图片上传预览与删除操作
May 24 #Javascript
You might like
一个图形显示IP的PHP程序代码
2007/10/19 PHP
ThinkPHP3.1新特性之内容解析输出详解
2014/06/19 PHP
详解WordPress中用于合成数组的wp_parse_args()函数
2015/12/18 PHP
php发送http请求的常用方法分析
2016/11/08 PHP
Jquery阻止事件冒泡 event.stopPropagation
2011/12/11 Javascript
jQuery中get()方法用法实例
2014/12/27 Javascript
JavaScript与java语言有什么不同
2016/09/22 Javascript
微信小程序 获取微信OpenId详解及实例代码
2016/10/31 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
2016/12/14 Javascript
javascript 使用正则test( )第一次是 true,第二次是false
2017/02/22 Javascript
Javascript中this关键字指向问题的测试与详解
2017/08/11 Javascript
Vue实现动态创建和删除数据的方法
2018/03/17 Javascript
node.js事件轮询机制原理知识点
2019/12/22 Javascript
[01:00:14]DOTA2官方TI8总决赛纪录片 真视界True Sight
2019/01/16 DOTA
Python实现监控程序执行时间并将其写入日志的方法
2015/06/30 Python
windows10系统中安装python3.x+scrapy教程
2016/11/08 Python
python中正则的使用指南
2016/12/04 Python
Python实现Youku视频批量下载功能
2017/03/14 Python
Python中int()函数的用法浅析
2017/10/17 Python
python 读入多行数据的实例
2018/04/19 Python
python将字符串转换成json的方法小结
2019/07/09 Python
使用python爬取抖音视频列表信息
2019/07/15 Python
python搜索包的路径的实现方法
2019/07/19 Python
简单瞅瞅Python vars()内置函数的实现
2019/09/27 Python
基于Keras的格式化输出Loss实现方式
2020/06/17 Python
keras实现VGG16方式(预测一张图片)
2020/07/07 Python
HTML+CSS3模拟心的跳动实例代码
2017/09/05 HTML / CSS
PHP笔试题
2012/02/22 面试题
学生党员一帮一活动总结
2014/07/08 职场文书
教师个人查摆剖析材料
2014/10/14 职场文书
小学运动会加油词
2015/07/18 职场文书
开工典礼致辞
2015/07/29 职场文书
感恩教师节主题班会
2015/08/12 职场文书
廉政党课工作报告案例
2019/06/21 职场文书
【海涛dota】偶遇拉娜娅 质量局德鲁伊第一视角解说
2022/04/01 DOTA
redis 解决库存并发问题实现数量控制
2022/04/08 Redis