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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

1244閲覧

unserializeを安全に行う方法がわかりません。

yayak

総合スコア66

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/05/19 10:28

【やりたいこと】
ユーザーがPOSTしたarrayデータをDBに保存し、保存したデータをWEBページに表示する際、arrayデータをforeachで回したいと思っています。

【問題】
ユーザーがPOSTしたarrayデータは、そのままではDBに保存できなかったので、serializeしてからDBに保存しました。
そして、そのデータをWEBページに表示する際、arrayデータをforeachで回すために、unserializeを使おうと考え、以下のようなコードを考えました。

<?php $array = serializeしてからDBに保存されたarrayデータをSQL文で取得 // 上記の$arrayをunserializeする $array = unserialize($array); foreach( $array as $key => $value ){ $html .= $key.'は'.$value.'です。<br>'; } echo $html; //ページに出力 ?>

しかし、unserializeのマニュアルページ(https://www.php.net/manual/ja/function.unserialize.php)に、以下のように書かれていました。

============================
ユーザーからの入力をそのまま unserialize() に渡してはいけません。 アンシリアライズの時には、オブジェクトのインスタンス生成やオートローディングなどで コードが実行されることがあり、悪意のあるユーザーがこれを悪用するかもしれないからです。 シリアル化したデータをユーザーに渡す必要がある場合は、安全で標準的なデータ交換フォーマットである JSON などを使うようにしましょう。 json_decode() および json_encode() を利用します。
============================

私はJSONに関する知識が浅く、内容がよく理解できず、手が止まってしまいました。
つまり、上記に書いた私のコードは、危険ということでしょうか。

だとしたら、私はどのようにして「安全に」ユーザーがPOSTしたarrayデータを、その後、ページにforeachで出力すればよいのでしょうか。JSONを使用するとありますが、具体的にどのようにJSONを使えばよいかわからず、途方にくれております。

どなたか、道しるべを頂けましたら幸いです。
何卒、よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

特に問題ありません。

シリアル化は自分のコードで行って、その結果をデータベースに保管して取り出すだけなので、「シリアル化したデータをユーザーに渡す」状況ではありません。

投稿2020/05/19 10:33

maisumakun

総合スコア146018

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

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

maisumakun

2020/05/19 10:34

もっとも、シリアル化したデータを突っ込むよりは、データベースをきちっと正規化して設計するほうがいいかと思います。
yayak

2020/05/19 11:19 編集

maisumakun様、有難うございます。「シリアル化したデータをユーザーに渡す」状況ではなかったのですね。ご教授いただき、心より感謝申し上げます。 >データベースをきちっと正規化して設計するほうがいいかと思います。 現在、arrayの中身は連想配列となっていて、その数はユーザー側でどんどん増やせます。 そのような状況に合わせてDBを設計するための知識が浅いため、さらに知識と経験を積みたいと思います。有難うございます。
maisumakun

2020/05/19 11:21

そのような場合の必要悪として「EAV」という手法もあります…が、「項目まで完全にユーザーの任意」となると、DB側では保存・表示だけできればいいので、シリアライズ形のままでもいいかも知れないです。
guest

0

ベストアンサー

ほぼ解決されたようですが、json_encode / json_decodeについては以下のサンプルを動かしてみたら分かると思います。

PHP

1<?php 2 $a = ['abc', 5, 6.5]; 3 $json = json_encode($a); 4 5 echo "json=$json\n"; 6 7 $b = json_decode($json, true); 8 var_dump($b);

実行結果は以下となります。

json=["abc",5,6.5] array(3) { [0]=> string(3) "abc" [1]=> int(5) [2]=> float(6.5) }

maisumakunさんの指摘の通り、提示された状況では危険はありませんが、serialize / unserialize は使い方によっては大変危険なので、JSONですむ応用ならJSONを使うべきだと思います。
serialize / unserialize の危険性については私の以下のYouTube動画を見ていただくのがよいと思います。

安全でないデシリアライゼーション入門~基礎編~

投稿2020/05/19 11:26

編集2020/05/19 11:30
ockeghem

総合スコア11705

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

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

yayak

2020/05/19 12:33

ockeghem様、いつもツイッターやYoutube拝見させていただき勉強させて頂いております。 自分で試してみるべきところ、わざわざコードに示していただき、恐縮の限りです。 Youtubeも拝見させていただきましたが、大変勉強になりました。有難うございます。
guest

0

実際にやってみたら分かるかと思いますが、
json_encode()してDBに保存して、取り出したデータをjson_decode() をすれば良いので、JSONを直接触るとか考えなきゃいけないとかはありません。

投稿2020/05/19 10:34

m.ts10806

総合スコア80875

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

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

yayak

2020/05/19 11:09 編集

m.ts10806様、有難うございます。 私は何やら勘違いしていたようですね。 保存時:arrayデータをserialize()して、さらにjson_encode()をしてDBに保存。 出力時:DBのデータをunserialize()して、さらに json_decode()してから出力。 というふうに思い込んでいました。 そうではなく、 保存時:arrayデータを、serialize()は使わず、json_encode()を使用してからDBに保存。 出力時:DBのデータを、unserialize()は使わず、 json_decode()してから出力。 ということだったのでしょうか?
m.ts10806

2020/05/19 11:40

json_encode()および json_decode()のPHPマニュアルのページを確認し、簡単なテストコードを書いてみては如何でしょうか。
m.ts10806

2020/05/19 11:40

なので「実際にやってみたら分かるかと思いますが、」と前置きしています。
yayak

2020/05/19 12:31

m.ts10806様、かしこまりました。やってみます! 有難うございます<(_ _)>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問