« サーバシグニチャは隠さないのが当たり前いろいろ変わったXSSがありますが... »

7 コメント

コメント from: とおりすがり [訪問者] メール
うーん、なんかRPGパターンを勘違いしてないですか?PRGパターンを使ったところで戻るボタンで戻れなくなることはないですが。
 「戻るボタンで戻れなくなる」ってことがどういうことを意味するのかよくわかりませんが、IEで有効期限切れになることならそれこそPRGで解決できることです。
 URLをユニークにするとかほかにも解決方法はあるみたいですが、自分はそっちのほうが気持ち悪いと思うけど。
2007/10/14 @ 04:30
コメント from: Yasuo Ohgaki [メンバー] メール · http://www.ohgaki.net/
コメントありがとうございます。

ページの有効期限とは関係ないです。
元記事のもう少し先を読むと


What about back button? This works too, it returns us one step backwards, to the page with a form. This form can be refreshed as well. If it was obtained using GET, then user would not see warning message.

Page refresh works perfectly with redirection. We have to do the roundtrip to the browser, but one more second spent for redirection means little for interactive applications.

と書いてありますね。

POST後に「HTTPリダイレクト」して結果ページを出力するページで「戻る」ボタンで戻れないページを結構よく見かける(特にJavaの場合に多い気が)ので気になっていますが「間違ったPRGパターンの実装」と考えよい、と言う事?

このPRGパターンという名前の方法(実はいままで名前を知らなかった)は「戻れない」ページを作ってしまう(それとGET制限のため汎用性に欠く)と思っていたので使った事がなかったのですが「戻れない」ページを作るパターンがPRGパターンという訳ではないのですね。

2007/10/15 @ 16:45
コメント from: とおりすがり [訪問者] メール
勘違いされているようですが、PRGパターン自体はすごくよく使われているパターンでべつにJavaでしか使われていないってことはないですよ。たとえば
1.はてなブックマークのコメント変更
2.wikipediaでの変更
3.pukiwikiでの変更
4.このブログのコメント投稿(なぜか302でなくて303ですが)
すべてPRGパターンが使われています。いずれもJavaで実装されているわけではありません。おそらくPRGパターンが使われていないのを探すほうが難しいんじゃないでしょうか。
 これだけ使われているのは、PRGパターンを使う理由がそれなりにあるからです。

>戻るやページのリロードでデータの再送信が行われないようにする事が目的らしいですが、別の方法でごく普通にこのように動作させることが出来ます。

とありますが、具体的にはどのようにするのでしょうか?フォームに予測不能な一意なIDを付けるだけでは2回目の送信を無視することはできても、送信自体をしないようにすることはできないと思うのですが(再送信するかどうかダイアログで聞いてきますよね)。たとえサーバ側で2重送信対策をしていたとしても、ユーザにはそれはわからないわけなので、このようなダイアログが出てくること自体ユーザビリティの観点から問題だと思うのですが。
2007/10/15 @ 21:34
コメント from: Yasuo Ohgaki [メンバー] メール · http://www.ohgaki.net/
> いずれもJavaで実装されているわけではありません。

多分一般的なPRGパターンの実装でないタイプを.jspで見かけている(というか気づく事が多い)からだと思います。別にJavaでなくても実装できること分かっています。私が「戻れないのはけしからん」と不満に思っているののは何かおかしなリダイレクトヘッダを送信しているか他のチェック(多重送信チェックとか?)が原因でしょうね。

> このようなダイアログが出てくること自体ユーザビリティの観点から問題だと思うのですが。

プロキシなどにキャッシュされると困るのでプロキシにはキャッシュさせず、キャッシュ制御ヘッダの調整で出したしり、出さなくしたりできます。

それから、REDIRECTでGETに戻すとき「送信しました」だけなら良いですが送信した内容を全部表示する場合、大きなテキストだと困る事があります。ブラウザの仕様よりWAFの仕様の方が厳しい場合も多いです。

探せばいくらでもPRGパターンの実装はありそうですね。参考になります。本文では有害でないかもと追記しましたが、例示された実装例をみるとやはり有害かもと思えてきました。時間が無限にあれば調べたいところですが....
# 最初は別の意味で無用な制限を付ける実装と勘違いしましたが、
# 今回は脆弱な実装を助長しかねないかも、と言う意味で有害かも
# しれないと思えてきました。セキュリティ以外にも突っ込み所は
# あります。データフロー、メッセージの表示など。分かって使っ
# ているとは思いますけど。

コメント頂けると自分の勘違いや問題も整理できるので助かります。
そのうち「やっぱりPRGパターンは有害かも...」と書く事になるかも知れませんね。


ところでPRGパターンを使った場合、RFC2616によるとHTTPステータスは303の方が正しいようです。HTTP 1.0しか理解しないクライアントは誤作動する可能性もあります。302でも動作には問題ないので302を使っても間違いとは言えないようです。キャッシュ効率が落ちるのみです。
2007/10/15 @ 21:46
コメント from: とおりすがり [訪問者] メール
>本文では有害でないかもと追記しましたが、例示された実装例をみるとやはり有害かもと思えてきました。時間が無限にあれば調べたいところですが....

これはすごい。もしPRGパターン自体に脆弱性があればたいへんなことになりそうです。ほとんどのWebアプリは全滅じゃないでしょうか。はてなもwikipediaもpukiwikiもこのブログもだめなぐらいですもんね。

>プロキシなどにキャッシュされると困るのでプロキシにはキャッシュさせず、キャッシュ制御ヘッダの調整で出したしり、出さなくしたりできます。

これ大変興味があります。どうすればよいかぜひ教えてもらえないでしょうか。URLのみでも結構です。
自分もだいぶ試してみたのですができませんでした。
2007/10/16 @ 00:49
コメント from: 別のとおりすがり [訪問者] メール
>それから、REDIRECTでGETに戻すとき「送信しました」だけなら良いですが送信した内容を全部表示する場合、大きなテキストだと困る事があります。

言語というかフレームワーク依存ですが、Ruby on RailsやCatalystではこのような用途に使えるflashという仕組みがあります(とは言ってもPRGのための機能ではなさそうですが)

flashを使えばセッションと同じようにリクエストをまたいでデータを保存しておくことができますが、1回読み出すと(読み出し関係なく次のリクエストだったかも)自動的に消えるので、POSTで行った修正に関する情報をflashに入れておいて、リダイレクト先でそこから読み取って画面をレンダリングするという方法が一般的ではないかと思います。

が、こういうflashの使い方自体、若干バッドノウハウな気もしますが。
2007/10/16 @ 02:18
コメント from: Yasuo Ohgaki [メンバー] メール · http://www.ohgaki.net/
> もしPRGパターン自体に脆弱性があればたいへんなことになりそうです。

とりあず、ここだけ。
RPGパターン自体に脆弱性は無いです。
あまり考えずにこのパターン使ってアプリを作るとCSRFに脆弱なサイトを作っていまい易い、と思っています。

フォーム処理は別のエントリを書いた方が良いかなと思います。

> が、こういうflashの使い方自体、若干バッドノウハウな気もしますが。

なるほど。参考になります。バッドノウハウな気配がかなりしますね。
2007/10/16 @ 08:34

コメントを残す


Your email address will not be revealed on this site.

頂いたURLは表示されます。
PoorExcellent
(改行が自動で <br /> になります)
(Name, email & website)
(ユーザに、メッセージ・フォームを通じた連絡を許可します (あなたのメール・アドレスは表示されません))