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 相关文章推荐
Javascript实例教程(19) 使用HoTMetal(4)
Dec 23 Javascript
javascript事件问题
Sep 05 Javascript
Jquery创建一个层当鼠标移动到层上面不消失效果
Dec 12 Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
Feb 07 Javascript
javascript中使用正则计算中文长度的例子
Apr 29 Javascript
在Python中使用glob模块查找文件路径的方法
Jun 17 Javascript
jQuery实现级联下拉框实战(5)
Feb 08 Javascript
微信小程序 实现动态显示和隐藏某个控件
Apr 27 Javascript
JS实现图片预览的两种方式
Jun 27 Javascript
弱类型语言javascript中 a,b 的运算实例小结
Aug 07 Javascript
vue视频播放暂停代码
Nov 08 Javascript
layui table表格数据的新增,修改,删除,查询,双击获取行数据方式
Nov 14 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
PHP中的加密功能
2006/10/09 PHP
php strstr查找字符串中是否包含某些字符的查找函数
2010/06/03 PHP
PHP 冒泡排序算法的实现代码
2010/08/08 PHP
模板引擎正则表达式调试小技巧
2011/07/20 PHP
PHP使用file_get_content设置头信息的方法
2016/02/14 PHP
php 基础函数
2017/02/10 PHP
jQuery常见开发技巧详细整理
2013/01/02 Javascript
onbeforeunload与onunload事件异同点总结
2013/06/24 Javascript
细说javascript函数从函数的构成开始
2013/08/29 Javascript
JavaScript html5 canvas画布中删除一个块区域的方法
2016/01/26 Javascript
jQuery Ajax 加载数据时异步显示加载动画
2016/08/01 Javascript
vue 父组件中调用子组件函数的方法
2019/06/06 Javascript
angular异步验证防抖踩坑实录
2019/12/01 Javascript
微信小程序:报错(in promise) MiniProgramError
2020/10/30 Javascript
[04:38]完美世界携手游戏风云打造 卡尔工作室饰品系统篇
2013/04/25 DOTA
[07:39]第一届亚洲邀请赛回顾视频
2017/02/14 DOTA
详解Python循环作用域与闭包
2019/03/21 Python
python pandas 时间日期的处理实现
2019/07/30 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
2020/04/01 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
2020/11/24 Python
用python批量移动文件
2021/01/14 Python
html5 http的轮询和Websocket原理
2018/10/19 HTML / CSS
八项规定整改方案
2014/02/21 职场文书
学校安全教育月活动总结
2014/07/07 职场文书
见习报告格式范文
2014/11/08 职场文书
2015年基层党组织公开承诺书
2015/01/21 职场文书
幼儿园端午节活动总结
2015/05/05 职场文书
班主任经验交流心得体会
2015/11/02 职场文书
让人感觉高大上的讲话稿怎么写?
2019/07/08 职场文书
导游词之南京汤山温泉
2019/11/26 职场文书
Java循环队列与非循环队列的区别总结
2021/06/22 Java/Android
mybatis中注解与xml配置的对应关系和对比分析
2021/08/04 Java/Android
python多线程方法详解
2022/01/18 Python
详解pytorch创建tensor函数
2022/03/22 Python
Win11运行育碧游戏总是崩溃怎么办 win11玩育碧游戏出现性能崩溃的解决办法
2022/04/06 数码科技
HTML中实现音乐或视频自动播放案例详解
2022/05/30 HTML / CSS