jpmobileのtrans sidをセッションのCookieStoreに対応させてみる

Posted filed under Ruby on Rails.

こっちが、ほんとの目的。地味に開発を続けているSticka.jpの携帯対応の為に必要なので。 AIR版とWeb版を同時にリリースするつもりだったのに、AIRの日本語は相変わらずダメダメなので、とりあえずWeb版ばかり開発が進んでます。 すでに十分使える様になったので、前に登録していただいた人を中心に近々ベータテストを開始します。 このコードはうまく動きません。対応はあきらめました。 (追記 2008/02/03) さて、このStickaはRails 2.0で作っています。セッションはCookieStore。どうせuser_idしか保存しないしね。 でも、そうするとクッキーを持たない携帯では使えない。それじゃ困る。 という事で書いてみました。jpmobileのtrans sidを使ってCookieStoreをパラメータに保存。 セキュリティ的にかなり微妙なので、使う人は気をつけてください。 とくにリファラーは一発です。 i-modeのブックマークのURLは256文字までらしいので、別に対策が必要です。 jpmobile/lib/jpmobile/trans_sid.rb # 〜〜 省略 〜〜 class CGI::Session::CookieStore #:nodoc: # ↓追加 def marshaled_data #:nodoc: if defined?(@data) && !@data.blank? updated = marshal(@data) raise CookieOverflow if updated.size > MAX return updated end nil end end # ↑追加 module Jpmobile::TransSid #:nodoc: # 〜〜 省略 〜〜… Read more »

jpmobileのtrans_sidがRails2.0で動かなかったのでパッチを作ってみた

Posted filed under Ruby on Rails.

Cookieが使えないDoCoMoなどの端末で、uriにセッションキーを追加するtrans_sidが、Rails 2.0系で動かないっていう話があったので、気分転換に手を動かしてみました。 http://dev.rubyonrails.org/browser/tags/rel_2-0-2/actionpack/lib/action_controller/cgi_ext/session.rb Railsのセッションは、Ruby標準のCGI::Sessionを使っています。ここでSessionを生成する時にCGIのオブジェクトから、クッキーやパラメータを見てセッションを生成してます。 そこで、このセッション生成のときを調べてみると、CGI#paramsが空でパラメータが渡っていません。 http://dev.rubyonrails.org/browser/tags/rel_2-0-2/actionpack/lib/action_controller/cgi_ext/query_extension.rb CGIの生成を追っていると、そもそも生成時にCGI#paramsを{}で上書きしています。 これは、CSRF対策のようです。これを上書きするのもちょっとなんな気がするので、セッション生成時にパラメータを再構築する様にしてみます。 jpmobile/lib/jpmobile/trans_sid.rb に下記のパッチを追加してください。 class ::CGI #:nodoc: class Session #:nodoc: alias_method :initialize_without_uri_session_key, :initialize def initialize(cgi, options = {}) cgi.params[options[‘session_key’]] ||= ENV[‘RAW_POST_DATA’] ? CGI.parse(ENV[‘RAW_POST_DATA’])[options[‘session_key’]] : CGI.parse(cgi.query_string)[options[‘session_key’]] if @cgi.cookies[options[‘session_key’]].empty? initialize_without_uri_session_key(cgi, options) end end end このままだと、jpmobileをインストールするだけで、セッションキーをパラメータで受け取る様になってしまいます。 本当は最低でもtrans_sidが起動された場合にのみ、このパッチが走る様にしないとな。 携帯用にするなら、携帯からのアクセスの場合のみURIパラメータでセッションキーを受け取る様にしたいなぁ。 このパッチは、作者のShidara君に送ってあるので、数日中に取り込まれると思います。 続いて、CookieStoreをパラメータに埋め込む様にしたいなぁ。