关于在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 相关文章推荐
使用js检测浏览器的实现代码
May 14 Javascript
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
Jun 06 Javascript
JS实现简单的图书馆享元模式实例
Jun 30 Javascript
JavaScript使用DeviceOne开发实战(四)仿优酷视频应用
Dec 02 Javascript
JavaScript和jQuery制作光棒效果
Feb 24 Javascript
微信小程序分页加载的实例代码
Jul 11 Javascript
详解vue前后台数据交互vue-resource文档
Jul 19 Javascript
javascript trie前缀树的示例
Jan 29 Javascript
基于React+Redux的SSR实现方法
Jul 03 Javascript
微信小程序搭建(mpvue+mpvue-weui+fly.js)的详细步骤
Sep 18 Javascript
vue 解决form表单提交但不跳转页面的问题
Oct 30 Javascript
小程序自定义轮播图圆点组件
Jun 25 Javascript
从数据结构分析看:用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
PHP实现定时生成HTML网站首页实例代码
2008/11/20 PHP
php实现加减法验证码代码
2014/02/14 PHP
Codeigniter发送邮件的方法
2015/03/19 PHP
PHP下载文件的函数实例代码
2016/05/18 PHP
PHP面向对象程序设计之命名空间与自动加载类详解
2016/12/02 PHP
搭建自己的PHP MVC框架详解
2017/08/16 PHP
利用PHP获取汉字首字母并且分组排序详解
2017/10/22 PHP
smarty模板的使用方法实例分析
2019/09/18 PHP
firefox浏览器下javascript 拖动层效果与原理分析代码
2007/12/04 Javascript
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
2010/11/28 Javascript
用C/C++来实现 Node.js 的模块(一)
2014/09/24 Javascript
js的for in循环和java里foreach循环的区别分析
2015/01/28 Javascript
Javascript中With语句用法实例
2015/05/14 Javascript
JS模仿编辑器实时改变文本框宽度和高度大小的方法
2015/08/17 Javascript
jQuery地图map悬停显示省市代码分享
2015/08/20 Javascript
JavaScript中关于for循环删除数组元素内容时出现的问题
2016/11/21 Javascript
JS+php后台实现文件上传功能详解
2019/03/02 Javascript
24个解决实际问题的ES6代码片段(小结)
2020/02/02 Javascript
[04:09]显微镜下的DOTA2第十二期—NaVi美如画的团战
2014/06/23 DOTA
[52:03]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第三场 1月31日
2021/03/11 DOTA
Python自动调用IE打开某个网站的方法
2015/06/03 Python
对django中render()与render_to_response()的区别详解
2018/10/16 Python
python getpass模块用法及实例详解
2019/10/07 Python
Python实现不规则图形填充的思路
2020/02/02 Python
Django实现文章详情页面跳转代码实例
2020/09/16 Python
HTML5学习笔记之History API
2015/02/26 HTML / CSS
PHP解析URL是哪个函数?怎么用?
2013/05/09 面试题
武汉世纪畅想数字传播有限公司.NET笔试题
2014/07/22 面试题
什么是方法的重载
2013/06/24 面试题
逃课检讨书范文
2015/05/06 职场文书
户外拓展训练感想
2015/08/07 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
提取视频中的音频 Python只需要三行代码!
2021/05/10 Python
Nginx防盗链与服务优化配置的全过程
2022/01/18 Servers
Python机器学习应用之工业蒸汽数据分析篇详解
2022/01/18 Python
【海涛dota解说】DCG联赛第一周 LGD VS DH
2022/04/01 DOTA