Hatena::ブログ(Diary)

hrendohの日記

2010-04-19

cajaプロジェクトJsHtmlSanitizerを使ってみた

google-cajaプロジェクトは、Ajaxを多用するようなクロスドメインなサイトのセキュリティの問題を解決するためのライブラリを開発しているプロジェクトです。

OpenSocialエンジンであるApache-Shindigにも含まれて居ます。どちらかというと派生プロジェクト?

サニタイズの処理を整理するにあたって、自分でコーディングするのはバグの元なので、cajaプロジェクトのhtml-sanitizer.jsを利用を検討してみることにします。

cajaプロジェクトはソースコードのみ配布されていますので、SVNリポジトリからチェックアウトします。

$ svn checkout http://google-caja.googlecode.com/svn/trunk/

html-sanitizer-minified.jsを生成するためにantを実行します。

$ ant MinifiedJs

以下のファイルができます。

ant-lib/com/google/caja/plugin/html-sanitizer-minified.js

サニタイズ処理が必要なページには、上記のjsファイルを追加します。

<script src="html-sanitizer-minified.js"></script>

サニタイズは、html_sanitize関数を利用します。

html_sanitize(htmlSnippet, urlTransformer, nameIdClassTransformer)

引数は以下の通りです。

以下、サンプルのHTMLです。

<html>
  <head>
    <script src="html-sanitizer-minified.js"></script>
    <script>
      function urlX(url) {if(/^https?:\/\//.test(url)) {return url }}
      function idX(id) { return id }
      function load(){
        document.getElementById('sanitize').innerHTML = html_sanitize('<b>hello</b><img src="./debug.gif"><img src="http://www.infoscoop.org/infoscoop_H60.gif"><a href="javascript:alert(0)"><script src="http://dfd"><\/script>', urlX, idX);
        document.getElementById('no_sanitize').innerHTML ='<b>hello</b><img src="./debug.gif"><img src="http://www.infoscoop.org/infoscoop_H60.gif"><a href="javascript:alert(0)"><script src="http://dfd"><\/script>';
      }
  </script>
  </head>
  <body onload="load()">
     <div><span>with sanitize:</span><span id="sanitize"></span></div>
     <div><span>without sanitize:</span><span id="no_sanitize"></span></div>
  </body>
</html>

結果は以下のようになります。

サニタイズあり:
<B>hello</B><IMG /><IMG src="http://www.infoscoop.org/infoscoop_H60.gif" /><A></A>
サニタイズなし:
<B>hello</B><IMG src="./debug.gif" /><IMG src="http://www.infoscoop.org/infoscoop_H60.gif" /><A href="javascript:alert(0)"><SCRIPT src="http://dfd"> </SCRIPT></A>

この例では、urlTransformerとして実行元のドメインにアクセスするURL(./debug.gifなど)を削除するurlX関数を指定しています。

やはり、自分で作るよりは頭が良さそうなので、もう少し検証してみたいと思います。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/hrendoh/20100419/1271671829