« 関心トラックバック | Main | IPAX Spring2004 »

Webページの安全なキャプチャ

紙2001のようなイメージで、ブックマークレットからWebページをキャプチャして保存するようなWebアプリケーションを作ってます。
保存するHTMLは、XSS(クロスサイトスクリプティング)対策としてスクリプトが動かないように書き換えているのですが、もしかするとなにか対策漏れがあるかもしれないので、気付いた人が教えて下さるのを期待して、概要の分かるソースを公開しておきます。

やっていることは、CSSの情報をHEADに書き出し、後はSCRIPT要素以外の要素とその属性を書き出しているのですが、その際にonで始まる属性は取り除いています。
ちなみにFirefoxでしか、動作確認していません。

var head=function(){
  ret='<head><style>';
  var ss=document.styleSheets;
  for(var i=0;i<ss.length;i++){
    try{
      for(var j=0;j<ss[i].cssRules.length;j++){
        ret+=ss[i].cssRules[j].cssText;
      }
    }catch(e){}
  }                   
  ret+='</style></head>';
  return ret;         
};
var dom=function(elem){
  if('script'==elem.nodeName.toLowerCase())return'';
  var str='<'+elem.nodeName;
  var attrs=elem.attributes;
  for(var i=0;i<attrs.length;i++){
    if('on'==attrs[i].name.substr(0,2).toLowerCase())continue;
    str+=' '+attrs[i].name+'=%22'+attrs[i].value.replace(/%22/g,'%2522')+'%22';
  }     
  str+='>';
  var childs=elem.childNodes;
  for(var i=0;i<childs.length;i++){
    var c=childs[i];
    if(3==c.nodeType){
      str+=c.nodeValue.replace(/</g,'&amp;lt;').replace(/>/g,'&amp;gt;');
    }else if(1==c.nodeType){
      str+=dom(c);
    }
  }
  if('br'!=elem.nodeName.toLowerCase()){
    str+='</'+elem.nodeName+'>';
  }
  return str;
};
var w=window.open('about:blank','_blank');
var d=w.document;d.open();
d.write('<base href=\''+window.location+'\' />');
d.write(head());
d.write(dom(document.body));
d.close()
↑をブックマークレットにしたものが↓です。

InvalidateScript スクリプトを無効にしたHTMLを新しいウィンドウに表示します。

|

« 関心トラックバック | Main | IPAX Spring2004 »

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/15602/576182

Listed below are links to weblogs that reference Webページの安全なキャプチャ:

« 関心トラックバック | Main | IPAX Spring2004 »