魔王Flash Cookie Stuffing方法

用flash 来做Flash Cookie Stuffing 他是本地共享对象并不是基于浏览器的,所以一但插入,就永久存在。而且还具有可操作性、比普通HTTPCookies有着更大存储空间、更好的隐蔽性等优点。加上现在FlashPlayer已经成为互联网用户标配之一,不存在兼容性的问题。一般情况下,flash cookie保存在系统的如下位置,你可以去看看有没有被别人Flash Cookie Stuffing:

C:\Documents and Settingsyourusername\Application Data\MacromediaFlash Player\SharedObjects

下面是一个Flash Cookie Stuffing 的程序编写。首先是基础建设,在Flash端,我们使用的是ActionScript3来编程,下面实现了一个基本的Flash Cookies存储的类,在接下来的过程当中,我们将通过这个类来实现对Flash Cookies的操作。当然,这里只是把流程以及关键的技术讲清楚,涉及到具体的操作,则需要您自己来实现。

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
/**
Flash Cookie Stuffing
 **/package laohan.flashcookie { //注:由于我没有装Flex,所以只好使用Flash CS3来嵌入。 //如果使用Flash Developer,则MovieClip这个包可以不包含。 import flash.display.MovieClip; import flash.net.SharedObject; import flash.external.ExternalInterface; public class myFlashCookie extends MovieClip {//如果使用Flex,可以不继承这个类。 private var cookieTimeOut:uint; private var cookieName:String; private var cookieSharedObj:SharedObject; private var currentCookie:Object; private var cookieValue:String; //构造函数。 public function myFlashCookie(cName:String = "hunsimowang", timeOut:uint=3600) { cookieName = cName; cookieTimeOut = timeOut; cookieSharedObj = SharedObject.getLocal(cName, "/" ); if(isCookieExist(cName)){//如果FlashCookies存在。 currentCookie = getCookies(cName); //调用JavaScript里的jsSetCookies方法来设置HTTPCookie ExternalInterface.call("jsSetCookies",{fcookie:currentCookie}); //trace(currentCookie); } } //到期删除Cookies public function clearTimeOut():void { var obj:* = cookieSharedObj.data.cookie; if(obj == undefined){ return; } for(var key in obj){ if(obj[key] == undefined || obj[key].time == undefined || isTimeOut(obj[key].time)){ delete obj[key]; } } cookieSharedObj.data.cookie = obj; cookieSharedObj.flush(); } //添加Cookies( key-value ) public function saveCookies(key:String, value:*):void { var today :D ate = new Date(); key = "key_"+key; value.time = today.getTime(); if(cookieSharedObj.data.cookie == undefined){ var obj:Object = {}; obj[key] = value; cookieSharedObj.data.cookie = obj; }else{ cookieSharedObj.data.cookie[key] = value; } cookieSharedObj.flush(); } //删除当前Cookies public function removeCookies(key:String):void { if (isCookieExist(key)) { delete cookieSharedObj.data.cookie["key_" + key]; cookieSharedObj.flush(); } } //通过Key来获取Cookies值。 public function getCookies(key:String):Object{ return isCookieExist(key)?cookieSharedObj.data.cookie["key_"+key]:null; } //检查Cookies是否存在。 public function isCookieExist(key:String):Boolean{ key = "key_" + key; return cookieSharedObj.data.cookie != undefined && cookieSharedObj.data.cookie[key] != undefined; } //检查Cookies的到期时间 private function isTimeOut(time:uint):Boolean { var today :D ate = new Date(); return time + cookieTimeOut * 1000 < today.getTime(); } //取得Cookies的到期时间; public function getTimeOut():uint { return cookieTimeOut; } //取得Cookies名称。 public function getName():String { return cookieName; } //清除所有的Cookies值。 public function clearCookies():void { cookieSharedObj.clear(); } }}

将所有的模块编译成SWF文件,我们将其命名为:hsmw.swf,在上面的代码中,我们首先在构造函数里检查了Flash Cookie是否存在,如果存在,则会调用一个叫jsSetCookies的JavaScript方法来设置HTTP Cookie。那么,我们接下来要使用JavaScript来实现此SWF的调用以及互动。

JavaScript的实现:
1)首先要预定义一个供ActionScript3调用的方法,即上面说过的jsSetCookies方法。

1234567
//先定义一个全局变量var flashCookiesValue = Null;var jsSetCookies = function(flahCookieValue){ var o = arguments[0]; flashCookiesValue = o.fcookie;//在SWF执行时传递过来的值。 document.cookie="hunsimowang="+flashCookiesValue+";path=/;expires=Fri, 04-Dec-2005 08:44:07 GMT;domain=26836659.blogcn.com";};

2)检查特定的HTTPCookies是否存在,如果不存在,则在页面上生成Object Dom节点,把hsmw.swf加载进来。此时SWF会去检查Flash Cookies是否存在,如果存在,则去取得Flash Cookies,并且通过调用jsSetCookies来设置HTTP Cookies:

  1. if(document.cookie.indexOf(“hunsimowang=”)<0){
  2.     //先去load hsnw.swf,即在页面上生成Object对象:
  3.     var jsLoadFlash = function(){
  4.         var myFlashURL = “hsmw.swf”;
  5.         var myFlashObj = document.createElement(“object”);
  6.         myFlashObj.setAttribute(“id”,”myFlash”);
  7.         myFlashObj.setAttribute(“classid”,”clsid :D 27CDB6E-AE6D-11cf-96B8-444553540000″);
  8.         myFlashObj.setAttribute(“width”,0);
  9.         myFlashObj.setAttribute(“height”,0);
  10.         var flahParamObj = document.createElement(“param”);
  11.         flahParamObj.setAttribute(“name”,”movie”);
  12.         flahParamObj.setAttribute(“value”,myFlashURL);
  13.         var subMyFlashObj = document.createElement(“object”);
  14.         subMyFlashObj.setAttribute(“type”,”application/x-shockwave-flash”);
  15.         subMyFlashObj.setAttribute(“data”,myFlashURL);
  16.         subMyFlashObj.setAttribute(“width”,0);
  17.         subMyFlashObj.setAttribute(“height”,0);
  18.         myFlashObj.appendChild(flahParamObj);
  19.         myFlashObj.appendChild(subMyFlashObj);
  20.         var myDHTMLBody = document.body;
  21.         if(myDHTMLBody){
  22.             myDHTMLBody.appendChild(myFlashObj);
  23.         }
  24.     };
  25.     jsLoadFlash();
  26. }

倘若Flash Cookies里也没有存储我们想要的数据呢?那么,此时就必须通过JS去请求特定的URL,然后使用JavaScript去调用AS3的方法来设置Flash Cookies吧。

那么到这里,基本上就实现了使用Flash Cookies来永久保存客户端数据的全过程。

版权声明:admin 发表于 2020-06-09 19:28:23。
转载请注明:魔王Flash Cookie Stuffing方法 | 甄选网

暂无评论

暂无评论...