ウェブアプリケーションセュリティ読後感2

前振り

粗く読んでみた読後感を少々追加したく思います。

完全に過激なJavaScriptエンコードは完璧なのか

※ご注意:以下、金床さんの著書から離れて一般化したお話しです。

ここでいうJavaScriptエンコードとは、XSS対策として、\uNNNNを使って対処しましょうよ、ということを意味しています。過激なエンコードとは、ローマ字や数字と思われないものは全部エスケープしてしまう、という意味で使っています。これに完全なという形容詞をつければ、めんどうなのでローマ字や数字などもエンコードしちゃいましょうよ、ということになります。

このJavaScriptエンコードは、Script要素に記述されたステートメント中に、ウェブアプケーションが動的にユーザ側が指定した文字列を生成する際に使われるエンコード、とします。これでXSS対策をしましょう、という考えです。

私が思うに、標語的に、「過激なJavaScriptエンコードは完璧」と思い込んでいると危険なのではありませんか。

考え始めた理由

かつてMicrosoft社のウェブサイトのJavaScript中のユーザ文字列挿入において、過激なJavaScriptエンコード済みの文字列を投入することでXSSが発動するという実例があったからです。当該ページでは、バックスラッシュが対処されていなかったために、このようなマネができたのでした。

危険はどこにあるのか。

投入文字列がURLとして使われる場合です。私は過激なJavaScriptエンコード済みな、JavaScript擬似スキームを含む文字列を放り込んだのでした。それはリダイレクタへのパラメータとしてJavaScriptステートメントにおいて使われたのです。

サイト側の対処について

JavaScriptエンコードだけに頼らないことです。