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算法学习(直接插入排序)
Apr 12 Javascript
jquery调用wcf并展示出数据的方法
Jul 07 Javascript
封装html的select标签的js操作实例
Jul 02 Javascript
浅谈javascript的分号的使用
May 12 Javascript
jQuery+PHP星级评分实现方法
Oct 02 Javascript
jQuery实现花式轮播之圣诞节礼物传送效果
Dec 25 Javascript
bootstrapValidator.min.js表单验证插件
Feb 09 Javascript
详解angular用$sce服务来过滤HTML标签
Apr 11 Javascript
bootstrap table方法之expandRow-collapseRow展开或关闭当前行数据
Aug 09 Javascript
babel7.x和webpack4.x配置vue项目的方法步骤
May 12 Javascript
微信小程序实现form表单本地储存数据
Jun 27 Javascript
easyUI使用分页过滤器对数据进行分页操作实例分析
Jun 01 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/09/05 PHP
PHP 编写的 25个游戏脚本
2009/05/11 PHP
微信扫描二维码登录网站代码示例
2013/12/30 PHP
windows平台中配置nginx+php环境
2015/12/06 PHP
PHP实现文件上传与下载实例与总结
2016/03/13 PHP
php的常量和变量实例详解
2017/06/27 PHP
鼠标事件延时切换插件
2011/03/12 Javascript
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
2011/04/01 Javascript
javascript时间自动刷新实现原理与步骤
2013/01/06 Javascript
jQuery拖动div、移动div、弹出层实现原理及示例
2014/04/08 Javascript
jquery实现预览提交的表单代码分享
2014/05/21 Javascript
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
2014/11/20 NodeJs
jQuery的几个我们必须了解的特点
2015/05/03 Javascript
仿iframe效果Aajx文件上传实例
2016/11/18 Javascript
bootstrap IE8 兼容性处理
2017/03/22 Javascript
vue loadmore 组件滑动加载更多源码解析
2017/07/19 Javascript
Vue.js中的图片引用路径的方式
2017/07/28 Javascript
jQuery实现腾讯信用界面(自制刻度尺)样式
2017/08/15 jQuery
JS实现点击按钮随机生成可拖动的不同颜色块示例
2019/01/30 Javascript
Seajs源码详解分析
2019/04/02 Javascript
微信小程序Echarts图表组件使用方法详解
2019/06/25 Javascript
react 移动端实现列表左滑删除的示例代码
2019/07/04 Javascript
微信小程序实现音乐播放器
2019/11/20 Javascript
vue实现短信验证码登录功能(流程详解)
2019/12/10 Javascript
python的文件操作方法汇总
2017/11/10 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
2017/12/09 Python
python内置模块collections知识点总结
2019/12/19 Python
使用Django实现把两个模型类的数据聚合在一起
2020/03/28 Python
Python中如何添加自定义模块
2020/06/09 Python
Python matplotlib 绘制双Y轴曲线图的示例代码
2020/06/12 Python
scrapy redis配置文件setting参数详解
2020/11/18 Python
交通事故私了协议书
2014/04/16 职场文书
2015年技术工作总结范文
2015/04/20 职场文书
就业指导讲座心得体会
2016/01/15 职场文书
MySQL REVOKE实现删除用户权限
2021/06/18 MySQL
nginx配置之并发频次限制
2022/04/18 Servers