IEでのUserdataローカライズストレージ

6292 ワード

この2,3日はDiscuz x 2の投稿のリアルタイム保存メカニズムを見て、ローカライズストレージに関わるので、インターネットで調べてみると、FirefoxなどHTML 5対応のブラウザがwindowを使っています.localStorageまたはwindow.sessionStorageストレージは、比較的簡単なので、IEのローカライズストレージに特に注目しました.以下はネットで探した資料で、メモとして使います.Internet Explorer 5では、MicrosoftはuserDataというクライアント永続ストレージ機能を提供しています.CSS挙動を特別に拡張することで実現した.これらの拡張は完全に非標準であり、90年代後期のブラウザ大戦が残した産物である.概念があいまいで使いにくいため、インターネットExplorerにしか使えないため、このようなストレージ方式を使用するWeb開発者は少なく、多くの開発者はこのような技術の存在を全く知らない.IEのuserDataは、完全なXMLドキュメントを格納し、複雑なデータ型をXMLに変換して格納することができる.このようにして、XMLデータアイランド(もう一つのIEにしか存在しない機能)にデータが挿入される.その後、XMLデータ島全体がuserDataに格納されます.でも、Dojoのように.StorageのようなストレージフレームワークはuserDataのこれらのXML機能を遮断し、通常は名前/値ペアのみを文字列の形で露出する.場合によっては、userDataは他のストレージ方式よりも多くのデータを格納することができる.Internet Explorerでは、各ページのデータのサイズを制限するだけでなく、ドメイン全体のサイズも制限しています.格納しようとするデータ容量が許容サイズを超えると、JavaScriptが例外を放出します.表8-2にInternet Explorerの異なるセキュリティドメインにおけるuserDataの記憶能力を示す.表Internet Explorer異なるセキュリティ領域におけるuserDataストレージ能力
安全区域
ドメインサイズの制限
ページサイズの制限
Intranet 
512KB 
10MB
本機、信頼できるエリア及びインターネット
128KB
1MB
制限された領域
64KB
640KB
表の2つの関係が最も緊密なドメインはインターネットとIntranetです.インターネット上の一般的なウェブサイトでは、IE自体が許可するストレージ容量はFlashのLSOより大きいが、MozillaのDOMストレージより小さい.Intranetのアプリケーションでは、userDataのストレージ能力は他のストレージ方式をはるかに上回っており、10 MBのストレージ容量はデータテーブル全体、ツリー型構造、その他のボリュームの大きいデータ構造を格納することができます.開発者は、userDataがメモリに常駐するのではなく、永続的なストレージ方式であることを覚えておく必要があります.そのため、ブラウザを閉じてもこれらのデータは削除されません.userDataストレージ容量の大きいデータ構造を使用する場合、開発者は特に注意する必要があります.これらのデータ構造には、認証のような機密データが格納される可能性があるため、クライアントに永続的に保存されると攻撃者に利用される可能性が高い.名前/値ペアはXMLノードの属性としてuserDataのXMLドキュメントに格納されるため、Internet Explorerは特定の特殊文字を自動的にXMLの対応する文字に変換することができます.たとえば、二重引用符(")は"に置き換えられます.ハイフネーション(&)は&.これらの自動エスケープ文字は、実際に格納されるデータサイズを増加させるため、開発者は、エスケープ後のデータを格納するのに十分なスペースを確保する必要があります.userDataを使用すると、データ共有が大幅に制限されます.異なるドメイン、さらには同じドメインの下の異なるサブドメイン間でデータを共有することはできません.また、同じホストの異なるポート上のアプリケーション間でもデータを共有できません.ドメインとディレクトリの下の異なるページ間でしかデータを共有できません.たとえば、http://company.com/Storage/Checkout.htmlアクセス可能http://company.com/Storage/UserData.html、および任意の/storage/ディレクトリの下のページに格納されているデータ.他のページからアクセスしようとするとnullは1つしか返されません.これらのデフォルトの制限は変更できません.クッキーのデフォルトのルールとはほぼ逆です.これにより、userDataはインターネットExplore 5の中で少数の安全な機能の一つとなっている.ユーザーデータに格納されているすべてのデータをプログラミング手段で削除することはできず、使用するしかない.userDataスタイルのHTML要素は、対応する名前/値ペアを削除するためにremoveAttribute()メソッドを呼び出します.ただし、userDataに実際に格納されている名前/値ペアを削除することはできません.開発者はクライアントに格納されているすべての名前/値が正しいことを知っているはずですが、私たちは結局人間であり、DOMストレージのためにclear()メソッドを記述することができないため、削除すべきデータがuserDataに残される可能性があります.幸いなことに、userData要素のexpiresプロパティは、開発者がデータの自動削除の有効期限を設定するのに役立ちます.デフォルトでは、userDataに格納されているすべてのデータが期限切れになることはありません.Interner Explorerは、WebサイトがuserDataを使用してデータを格納する時間を提供するだけでなく、ブラウザのクッキー、キャッシュ、履歴、オフラインコンテンツを削除しても、userDatに格納されているデータを削除することはできません.これらの要因は,クライアントマシン内のデータを盗む可能性を増大させた.アプリケーション内のデータの一部が不要であることを確認したら、開発者はすぐに削除する必要があります.userDataに格納されているデータを表示するには、実行できませんが、いくつかのテクニックが必要です.まず、Windows Explorer(Windowsファイルウィンドウを任意に開く)のフォルダオプションで[表示]タブに切り替え、[すべてのファイルとフォルダを表示]チェックボックスにチェックマークを付け、[保護されたOSファイルを非表示(推奨)]オプションの選択を解除します.次にuserDataディレクトリを開き、Windows XPシステムでC:Documents and SettingsUSER_となります.NAME\UserData.userDataはXMLファイルに格納されていますが、Internet Exploererはキャッシュされた格納メカニズムを使用してこれらのXMLを格納します.例えばindexという名前を用いる.datのインデックスファイルは、すべてのメタデータ(Metadata)を格納し、その要素(すなわち、userDataを格納するための異なるドメインのXML)をそれぞれ5つのランダムに生成されたディレクトリに格納する.indexを表示できます.Dataインデックスファイル、およびディレクトリ内のすべてのXMLファイルを使用して、具体的に使用されるuserDataストレージシステムを決定します.ただし、userDataに格納されているコンテンツを変更するには、キャッシュディレクトリのXMLファイルを直接変更することはできません.本当にそうすれば、JavaScriptは、変更されたデータをロードするときに、データフォーマットが間違っている異常を放出します.これはindexでdatファイルには、ハッシュハッシュ値やXMLファイルの長さがいくつか保存されています.残念なことにindexdatはオープンなファイル形式ではありません.インターネット上では、ファイル構造の内部構造を詳細に説明しているサイトは少ない.私たち(本書の著者)は一晩中大量の試みと失敗を経て、ついにXMLファイルの長さがindexに保存されていることを発見した.datファイルにあります.注意してdatの+0 x 20オフセット量はファイルの長さを保存するために使用され、現在の値は136バイトであり、userDataを永続化するためのXMLファイルの長さでもある.これにより、攻撃者は、最後にindexを更新する限り、userDataに格納されている永続化データを任意に変更することができる.datファイルのXMLファイルの長さでOKです.クライアントストレージの任意の形式は、ユーザーによって表示され、変更されることを再確認します.開発者は、クライアントからのデータをいつまでも信じられません.総括・userDataは、永続化ストレージ機能を提供します.非永続化ストレージをシミュレートする場合は、ブラウザのunload()メソッドを使用してuserDataデータを消去できます.・userDataが自動的に期限切れになるかどうかを指定できます.デフォルトでは、userDataのデータはいつまでも期限切れになりません.・次の3つの条件を満たす場合にのみ、ページ間でuserDataデータを共有できます.同じポート、同じサーバ、同じディレクトリの下です.この規定を遵守しなければならず、ドメインとドメインの間でもデータを共有できない.・userDataはXMLまたは文字列データを格納できます.開発者は、複雑なデータ型をシーケンス化し、この2つのフォーマットに変換し、対応する逆シーケンス化機能を実現する必要があります.・テキストエディタでuserDataのデータを表示できますが、そのデータを変更するには16進数エディタが必要です.
プログラムコードパッケージ:

/** @class   userdata    */ 
var UserData = { 
 //   userdata   
 o : null, 
 //            : 
 defExps : 365, 
 //    userdate   
 init : function(){ 
  if(!UserData.o){ 
   try{ 
    UserData.o = document.createElement('input'); 
    UserData.o.type = "hidden"; 
    //UserData.o.style.behavior = "url('#default#userData')" ; 
    UserData.o.addBehavior ("#default#userData"); 
    document.body.appendChild(UserData.o); 
   }catch(e){ 
    return false; 
   } 
  }; 
  return true; 
 }, 
 //      userdata     f-   ,c-    ,e-     
 save : function(f, c, e){
  try{
   if(UserData.init()){ 
    var o = UserData.o; 
    //         
    o.load(f); 
    //              
    if(c) o.setAttribute("code", c); 
    //          
    var d = new Date(), e = (arguments.length == 3) ? e : UserData.defExps;
    d.setDate(d.getDate()+e); 
    o.expires = d.toUTCString(); 
    //           
    o.save(f); 
   } 
  }catch (ex){}
 }, 
 //  uerdata          ,         。f-    
 load : function(f){ 
  if(UserData.init()){
   try{
    var o = UserData.o; 
    //      
    o.load(f); 
    //        
    return o.getAttribute("code"); 
   }catch (ex){
    return null;
   } 
  }
 }, 
 //   userdata       f-    
 exist : function(f){ 
  return UserData.load(f) != null; 
 }, 
 //   userdata          f-    
 remove : function(f){ 
  UserData.save(f, false, -UserData.defExps); 
 } 
 // UserData       
}; 

//    

UserData.save(fileName,"    ");

var "    "=UserData.load(fileName);