tohokuaikiのチラシの裏

技術的ネタとか。

Confluenceのプラグイン作成におけるCSRF対策

ConfluenceのプラグインでXWork/WebWork2の仕組みを使ってプログラムを書く(3) - tohokuaikiのチラシの裏でもちらっと書いたけど、トークン、あるいはチケットといわれるものの埋め込みですね。

参考資料はこちら。CSRF対策なんだからActionクラス使うよねっていう前提で。
Form Token Handling - Confluence Development - Atlassian Developer Documentation

テンプレート側

フォーム

Injectionされそうな遷移画面のフォームに

 #form_xsrfToken()

マクロを入れる。

リンク

リンクの場合は、

<a href="myaction.action?activate=true&#url_xsrfToken()">アクションする先</a>

というようにする。

Ajax

#requireResource("confluence.web.resources:safe-ajax")
を入れることで、

AJS.safe.ajax()
AJS.safe.get()
AJS.safe.post()
AJS.safe.getScript()
AJS.safe.getJSON()

が通常のAJS.$.ajax()の代わりに使えるようになる。自動的にチケットを付加したAjax通信を行ってくれる。

atlassian-plugin.xml

Validatorの一種なので、

 <interceptor-ref name="validatingStack"/>

をactionに忘れないようにつけておく。

Actionクラス側

アノテーション一発。

    /**
     *
     * @return @throws Exception
     */
    @com.atlassian.xwork.RequireSecurityToken(true)
    public String doConfirm() throws Exception {

このアノテーションで、Actionクラスの実行前にチケットチェックしてくれる。正確にはチェックはValidationの前。
チケットが照合しないなどのエラーが発生した場合は、Actionクラスが"input"を返す。