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动态给table添加、删除行 改进版
Jan 19 Javascript
javascript中parentNode,childNodes,children的应用详解
Dec 17 Javascript
Javascript 按位与赋值运算符 (&amp;=)使用介绍
Feb 04 Javascript
jQuery简易图片放大特效示例代码
Jun 09 Javascript
jQuery使用fadeout实现元素渐隐效果的方法
Mar 27 Javascript
深入浅出理解javaScript原型链
May 09 Javascript
移动Web中图片自适应的两种JavaScript解决方法
Jun 18 Javascript
javascript实现瀑布流动态加载图片原理
Aug 12 Javascript
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
Dec 14 Javascript
如何从零开始手写Koa2框架
Mar 22 Javascript
微信小程序实现同时上传多张图片
Feb 03 Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
Aug 04 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
PHP4与PHP5的时间格式问题
2008/02/17 PHP
php 生成随机验证码图片代码
2010/02/08 PHP
PHP使用memcache缓存技术提高响应速度的方法
2014/12/26 PHP
列举PHP的Yii 2框架的开发优势
2015/07/03 PHP
实例讲解通过​PHP创建数据库
2019/01/20 PHP
Javascript计算时间差的函数分享
2011/07/04 Javascript
javascript实现数字+字母验证码的简单实例
2014/02/10 Javascript
JavaScript通过元素索引号删除数组中对应元素的方法
2015/03/18 Javascript
jfreechart插件将数据展示成饼状图、柱状图和折线图
2015/04/13 Javascript
JS中setTimeout的巧妙用法前端函数节流
2016/03/24 Javascript
用JS实现轮播图效果(二)
2016/06/26 Javascript
详解用node.js实现简单的反向代理
2017/06/26 Javascript
Js利用console计算代码运行时间的方法示例
2017/09/24 Javascript
vue2中使用less简易教程
2018/03/27 Javascript
Vue项目中添加锁屏功能实现思路
2018/06/29 Javascript
React 项目迁移 Webpack Babel7的实现
2018/09/12 Javascript
nodejs中用npm初始化来创建package.json的实例讲解
2018/10/10 NodeJs
javascript实现文本框标签验证的实例代码
2018/10/14 Javascript
微信小程序和百度的语音识别接口详解
2019/05/06 Javascript
使用Vue调取接口,并渲染数据的示例代码
2019/10/28 Javascript
[01:32]2014DOTA2西雅图邀请赛 CIS我们有信心进入正赛
2014/07/08 DOTA
[02:54]DOTA2亚洲邀请赛 VG战队出场宣传片
2015/02/07 DOTA
[01:28]国服启动器接入蒸汽平台操作流程视频
2021/03/11 DOTA
详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击
2018/10/09 Python
Python基本socket通信控制操作示例
2019/01/30 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
2019/08/05 Python
深入了解python中元类的相关知识
2019/08/29 Python
降低python版本的操作方法
2020/09/11 Python
关于前端上传文件全面基础扫盲贴(入门)
2019/08/01 HTML / CSS
享誉全球的多元化时尚精品购物平台:Farfetch发发奇(支持中文)
2017/08/08 全球购物
《月迹》教学反思
2014/02/19 职场文书
中队活动总结
2014/08/27 职场文书
讲文明知礼仪演讲稿
2014/09/13 职场文书
软件研发工程师岗位职责
2014/09/30 职场文书
幼儿园圣诞节活动总结
2015/05/06 职场文书
2015年安全生产月工作总结
2015/07/27 职场文书