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

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

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

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

Ruby

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

Sinatra

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

受付中

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

poppy_8
poppy_8

総合スコア0

Cookie

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

Ruby

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

Sinatra

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

0回答

0グッド

1クリップ

198閲覧

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

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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

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`のものです。 セッション情報がうまく引き継がれてないのかもしれません。

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

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Cookie

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

Ruby

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

Sinatra

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