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 相关文章推荐
模拟一个类似百度google的模糊搜索下拉列表
Apr 15 Javascript
iframe子页面与父页面在同域或不同域下的js通信
May 07 Javascript
深入浅析JavaScript字符串操作方法 slice、substr、substring及其IE兼容性
Dec 16 Javascript
提升jQuery的性能需要做好七件事
Jan 11 Javascript
详解JavaScript中的自定义事件编写
May 10 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
Aug 15 Javascript
使用nvm管理不同版本的node与npm的方法
Oct 31 Javascript
vue中echarts3.0自适应的方法
Feb 26 Javascript
Vue开发Html5微信公众号的步骤
Apr 11 Javascript
用Vue编写抽象组件的方法
May 06 Javascript
vue中组件通信的八种方式(值得收藏!)
Aug 09 Javascript
js实现前端界面导航栏下拉列表
Aug 27 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
第十四节--命名空间
2006/11/16 PHP
php 操作符与控制结构
2012/03/07 PHP
php获取数组长度的方法(有实例)
2013/10/27 PHP
is_uploaded_file函数引发的不能上传文件问题
2013/10/29 PHP
PHP实现的多彩标签效果代码分享
2014/08/21 PHP
Symfony模板的快捷变量用法实例
2016/03/17 PHP
基于Jquery的简单图片切换效果
2011/01/06 Javascript
基于jQuery替换table中的内容并显示进度条的代码
2011/08/02 Javascript
两种方法实现文本框输入内容提示消失
2013/03/17 Javascript
jquery异步跨域访问代码
2013/06/28 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
2015/08/11 Javascript
JS实现网站菜单拖拽移位效果的方法
2015/09/24 Javascript
用JS写的一个Ajax库(实例代码)
2016/08/06 Javascript
JavaScript中关于for循环删除数组元素内容时出现的问题
2016/11/21 Javascript
JS实现页面跳转参数不丢失的方法
2016/11/28 Javascript
微信小程序开发之视频播放器 Video 弹幕 弹幕颜色自定义实例
2016/12/08 Javascript
assert()函数用法总结(推荐)
2017/01/25 Javascript
基于jQuery和CSS3实现APPLE TV海报视差效果
2017/06/16 jQuery
Vue手把手教你撸一个 beforeEnter 钩子函数
2018/04/24 Javascript
Vue + better-scroll 实现移动端字母索引导航功能
2018/05/07 Javascript
微信小程序实现日历效果
2018/12/28 Javascript
为nuxt项目写一个面包屑cli工具实现自动生成页面与面包屑配置
2019/09/29 Javascript
Vue + Element-ui的下拉框el-select获取额外参数详解
2020/08/14 Javascript
[02:43]DOTA2英雄基础教程 圣堂刺客
2013/12/09 DOTA
python检测空间储存剩余大小和指定文件夹内存占用的实例
2018/06/11 Python
Python函数中参数是传递值还是引用详解
2019/07/02 Python
python读取Kafka实例
2019/12/23 Python
德国高性价比网上药店:medpex
2017/07/09 全球购物
TIME时代杂志台湾总代理:台时亚洲
2018/10/22 全球购物
小学生暑假感言
2014/02/06 职场文书
小学生家长评语大全
2014/02/10 职场文书
法人授权委托书格式
2014/04/08 职场文书
护林员个人总结
2015/03/04 职场文书
2015年暑期见闻
2015/07/14 职场文书
2019年学校消防安全责任书(2篇)
2019/10/09 职场文书
Java由浅入深通关抽象类与接口(上篇)
2022/04/26 Java/Android