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 相关文章推荐
js中访问html中iframe的文档对象的代码[IE6,IE7,IE8,FF]
Jan 08 Javascript
jQuery参数列表集合
Apr 06 Javascript
javascript之querySelector和querySelectorAll使用说明
Oct 09 Javascript
Javascript Web Slider 焦点图示例源码
Oct 10 Javascript
JavaScript字符串对象substr方法入门实例(用于截取字符串)
Oct 16 Javascript
jquery实现表单验证并阻止非法提交
Jul 09 Javascript
jquery动感漂浮导航菜单代码分享
Apr 15 Javascript
jQuery基于ajax()使用serialize()提交form数据的方法
Dec 08 Javascript
实例讲解DataTables固定表格宽度(设置横向滚动条)
Jul 11 Javascript
Angular5.1新功能分享
Dec 21 Javascript
JS关于刷新页面的相关总结
May 09 Javascript
vue通过style或者class改变样式的实例代码
Oct 30 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递归算法的详细示例分析
2013/02/19 PHP
php实现的美国50个州选择列表实例
2015/04/20 PHP
php 反斜杠处理函数addslashes()和stripslashes()实例详解
2016/12/25 PHP
PHP关于foreach复制知识点总结
2019/01/28 PHP
JavaScript 函数调用规则
2009/09/14 Javascript
JS模拟的QQ面板上的多级可展开的菜单
2009/10/10 Javascript
jQuery UI-Draggable 参数集合
2010/01/10 Javascript
js 中{},[]中括号,大括号使用详解
2011/05/12 Javascript
js split 的用法和定义 js split分割字符串成数组的实例代码
2012/05/13 Javascript
分享十五款 jQuery 社交网络分享插件
2015/05/16 Javascript
jQuery实现获取table表格第一列值的方法
2016/03/01 Javascript
详解MVC如何使用开源分页插件(shenniu.pager.js)
2016/12/16 Javascript
详解VueJs前后端分离跨域问题
2017/05/24 Javascript
js注册时输入合法性验证方法
2017/10/21 Javascript
微信小程序自定义tab实现多层tab嵌套功能
2018/06/15 Javascript
解析vue data不可以使用箭头函数问题
2018/07/03 Javascript
详解vue2.0监听属性的使用心得及搭配计算属性的使用
2018/07/18 Javascript
webpack是如何实现模块化加载的方法
2019/11/06 Javascript
webpack常用配置总览(小结)
2019/11/18 Javascript
vue 路由缓存 路由嵌套 路由守卫 监听物理返回操作
2020/08/06 Javascript
Python使用django获取用户IP地址的方法
2015/05/11 Python
举例讲解Python设计模式编程中的访问者与观察者模式
2016/01/26 Python
Python中 传递值 和 传递引用 的区别解析
2018/02/22 Python
uwsgi+nginx部署Django项目操作示例
2018/12/04 Python
python 公共方法汇总解析
2019/09/16 Python
python3 求约数的实例
2019/12/05 Python
通过案例解析python鸭子类型相关原理
2020/10/10 Python
HTML5 video 视频标签使用介绍
2014/02/03 HTML / CSS
高三地理教学反思
2014/01/11 职场文书
《尊严》教学反思
2014/02/11 职场文书
《美丽的公鸡》教学反思
2014/02/25 职场文书
信访工作汇报材料
2014/10/27 职场文书
反邪教观后感
2015/06/11 职场文书
导游词之张家界
2019/10/31 职场文书
Pytorch中TensorBoard及torchsummary的使用详解
2021/05/12 Python
SpringCloud超详细讲解Feign声明式服务调用
2022/06/21 Java/Android