LDR Full Feed Opera ver0.2

Opera9.50 build9841(2008/03/18)で、UserJSのセキュリティポリシーが変更されたらしく、このScriptは動作しなくなっています。document.postMessageがwindow.postMessageに変わっただけというオチだった模様

LDR Full Feed 0.0.8 - 枕を欹てて聴くと同じくセキュリティFIXです。

http://ss-o.net/userjs/ldrfullfeed.js

タグを取得する方法をホワイトリスト相当の実装にしたので、XSSの危険性は格段に下がったはず。が、最低限の属性(imgのsrcとaのhrefだけ)しか許可していないので、こちらは近日中に再度手を入れると思う。ご了承を。


一応、エスケープの中身について解説。
nodeがElementだったらchildNodesに潜り、textNodeだったらテキストを返すってのを再帰的にやってます。で、ElementはtagNameをみて、imgやaなどの属性だけを拾ってあげています。この部分を磨けばちゃんと色々表示できるはず。

var safeNode2String = function(node){
  if (node.nodeType != Node.ELEMENT_NODE && node.nodeType != Node.TEXT_NODE) return;
  var func = arguments.callee;
  var nodes = node.childNodes;
  var contents =[];
  for (var i=0,l=nodes.length;i<l;i++){
    var content = func(nodes[i]);
    if(content) contents.push(content);
  }
  if (node.nodeType == Node.ELEMENT_NODE){
    var tag = node.tagName;
    var attr = (function(){
      var res=[''];
      switch(tag){
        case 'IMG':
          if (node.src.match(/^http:/) ) res.push('src="' + node.src + '"' );
          break;
        case 'A':
          if (node.href.match(/^http:/) ) res.push( 'href="' + node.href + '"' );
          break;
        default:
          break;
      }
      return res.join(' ');
    })();
    return '<' + tag + attr + '>' + contents.join('') + '</'+tag+'>';
  } else if (node.nodeType == Node.TEXT_NODE) {
    return node.nodeValue;
  }
};