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中String类的replace函数
Sep 22 Javascript
JQuery操作tr和td内容的方法实例
Mar 06 Javascript
js验证是否为数字的总结
Apr 14 Javascript
使用js判断TextBox控件值改变然后出发事件
Mar 07 Javascript
javascript图片切换综合实例(循环切换、顺序切换)
Jan 13 Javascript
JavaScript:Date类型全面解析
May 19 Javascript
详解.vue文件中监听input输入事件(oninput)
Sep 19 Javascript
详解RequireJs官方使用教程
Oct 31 Javascript
JavaScript实现AOP详解(面向切面编程,装饰者模式)
Dec 19 Javascript
element-ui多文件上传的实现示例
Apr 10 Javascript
vue下使用nginx刷新页面404的问题解决
Aug 02 Javascript
js实现列表向上无限滚动
Jan 13 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采用file_get_contents代替使用curl实例
2014/11/07 PHP
PHP面向对象程序设计继承用法简单示例
2018/12/28 PHP
thinkphp3.2同时连接两个数据库的简单方法
2019/08/13 PHP
基于Jquery与WebMethod投票功能实现代码
2011/01/19 Javascript
浅析JavaScript中的同名标识符优先级
2013/12/06 Javascript
javascript中apply和call方法的作用及区别说明
2014/02/14 Javascript
jQuery插件Zclip实现完美兼容个浏览器点击复制内容到剪贴板
2015/04/30 Javascript
JS随机洗牌算法之数组随机排序
2016/03/23 Javascript
jQuery表格插件datatables用法汇总
2016/03/29 Javascript
浅析jquery unbind()方法移除元素绑定的事件
2016/05/24 Javascript
js 获取范围内的随机数实例代码
2016/08/02 Javascript
jQuery EasyUI datagrid在翻页以后仍能记录被选中行的实现代码
2016/08/15 Javascript
Bootstrap Navbar Component实现响应式导航
2016/10/08 Javascript
微信小程序 定位到当前城市实现实例代码
2017/02/23 Javascript
JS中使用正则表达式g模式和非g模式的区别
2017/04/01 Javascript
Vue使用Proxy监听所有接口状态的方法实现
2019/06/07 Javascript
详解JSON.stringify()的5个秘密特性
2020/05/26 Javascript
openlayers实现地图测距测面
2020/09/25 Javascript
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
2018/02/03 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
2019/08/10 Python
python中threading开启关闭线程操作
2020/05/02 Python
Python hashlib和hmac模块使用方法解析
2020/12/08 Python
python性能测试工具locust的使用
2020/12/28 Python
python绕过图片滑动验证码实现爬取PTA所有题目功能 附源码
2021/01/06 Python
2021年值得向Python开发者推荐的VS Code扩展插件
2021/01/25 Python
北美个性化礼品商店:Things Remembered
2018/06/12 全球购物
Pretty You London官网:英国拖鞋和睡衣品牌
2019/05/08 全球购物
个人找工作求职简历的自我评价
2013/10/20 职场文书
日语专业个人求职信范文
2014/02/02 职场文书
群众路线教育实践活动学习笔记内容
2014/11/06 职场文书
夫妻忠诚协议书范本
2014/11/17 职场文书
高校教师个人工作总结2014
2014/12/17 职场文书
考试作弊检讨书范文
2015/01/27 职场文书
会计求职信怎么写
2015/03/20 职场文书
2019朋友新婚祝福语精选
2019/10/10 职场文书
SpringBoot生成License的实现示例
2021/06/16 Java/Android