質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Sinatra

Sinatraは、Rubyで作られた オープンソースのWebアプリケーションフレームワークです。

Q&A

0回答

688閲覧

cookieの確認:Marshal.load(Base64.decode64(変数))でTypeErrorとなる

poppy_8

総合スコア0

Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Sinatra

Sinatraは、Rubyで作られた オープンソースのWebアプリケーションフレームワークです。

0グッド

1クリップ

投稿2022/11/22 01:44

編集2022/11/22 11:12

前提

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というのはどう捉えたら良いかも今ひとつわかっていない状態です。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2022/11/24 11:41

> 下記のMarshal.load()の中身が読めないみたいで、TypeErrorが起きています。 投げ込んだ元データはどのようにして得たものでしょうか?
poppy_8

2022/11/24 12:38

sのデータで合ってますか? > s部分の情報は、sessiontest.rbの内容からブラウザ表示後にcookie情報をとってきています。 こちらの下記内容の`sessiontest.rb`を起動し、ブラウザで立ち上げた後にページソース表示からストレージ→cookie の値を貼り付けています。`rack.session`のものです。 セッション情報がうまく引き継がれてないのかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問