leftovers...

about grails groovy

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拡張)
    • templateCodec: GSPファイルからの静的HTML部分をエスケープして出力する (デフォルトは"raw")
    • pageCodec: タグリブとスクリプトレットからの出力をエスケープして出力する
    • defaultCodec: ${}内部の値をエスケープして出力する
  • 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"と呼ぶようになります。




また、時間があったら内容を追ってみます。
※ザックリすぎなので間違ってたら教えてください。