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; } };