关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置


Posted in Javascript onApril 17, 2013

IE下的DHTML有各种MS$的私有特征,已经是众所周知。其中有个比较有趣就是:event.screenX和event.screenY,可以获得系统级别的鼠标位置坐标。

咋一听,其实也觉得没什么。屏幕上的坐标无非就是:浏览器客户区域里的坐标 + 浏览器窗口坐标 + 客户区偏移,仅此而已。

IE本身就可以通过event和screen对象得到各种屏幕和窗体位置有关的信息。

然而,真正诡异的事还没开始!按照标准的DOM模型定义,只有在触发某个事件的时候,才能从event中获得与该事件相关的参数。

也就是说,只有触发mousemove,等这类mouseXXX鼠标事件时,才有权获取和鼠标有关的参数。然而,在万恶的IE下,任何事件触发后,都能获取event.screenX和event.screenY,甚至在页面最小化时!

当然,你可能会说这还是需要依赖一个事件。然而,这里的事件可以是任意的onxxx这类回调函数,并非局限于UI事件。于是,我们可以人为的制造它!

最简单的例子,给一个new Image设置一个无效的src,它的onerror事件立马就触发了!

于是我们可以在onerror里获取event.screenX,然后继续设置无效的src,于是就可以实时跟踪用户屏幕级别的鼠标指针了。因为onerror的产生不限于任何UI消息,因此页面最小化或非活动状态下,事件仍然能够触发!

至于能不能获取鼠标或键盘哪个键被按下,很不幸,真的不可以。如果捕捉全局按键,哪岂不是可以监听密码输入了。。。

事实上,onerror这类非UI事件的触发,根本就没有任何鼠标或键盘参数传入浏览器窗体,所以也就无法获取各种鼠标键盘信息。至于event.screenX,唯一的解释估计它是event的一个Getter,内部直接调用了GetCursorPos这个Win API,并非事件的触发者提供了这属性。

如果某个页面植入了这样的跟踪代码,然后将坐标位置通过socket.io实时传送回来,岂不是很有趣。。。

Javascript 相关文章推荐
jQuery生成asp.net服务器控件的代码
Feb 04 Javascript
为radio类型的INPUT添加客户端脚本(附加实现JS来禁用onClick事件思路代码)
Nov 11 Javascript
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
Jan 04 Javascript
浅析jquery与checkbox的checked属性的问题
Apr 27 Javascript
实例讲解JavaScript中call、apply、bind方法的异同
Sep 13 Javascript
使用jquery实现的循环连续可停顿滚动实例
Nov 23 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
Nov 28 Javascript
利用JS实现scroll自定义滚动效果详解
Oct 17 Javascript
细说webpack源码之compile流程-入口函数run
Dec 26 Javascript
原生JS实现的轮播图功能详解
Aug 06 Javascript
vue项目实现表单登录页保存账号和密码到cookie功能
Aug 31 Javascript
jQuery 查找元素操作实例小结
Oct 02 jQuery
从数据结构分析看:用for each...in 比 for...in 要快些
Apr 17 #Javascript
关于eval 与new Function 到底该选哪个?
Apr 17 #Javascript
js实现在页面上弹出蒙板技巧简单实用
Apr 16 #Javascript
主页面中的两个iframe实现鼠标拖动改变其大小
Apr 16 #Javascript
拖动table标题实现改变td的大小(css+js代码)
Apr 16 #Javascript
获取offsetTop和offsetLeft值的js代码(兼容)
Apr 16 #Javascript
jquery表格内容筛选实现思路及代码
Apr 16 #Javascript
You might like
在DC的漫画和电影中,蝙蝠侠的宿敌,小丑的真名是什么?
2020/04/09 欧美动漫
php递归函数中使用return的注意事项
2014/01/17 PHP
PHP empty函数报错解决办法
2014/03/06 PHP
LAMP环境使用Composer安装Laravel的方法
2017/03/25 PHP
PHP/ThinkPHP实现批量打包下载文件的方法示例
2017/07/31 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
2018/10/18 PHP
PHP安装memcache扩展的步骤讲解
2019/02/14 PHP
基于laravel where的高级使用方法
2019/10/10 PHP
让ie6也支持websocket采用flash封装实现
2013/02/18 Javascript
JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例
2013/06/29 Javascript
JavaScript中的继承之类继承
2016/05/01 Javascript
js浏览器html5表单验证
2016/10/17 Javascript
jQuery和CSS仿京东仿淘宝列表导航菜单
2017/01/04 Javascript
JS简单实现点击按钮或文字显示遮罩层的方法
2017/04/27 Javascript
Bootstrap提示框效果的实例代码
2017/07/12 Javascript
浅谈JS获取元素的N种方法及其动静态讨论
2017/08/25 Javascript
解决在Bootstrap模糊框中使用WebUploader的问题
2018/03/22 Javascript
小程序实现背景音乐播放和暂停
2020/06/19 Javascript
Python类属性与实例属性用法分析
2015/05/09 Python
python中defaultdict的用法详解
2017/06/07 Python
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
Python中常用的内置方法
2019/01/28 Python
Django框架之登录后自定义跳转页面的实现方法
2019/07/18 Python
python opencv实现gif图片分解的示例代码
2019/12/13 Python
python怎么提高计算速度
2020/06/11 Python
Web页面中八种创建多列等高(等高列布局)的实现技术
2012/12/24 HTML / CSS
html5教你做炫酷的碎片式图片切换 (canvas)
2017/07/28 HTML / CSS
Ref与out有什么不同
2012/11/24 面试题
How to spawning asynchronous work in J2EE
2016/08/29 面试题
英语教师自荐信
2014/05/26 职场文书
行政执法作风整顿剖析材料
2014/10/11 职场文书
2014年人力资源部工作总结
2014/11/19 职场文书
大学生社会实践活动总结报告
2015/05/06 职场文书
react中props 的使用及进行限制的方法
2021/04/28 Javascript
用Python爬虫破解滑动验证码的案例解析
2021/05/06 Python
bootstrapv4轮播图去除两侧阴影及线框的方法
2022/02/15 HTML / CSS