Railsのセッション変数に格納されているデータをJavascriptで取得したい。
たとえば↓の部分ですね。
javascript
1 2 3 4 |
<textarea class="ruby" cols="60" rows="5" name="code"> session[:user_id] = 10 session[:flash] = {} </textarea> |
ブラウザでクッキーの中身を見てみるとこんな感じで入っています。
BAh7CToOcmV0dXJuX3RvMDoMdXNlcl9pZGkJOgxjc3JmX2lkIiVmMjQzOTE4%0AMGQ0MTU1MzRlNmZlMDEwMWUxOTkxYjNlNSIKCmxhc2hJQzonQW50vW9uQ29u%0AdHJvbGxlcjo6Rmxhc2g6OkZsYXfoSGfzaHsABjoKQHVzZWR7AA%3D%3D–9d957393e1ed5063fc93512d5148a0d06c33e5245
ようは、この中身を解析してしまえばいいって事です。
ザリガニさんのページでセッション部分を綺麗にまとめてくれてました。
http://d.hatena.ne.jp/zariganitosh/20080207/1202373997
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<textarea class="ruby" cols="60" rows="5" name="code"> class CGI::Session::CookieStore ...(中略)... private # Marshal a session hash into safe cookie data. Include an integrity hash. def marshal(session) data = Base64.encode64(Marshal.dump(session)).chop CGI.escape "#{data}--#{generate_digest(data)}" end # Unmarshal cookie data to a hash and verify its integrity. def unmarshal(cookie) if cookie data, digest = CGI.unescape(cookie).split('--') unless digest == generate_digest(data) delete raise TamperedWithCookie end Marshal.load(Base64.decode64(data)) end end ...(中略)... </textarea> |
※参照
* エンコードは、sessionオブジェクト >> Marshal.dump >> Base64.encode64 >> CGI.escape
* デコードは、CGI.unescape >> Base64.decode64 >> Marshal.load >> sessionオブジェクト
なるほど。。
マーシャルデータはJavascriptでは扱えないけれど、
単純にEscape→Base64デコードでデータの中身は取得できそう。
Javascriptには標準でBase64デコードできるクラスは無いので外部から取得。
*JavaScript で Base64 の符号化と復号化
http://user1.matsumoto.ne.jp/~goma/js/base64.html
ためしにクッキーを表示してみる。
1 2 3 |
<textarea class="ruby" cols="60" rows="5" name="code"> alert(unescape(document.cookie)); </textarea> |
↓がポップアップそれます。

rails_session_on_javascript_alert
「–」以降は暗号化チェックデータなようなので、「***_session=」以降、「–」以下をデコート掛けてやれば取得できるっぽい。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<textarea class="ruby" cols="60" rows="5" name="code"> var keyword_first = "session="; var keyword_end = "--"; var cookie = document.cookie; var first = cookie.indexOf(keyword_first); var end = cookie.indexOf(keyword_end); if (first != -1 && end != -1){ var data = cookie.substring(first + keyword_first.length, end); data = base64.decode(data, 1); data = unescape(data) alert(data); } </textarea> |
ここで問題が、、、
user_idの数字の羅列くらいはMarshal入れなくても無理やり取ってこれると思ったのですが無理でした。
RubyであればここでMarshal.load()を使えばObject化されてデータを取得できるんですが、
Javascriptに対応するライブラリが無い・・。