发新话题
打印

[Flash] Flash Magician(3) 声讨键盘响应

Flash Magician(3) 声讨键盘响应

因为最近比较忙,一直都没有更新。一开始说本教程系列只涉及AS2,但是看了看AS3,觉得很多AS2的东西已经被抛弃掉了,就没有必要讲了。所以收回以前的话,转向AS3。
    一开始接触AS3的时候,发现以前做小游戏中不可以缺少的Key.isDown()居然被删除了,查了查帮助文档,赫然写着“因安全原因而被删除”。到底因为什么安全原因呢,我也懒得去搜索相关的文档,本篇就按照我自己的理解,谈谈这所谓的安全问题。
    Key.isDown()有一个非常暴力的特点——即使失去焦点,它也可以响应!也就是说它可以知道你按下键盘上的某个键。这意味着什么呢?没错,意味着它可以通过swf盗取你的密码!(一开始我还准备写一个具体事例,不过还是算了,不要教坏小朋友。)具体怎样盗取呢?其中一个实现方法就是,写一个响应全部按键的方法,在onEnterFrame事件或者setInterval函数中调用这方法,然后通过链接服务器,将按键序列传到服务器保存起来。盗密码者通过分析按键序列,很容易就可以知道用户名,密码等信息。这样说或许有点抽象,再举个简单的例子:
var pswStr:String="";
function display():Void{
    trace(pswStr);
    pswStr="";
}
function genKeyEvent(keyCode:Number):Void{
    if(Key.isDown(keyCode))
        pswStr+=String.fromCharCode(keyCode+Key.getAscii()-Key.getCode());

};
function getCode(char:String):Number{
    return char.charCodeAt(0);
}
function listen():Void{
    for(var i:Number=getCode("0");i<getCode("9");genKeyEvent(i++));
    for(var j:Number=getCode("a");j<getCode("z");genKeyEvent(j++));
    for(var k:Number=getCode("A");k<getCode("Z");genKeyEvent(k++));
    if(Key.isDown(Key.ENTER)) display();
}
_root.onEnterFrame=function(){listen();}


将代码复制到第一帧,测试影片(禁止快捷键),随便按几个字母或数字,再按Enter,只要你按键速度恰好,可以看见输出即为按键序列。即使你失去焦点,比如打开QQ对话框输入几个字母再按Enter,你依然可以看到输出,虽然可能有所偏差(我的genKeyEvent函数没写好)。这时你不得不考虑下flash的安全问题了,盗密码者可以将透明swf嵌入在浏览器中,这样只要你页面还在,他就可以知道你输入的一切东西。。。。。。
    Adobe很明智的删除了Key.isDown,虽然传统开发者或许有所不便,但是安全性更加重要。没有了Key.isDown,在AS3中就只好用onKeyDown事件了,这样只有获得焦点的DisplayedObject才能监听到,我想你不会傻到把焦点落在swf上还输入密码吧。
    其实大家应该玩过很多需要在swf上注册用户才能玩的小游戏吧,这些游戏很有可能存在着安全隐患。如果不厚道的开发者用明文传输你的密码,然后又明文的存入数据库(大多闪客都这样),而且你的密码刚好和你其他密码一致的话,那么密码是非常容易泄露的,至少开发者可以轻而易举的盗取。这些没得防范,只要靠开发者的人品。所以建议广大的开发者,传输密码的时候,至少将密码加密一下(比如md5,flash版md5到处都有)。本课到此结束吧。


Flash Magician 系列教材:http://blog.sina.com.cn/netiod
业务联系,技术交流QQ:34199000
E-mail:extremania@126.com

TOP

发新话题