ウェブアプリケーションセュリティ読後感2
前振り
粗く読んでみた読後感を少々追加したく思います。
完全に過激なJavaScriptエンコードは完璧なのか
※ご注意:以下、金床さんの著書から離れて一般化したお話しです。
ここでいうJavaScriptエンコードとは、XSS対策として、\uNNNN
を使って対処しましょうよ、ということを意味しています。過激なエンコードとは、ローマ字や数字と思われないものは全部エスケープしてしまう、という意味で使っています。これに完全なという形容詞をつければ、めんどうなのでローマ字や数字などもエンコードしちゃいましょうよ、ということになります。
このJavaScriptエンコードは、Script要素に記述されたステートメント中に、ウェブアプケーションが動的にユーザ側が指定した文字列を生成する際に使われるエンコード、とします。これでXSS対策をしましょう、という考えです。
私が思うに、標語的に、「過激なJavaScriptエンコードは完璧」と思い込んでいると危険なのではありませんか。
考え始めた理由
かつてMicrosoft社のウェブサイトのJavaScript中のユーザ文字列挿入において、過激なJavaScriptエンコード済みの文字列を投入することでXSSが発動するという実例があったからです。当該ページでは、バックスラッシュが対処されていなかったために、このようなマネができたのでした。
危険はどこにあるのか。
投入文字列がURLとして使われる場合です。私は過激なJavaScriptエンコード済みな、JavaScript擬似スキームを含む文字列を放り込んだのでした。それはリダイレクタへのパラメータとしてJavaScriptなステートメントにおいて使われたのです。
サイト側の対処について
JavaScriptエンコードだけに頼らないことです。