前提
sinatraの勉強としてcookieについて学習中です。下記のMarshal.load()
の中身が読めないみたいで、TypeErrorが起きています。
実現したいこと
次のエラーを無くして、Marshal.load(Base64.decode64(sb64))
を出力させたい
発生している問題・エラーメッセージ
❯ ruby decodecookie.rb <internal:marshal>:34:in `load': incompatible marshal file format (can't be read) (TypeError) format version 4.8 required; 166.224 given from decodecookie.rb:10:in `<main>'
該当のソースコード
ruby
1require 'cgi' 2require 'base64' 3require 'openssl' 4require 'sinatra' 5require 'webrick' 6 7s = "puA%2FYXVaGLlNz7z9ZtrYtf%2FeKd8EmX16U1NBLS%2BRdYSFzLz4KT8S43OyiBA0j4d0%2F94VXXno4SeKlmYjJIzLOcBM2VhOuAU3neda8Ggko26Q1A3So2iQVskecXUnIJ2fYivd0R6VUN3XEOxj2z3tHHxN9JylWS0s1tycg62rQLzGQt2f2xuyuvpVzdAEahFxmNE9knHs0%2B3Lj7SQwriXc52ZAMoanOsYyegg2Ksxxm0oRPj%2BBZim1g3zu5MesZGQVMJiqMpfNTTkfd1oAqNJh9XaEVojJja1otEzqmF%2B9kvKsiWuLhZ5lbc2OQQePjoa%2BHw0%2FRtC42KSymTgQJDLHMdRXfwVrgGFuSDMkErw5pHYz6nVZJuy4xFTvorHAcDM3o3u0Zy1D2VsV0FsL0KuyJ89kjWki%2Fcob556fjErM87JSMWtza1biBEeoUVuDV3DCA%3D%3D--zhDzybumFHJGWFwI--y8q0dw77G1VPiTQbNWTUAA%3D%3D" 8 9sb64, digest = CGI.unescape(s).split("--") 10puts Marshal.load(Base64.decode64(sb64)) #この行で次のようなエラー文が出る 11puts OpenSSL::HMAC.hexdigest(OpenSSL::Digest::SHA1.new, "bd3d8c6349c53ad682bafcb7c6b88fb50027929890b71274fa7ff3399fb50ed9", sb64) 12puts digest
試したこと
Base64.decode64(sb)
の部分が読めないのかと思い取り出してみると、
]???T?b??_54?}?h?I???Z#&6???3?a~?Kʲ%?.y??69>:?|4??b??d?@???Q]???? ̐J???ϩ?d???S?????ލ?ќ?elWAl/B?ȟ=?5???(o?z~1+3??Hŭͭ[??En
このようにデコードで文字化けしている様子です。これで読めなくなっているのかなと考えています。
次のgemの管理についても調べて試してみましたが、
❯ gem sources -l *** CURRENT SOURCES *** https://rubygems.org/
rubyバージョン違いによる影響はないのかなと考えています。
念の為gemファイルも載せておきます。
# frozen_string_literal: true source "https://rubygems.org" # gem "rails" gem "sinatra" gem "webrick" gem "cgi" gem "base64" gem "openssl"
またsplit("--")
は書籍:RubyとSinatraではじめるWebアプリケーション開発の教科書
に従って入力していますが、区切り位置を変えてみてもエラー分は変わらない様子でした。
補足情報(FW/ツールのバージョンなど)
s
部分の情報は、sessiontest.rb
の内容からブラウザ表示後にcookie情報をとってきています。
ruby
1require 'cgi' 2require 'base64' 3require 'openssl' 4require 'sinatra' 5require 'webrick' 6 7set :sessions, 8 secret: 'bd3d8c6349c53ad682bafcb7c6b88fb50027929890b71274fa7ff3399fb50ed9' 9 10set :environment, :production 11 12get '/page1' do 13 session[:message] = 'ABC' 14 redirect '/page2' 15end 16 17get '/page2' do 18 session[:message] 19end 20
rubyリファレンス
こちらにあるように、
Marshal.#load は、メジャーバージョンが異なるか、バージョンの大きなマーシャルデータを読み込んだとき例外 TypeError を発生させます。
で考えると、gem sources -l
を試して問題がなさそうだったと判断しています。
バージョンの大きなマーシャルデータというのが、エラーメッセージにある、
format version 4.8 required; 166.224 given
この部分のrequired; 166.224 given
というのはどう捉えたら良いかも今ひとつわかっていない状態です。
よろしくお願いいたします。
あなたの回答
tips
プレビュー