• ベストアンサー

Cookieの発行について

現在、複数のCookieを利用したシステムを構築中ですが、 Cookie管理の1つとして、配列でCookieを発行しようと考えております。 ブラウザ別に保有できるCookie数が限られていますので、 可能なかぎり少ないCookieで管理したいと思います。 そこで質問です。 配列でCookieを発行した場合、ブラウザ側で認識されるのは1つになるのでしょうか? それとも配列の要素分だけCookieを発行した形になるのでしょうか? どなたかお分かりになれば、ご教示いただけますと助かります。 よろしくお願いいたします。   

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.1

フォームで送信する際に <input name="a[0]", value="test"> <input name="a[1]", value="test"> って書いたりすると思いますが、同様にcookieに対して setcookie('a[0]', 'test'); setcookie('a[1]', 'test'); とすることも可能です。形を問わず値の個数分だけCookieの発行されたことになります。配列の要素1つ1つに有効期限などが設定されるということですね。 なお、$_GET, $_POST, $_COOKIE, $_REQUEST の値は信用してはいけません。ユーザー側が自由に改竄することが出来るからです。 ・そもそも送信されずに未定義かもしれない ・配列だと思った場所が文字列になってるかもしれない ・文字列だと思った場所が配列になっるかもしれない ・型は正しいけど、想定していないような値かもしれない いろいろなケースが考えられます。これらに対して正しく対処する必要があります。 ・未定義や型の違いだけ対処出来ればいい → filter_input関数を使う Qiita - $_GET, $_POSTなどを受け取る際の処理 http://qiita.com/mpyw/items/2f9955db1c02eeef43ea ・改竄されたら困る → $_SESSION を使う Qiita - リクエストパラメータ・セッションに関するまとめ http://qiita.com/mpyw/items/7852213f478e8c5a2802 …というか、Cookieの発行個数で悩んでいるのであれば間違いなく $_SESSION を使うべきであると言えるでしょうね。 $_SESSION の利用に必要なのはユーザーを識別する「PHPSESSID」という自動発行されるCookie1つだけで、あとは全部サーバー側に情報が保存されます。

humptydumpty32
質問者

お礼

丁寧なご説明ありがとうございます。 参考になりました。 ただ、今回はCookie数を節約するだけでなく、サーバー側の負担を最小限に抑えるため、 セッションは利用しない方針でおりました。 なので今回は1つのCookieにまとめる形で考えてみたいと思います。

その他の回答 (3)

noname#244856
noname#244856
回答No.4

シリアル形式よりはJSON形式の方がセキュリティ的に余分な懸念が必要ないと思います。いずれにせよバリデーションは必須ですが。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

cookieに保持するならserializeするなりして文字列としてでしょうね cookieの性質上あまり大きなデータは保持できません セッションやサーバー側にrdbで持たせるなど工夫が必要になるかも

noname#244856
noname#244856
回答No.2

(補足) $a[0] = filter_input(INPUT_COOKIE, 'a[0]'); $a[1] = filter_input(INPUT_COOKIE, 'a[1]'); のように、第2引数に配列要素を指定することは出来ません。指定しても「受け取っていない」と見なされます。あくまで普通の文字列の場合に限ります。もしこうする必要がある場合、一つ一つisset,is_string,is_arrayなどで段階的にチェックするか、先ほど紹介した記事中の「filter_input_simple」や「filter_input_array_recursive」を利用してください。 $a[0] = filter_input_simple(INPUT_COOKIE, 'a[0]'); $a[1] = filter_input_simple(INPUT_COOKIE, 'a[1]'); $a = filter_input_array_recursive(INPUT_COOKIE, array('a' => array(null, null)));

関連するQ&A

専門家に質問してみよう