金利0無利息キャッシング – キャッシングできます

 | 

2012-07-09

JavaScriptでdocument.cookieへのアクセスを禁止する

16:40 | JavaScriptでdocument.cookieへのアクセスを禁止する  - 金利0無利息キャッシング – キャッシングできます を含むブックマーク はてなブックマーク - JavaScriptでdocument.cookieへのアクセスを禁止する  - 金利0無利息キャッシング – キャッシングできます

JavaScriptからdocument.cookieへのアクセスを禁止するという手法が知られていて

Object.defineProperty(document, 'cookie', {
    get: function(){return false},
    set: function(){return false},
    configurable:false
});

XSS界で有名なMarioさんのスライドで紹介されている http://www.slideshare.net/x00mario/locking-the-throneroom-20

XSS対策としてこのテクニックを使う場合

  • そもそもJavaScriptから参照する必要がないcookieには、httponlyを付けておくと良い
  • 必要となるケースは、何らかの事情でhttponly付けられないか、通常の処理ではdocument.cookieを使いたいがXSSがあった場合に攻撃者のコードからはdocument.cookieを触らせたくない、という状況
  • なので、特定のメソッドからのみcookieの読み書きを許可する、というアクセサを作る話がセットになっている。
  • そしてXSSがあった場合に、いかにして制限を迂回してdocument.cookieへのアクセスを獲得するか、という話もセットで語られている

で、正規のメソッドからはdocument.cookieへの読み書きを許可しつつ、XSSがあった場合には禁止するというのは相当に難しい。あとObject.definePropertyが使えない古いブラウザだと動かないので、古いブラウザだと当然保護されないことになる。

Cookieが無効のブラウザであるかのように振舞う

document.cookieがfalse返すのは何か不具合起こす可能性もあるので空文字を返すようにして、ついでにnavigator.cookieEnabledもいじってやろう。こうすると、JavaScriptからはcookieが無効のブラウザであるかのように見える。

(function(){
try{
 var e = function(){return ""};
 var f = function(){return false};
 Object.defineProperty(document, "cookie", { get: e, set: e, configurable:false });
 Object.defineProperty(navigator, "cookieEnabled", { get: f, set: f, configurable:false });
} catch(e){ /* not supported */ }
})();

Cookieが無効のブラウザであるかのように振舞うことで何が嬉しいかというと、実際にこのテクニックが有用と思われるケースがあったので、何件か調整したらあとで書く。

トラックバック - http://subtech.g.hatena.ne.jp/mala/20120709
 |