配列データのシリアライズ後にBase64エンコードを行うのは何故か

366 views
Skip to first unread message

notsix

unread,
Oct 23, 2019, 6:39:01 AM10/23/19
to 「体系的に学ぶ 安全なWebアプリケーションの作り方」サポートML
初めまして。タイトルの内容についてご質問させていただきます。
記載しているページ数については、第二版より参照したものです。


## ご質問内容
[ 4.14 構造化データの読み込みにまつわる問題 p.345 ] の`/4e/4e-001.php`内で、シリアライズ後にBase64エンコードを行うのは何故でしょうか。
<?php
  $a = array(1, 2, 3);
  $ex = var_export($a, true);
  $b64 = base64_encode($ex);
?>

こちらについて調べた結果、以下の記事に辿り着きました。
どうやら HTTP経路上でバイト数が変わったりゴミデータを拾ったりすることがあるらしいです。そのため適宜データをやり取りする場合はなるべくエンコードしたほうが良さそうです。

シリアライズしたデータをそのまま送信することは、データが破損する危険性がある、ということなのでしょうか。 

徳丸浩

unread,
Oct 23, 2019, 6:05:33 PM10/23/19
to wasbook...@googlegroups.com
こんにちは。質問拝見しました。

参照された記事の場合ですと、serializeした後のデータはNULLバイトを含むため、テキストのみを前提としている送受信方式ですとデータをとりこぼす可能性はあります。しかし、記事中の「HTTP経路上でバイト数が変わったりゴミデータを拾ったりすることがある」というのは間違いです。HTTPではバイナリデータの送受信が可能です。問題が起こるのは、データのエンコード方式のところです。
さて、var_exportの結果はNULLバイトは含みませんが改行は含みます。このプログラムの場合だと下記のようになります。

array (
0 => 1,
1 => 2,
2 => 3,
)
これをhiddenパラメータにそのまま置くのは良くないので、base64エンコードしています。
なお、setcookieでクッキーに書く場合は、内部でパーセントエンコードされるのでbase64エンコードは必須ではありません。しかし、保険的にbase64エンコードすることは、わりあいある実装です。

結論としては、var_exportした結果は改行を含むため、ということになります。

2019年10月23日(水) 19:39 notsix <charis...@gmail.com>:
> --
> このメールは Google グループのグループ「「体系的に学ぶ 安全なWebアプリケーションの作り方」サポートML」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには wasbook-reade...@googlegroups.com にメールを送信してください。
> このディスカッションをウェブ上で閲覧するには https://groups.google.com/d/msgid/wasbook-readers/c9a587aa-9a21-4afa-acee-9dc27c07a72b%40googlegroups.com にアクセスしてください。



--
徳丸浩 htok...@gmail.com

notsix

unread,
Oct 24, 2019, 4:37:23 AM10/24/19
to 「体系的に学ぶ 安全なWebアプリケーションの作り方」サポートML
早速ご回答いただきありがとうございます。

「改行を含むデータを送信させないためにbase64エンコードする」という理由で理解できました。ありがとうございます。

2019年10月24日木曜日 7時05分33秒 UTC+9 徳丸浩:
> このグループから退会し、グループからのメールの配信を停止するには wasbook...@googlegroups.com にメールを送信してください。
Reply all
Reply to author
Forward
0 new messages