Grails2.3でのエンコーディング・エスケーピング・XSS対策の向上(MLのメモ)
これの話。(ザックリメモ書き程度なので、詳しくはMLから追って読むかコードを見てくださいね。)
http://grails.1312388.n4.nabble.com/Grails-2-3-encoding-escaping-xss-prevention-improvements-td4642167.html
3月の前半頃、Lari Hotari氏が、エンコーディング・エスケーピング・XSS対策関連の作業を開始するとの報告がMLに入り、興味深かったのでちょっとメモ。
JIRAの内容的にはコレ http://jira.grails.org/browse/GRAILS-9906
仕様は1年ほど前にMarc Palmer氏とPeter Ledbrook氏が議論して定義した内容の実装
https://github.com/grails/grails-core/wiki/Default-Codecs
http://grails.1312388.n4.nabble.com/Grails-2-0-Change-default-codec-to-html-td3709223.html#a3709340
Grailsの実装に改良を加えてエンコーディングの状態をバッファして"2重エンコーディング問題"を解決する。
解決方法は汎用的なものとしてHTMLCodecに縛られないようにする。
そして、ほぼ完成したよとの報告(ML)
http://grails.1312388.n4.nabble.com/Grails-2-3-encoding-escaping-xss-prevention-improvements-td4642167.html#a4642447
※2.3リリースの時にまた詳しく出ると思うので、ザックリと訳します。誤訳とかスンマソ。
コミットの内容はここに:"Solution 1"の内容はほぼ完了
https://github.com/grails/grails-core/commits/scb-encoding-support
以下のページにある"Solution 1"の内容はほぼ完了
https://github.com/grails/grails-core/wiki/Default-Codecs
(訳しにくかったので結構無理矢理w)
- GSPに違うCodecで出力する、3つのトップレベルライター(java.io.Writer拡張)
- StreamCharBufferがエンコーディングストリーミングをサポートして、エンコードされた部分のバッファのステートを保持する
- この機能が2重エンコーディング問題を回避するのと他のハイレベル機能の実装を行う。
- "raw"Codecを使用してエスケープすべきで無い出力をマークする事が可能(データベースからのHTML等)
- "templateCodec"は、この意図でraw codecを使用している
- ストリーム済みエンコーディングモード
- 新規タグ:applyCodec - タグボディ内部のtemplateCodec, pageCodec & defaultCodecを変更
- 新規コマンド(*クロージャ?)withCodec: タグリブ実装コードでtemplateCodec, pageCodec & defaultCodecを変更
- 全てのタグリブにencodeAs属性: タグリブ実行時のpageCodec & defaultCodecの切替
3/14時点の残項目
Todo:
- default encodeAs attribute (for g:javascript etc.) support
- support map argument to encodeAs attribute so that templateCodec, pageCodec & defaultCode can be changed separately
- helper script for adding defaultCodec/templateCodec/pageCodec GSP page directives to all GSP files
- enforce defaultCodec GSP page directives in all plugin projects
- fix current XMLCodec/JSONCodec (Peter's mail about it earlier)
- other GRAILS-9906 subtasks
- Documentation and tests are missing... :) I'll start improving the test coverage as my next task.
- User documentation changes
まだテストは一部しか無いらしいです。興味深いので見てみましょう!
https://github.com/grails/grails-core/blob/scb-encoding-support/grails-test-suite-web/src/test/groovy/org/codehaus/groovy/grails/web/taglib/ApplyCodecTagSpec.groovy
Tests for some technical features like StreamingEncoder and StreamCharBuffer encoding support:
https://github.com/grails/grails-core/blob/scb-encoding-support/grails-plugin-codecs/src/test/groovy/org/codehaus/groovy/grails/web/codecs/HTMLEncoderSpec.groovy
https://github.com/grails/grails-core/blob/scb-encoding-support/grails-test-suite-uber/src/test/groovy/org/codehaus/groovy/grails/web/util/StreamCharBufferSpec.groovy
追記: メーリングリストの内容より。
3つのコーデックの情報がWithCodecHelperのJavadocにあります: WithCodecHelper
- outCodec - タグリブとスクリプトレットの出力をエスケープ(Writer "out" のインスタンス用コーデック)
- expressionCodec - ${}内部の値をエスケープ
- templateCodec - GSPファイルからの静的HTML部分をエスケープして出力する (デフォルトは"raw")
互換性を保つために、"outCodec"と"templateCodec"は、デフォルトで"none"となります。"expressionCodec"は以前からある"defaultCodec"と同じです。今後"expressionCodec"と呼ぶようになります。
また、時間があったら内容を追ってみます。
※ザックリすぎなので間違ってたら教えてください。