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 相关文章推荐
jQuery.extend 函数详解
Feb 03 Javascript
Jquery submit()无法提交问题
Apr 21 Javascript
Jquery封装tab自动切换效果的具体实现
Jul 13 Javascript
封装的jquery翻页滚动(示例代码)
Nov 18 Javascript
Jquery下EasyUI组件中的DataGrid结果集清空方法
Jan 06 Javascript
javascript中Number的方法小结
Nov 21 Javascript
浅谈js中同名函数和同名变量的执行问题
Feb 12 Javascript
Javascript操作dom对象之select全面解析
Apr 24 Javascript
详解webpack require.ensure与require AMD的区别
Dec 13 Javascript
前端面试知识点目录一览
Apr 15 Javascript
koa-router路由参数和前端路由的结合详解
May 19 Javascript
适用于 Vue 的播放器组件Vue-Video-Player操作
Nov 16 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合并两个数组的两种方式的异同
2012/09/14 PHP
浅谈php函数serialize()与unserialize()的使用方法
2014/08/19 PHP
jQuery 剧场版 你必须知道的javascript
2009/05/27 Javascript
精心挑选的15个jQuery下拉菜单制作教程
2012/06/15 Javascript
js获得地址栏?问号后参数的方法
2013/08/08 Javascript
Jquery easyui 下loaing效果示例代码
2013/08/12 Javascript
jQuery表格插件ParamQuery简单使用方法示例
2013/12/05 Javascript
Jquery如何实现点击时高亮显示代码
2014/01/22 Javascript
jQuery取消ajax请求的方法
2015/06/09 Javascript
Jquery简单实现GridView行高亮的方法
2015/06/15 Javascript
基于Javascript实现返回顶部按钮
2016/02/29 Javascript
Bootstrap+jfinal退出系统弹出确认框的实现方法
2016/05/30 Javascript
AngularJS HTML DOM详解及示例代码
2016/08/17 Javascript
NodeJs 实现简单WebSocket即时通讯的示例代码
2019/08/05 NodeJs
Vue.js下拉菜单组件使用方法详解
2019/10/19 Javascript
java遇到微信小程序 &quot;支付验证签名失败&quot; 问题解决
2019/12/22 Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
2020/04/17 Javascript
通过实例了解JS执行上下文运行原理
2020/06/17 Javascript
Vue3 响应式侦听与计算的实现
2020/11/11 Javascript
[01:27]2014DOTA2展望TI 剑指西雅图IG战队专访
2014/06/30 DOTA
python定时利用QQ邮件发送天气预报的实例
2017/11/17 Python
python实现识别手写数字 python图像识别算法
2020/03/23 Python
PyQt5笔记之弹出窗口大全
2019/06/20 Python
Python将string转换到float的实例方法
2019/07/29 Python
详解CSS3开启硬件加速的使用和坑
2017/08/21 HTML / CSS
详解css3中dispaly的Grid布局与Flex布局
2020/09/11 HTML / CSS
HTML5 Canvas draw方法制作动画效果示例
2013/07/11 HTML / CSS
SkinCeuticals官网:美国药妆品牌
2018/04/19 全球购物
高中毕业自我鉴定
2013/12/13 职场文书
战略合作协议书范本
2014/04/18 职场文书
心得体会的写法
2014/09/05 职场文书
中学生自我评价范文
2015/03/03 职场文书
死者家属慰问信
2015/03/24 职场文书
酒店财务经理岗位职责
2015/04/08 职场文书
原生JavaScript实现简单五子棋游戏
2021/06/28 Javascript
手写实现JS中的new
2021/11/07 Javascript