| « 開発中のアドオンのソースファイルへの上書きインストール問題 | [userChrome.css] IE7 Throbber » |
nsIScriptSecurityManager で危険なURIを除外する
nsIScriptSecurityManager の checkLoadURI や checkLoadURIStr メソッドによって、ある URI のページからリンクされる別の URI がポリシーに沿ったものであるかどうかを判別することができる。
以下のサンプルは、現在のURI (sourceURI) に対して、リンク先のURI (targetURI) が javascript: や data: プロトコルで表された危険が潜む可能性のある URI であるかどうかをテストしている。
var sourceURI = "http://www.example.com/";
var targetURI = "javascript:alert('Blah');";
var SECMAN = Components.classes["@mozilla.org/scriptsecuritymanager;1"]
.getService(Components.interfaces.nsIScriptSecurityManager);
// disallow javascript: and data: protocols
const flags = Components.interfaces.nsIScriptSecurityManager.DISALLOW_SCRIPT_OR_DATA;
try {
SECMAN.checkLoadURIStr(sourceURI, targetURI, flags);
alert("SAFE URI: " + targetURI);
} catch (ex) {
// if the URI is unsafe, threw NS_ERROR_DOM_BAD_URI
alert("UNSAFE URI: " + targetURI);
}
Firefox 2 で備わったフィードプレビュー機能では、見かけ上 http: プロトコルのXMLデータを表示させているように見えても実際にロードされているデータはクロム権限で動作する以下のXHTMLである。
chrome://browser/content/feeds/subscribe.xhtml
したがって、フィードのパーマリンクに javascript: プロトコルによる危険な URI が潜んでいる場合、ユーザがフィードのエントリをクリックすることでそのスクリプトが発動してしまうことになり兼ねない。
そこで、フィードプレビューを生成する際、 FeedWriter クラスの _safeSetURIAttribute メソッドが上記のように nsIScriptSecurityManager を利用し、 危険な URI を a要素等のhref属性等にセットしない(つまりリンクしない)仕組みになっている。