• ベストアンサー

Cookieの発行について

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

  • PHP
  • 回答数4
  • ありがとう数1

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

  • ベストアンサー
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

  • 消えないCookie?

    Webブラウザの設定で、Cookieの保存期間を「ブラウザを終了するまで」としています。 しかし、Webブラウザ終了後に、ウィルススキャンを実行するとTracking Cookieを検出した と通知されることがあります。 ブラウザを起動し直した後、オプションから「Cookieを表示」すると 何も表示されないため、Cookieは全て消えている認識なんですが。。。 ブラウザを終了しても消えていないCookieがあるのでしょうか? 気持ちが悪いので、どなたかご教示ください。 #ブラウザはFireFoxで、OSはWindows7です よろしくお願い致します。

  • PHP4 setcookie関数でIE6上でCookieが発行されない

    お世話になっております。 件名の通りですが、(クライアント)Netscape7.1やOpera上では正常にCookieが発行されて、Cookieにより条件分岐処理が行えるのですが、IE上ではそれが出来ません。 以下のような設定でCookieを発行しようとしています。 (サーバー) setcookie("user_test_id",$row->user_id,time()+60*60*24*60,"/test_folder/") ; ※$row->user_idとはMysqlに登録されている文字列を取得しています 構築環境は下記の通りです。 (サーバー) WindowsXP上でapache_2.0.55、php-4.4.2 ※PHPは正常に動作中(他のスクリプトは問題ありません) 同じ様にLocalhostにAnhttpd1.4[Webサーバー]とPHP4で上記と同じシステムを構築した場合、IEでも正常にCookieが発行されます。ということは、Apacheの設定に不備があるのでは?っとにらんでいるのですが、具体的にどこをいじれば良いのか分かりません。 原因究明に繋がるヒント(回答)をご存知の方、どうかご教授お願い致します。よろしくお願い致します。

    • 締切済み
    • PHP
  • Cookieを利用したログインについて

    http://tenderfeel.xsrv.jp/php/628/ に、Cookieを利用したサンプルが掲載されているのですが、 このサンプルでは、セッションIDを発行せずに、セッション管理をすべてCookieで行なっている、のでしょうか? また、処理としては、サーバー側にはデータを何も保持せずに、 アクセスする度にブラウザから、(ハッシュ化したパスワードを含む)Cookie情報を送信して、 その一致を確認している、ということになるのでしょうか? セキュリティ的には、問題とかないのでしょうか? 次に、セッション版についてですが、 セッションIDは、スクリプトのどの部分で発行しているのでしょうか? また、処理としては、セッションIDはブラウザに、 それ以外のセッション変数は、サーバ側のセッション(?)に保存、 ということになるのでしょうか?

    • ベストアンサー
    • PHP
  • cookieが無効のブラウザへの対応方法

    PHP+MySQL+cookie(セッション管理)にてアクセス解析を構築しております。 仕組みとしては、サイトにアクセスがあった場合に session_start()にてPHPSESSIDを発行し、DBに記録して 以降の行動をPHPSESSID毎にユーザーを特定して記録しております。 この時、DBにはcookieを有効にしたアクセスは 直接「123123abcd123123abcd123123abcd12」の形で記録され 逆にcookieが無効(?)の場合は「PHPSESSID=123123abcd123123abcd123123abcd12」 という形で記録されております。 (”isset($_COOKIE["PHPSESSID"])”にて判定しています。) cookieが有効の場合、1セッション内の行動であれば 一度記録したPHPSESSIDにてユーザーを特定することができ、問題ないのですが cookieが無効の場合だと、PHPSESSIDは発行されますが URLにパラメータとして持たせ続けないと、その行動が どのユーザーのものか特定できないと思います。 また、アクセス解析を見てみると、結構cookieを無効にした ユーザーからのアクセスも多く、無視できない数字でした。 ここで質問ですが、 1.「PHPSESSID=123123abcd123123abcd123123abcd12」の形で 記録されているものはcookieが無効のアクセスと考えていいですか? 2.cookieが無効の場合、上記の値を保持し続ける 良い方法があれば教えて下さい。(サイト内で)

    • ベストアンサー
    • PHP
  • メールマガジン発行について

    現在、会員サイトでメールマガジンを発行しています。 今はOutlookにてBCC配信をしていますが、会員数が1000人を超えてきて、配信が大変になってきました。 そこで、WEB上で簡単に配信ができるようにならないかを検討しています。 しかし、次の理由により「まぐまぐ」等のメルマガ発行スタンド、ASPサービス利用は考えていません。 1.会員を自分で管理したい。 (レンタルWEBサーバーを利用しているので、そこで管理したい。もしくは自社サーバーを構築して管理) 2.不特定多数の人に登録して欲しくない 3.登録できる会員は厳選したい。 4.できることなら配信システムをカスタマイズしたい。 などです。 現在考えているのが、 1.CGI等のプログラムで配信(レンタルサーバー) 2.自社サーバーを構築 のどちらかです。 そこで質問なのですが、 1.CGI等のプログラムで配信の場合 メールマガジン発行プログラムを配布しているサイトは数多くありますが、予約配信できるプログラムを見たことがありません。 予約配信(配信時間指定)できることが大前提で、CGI、PHPなどのプログラムを配布しているサイトはありますか?(フリー、有料どちらでも構いません) 2.自社サーバーを構築の場合 これは最終手段ですが、CGIなどのプログラムが使えない(予約配信が根本的に無理な)場合です。 自社サーバーを組むとしたら、やはりWindows系(ASP)サーバが一般的なのでしょうか? また、サーバ構築を専門業者に依頼した場合は、メールマガジン発行プログラム作成を含めて、サーバ構築費用はどれぐらいかかるのでしょうか? ご返答よろしくお願い致します。

  • 別ドメインのCookie参照方式

    別ドメインで吐いたCookieを管理できるか否かで悩んでおります。 本サイト:aaa.co.jp 子サイト:bbb.co.jp 上記のようなドメイン構成で本サイト・子サイト共に 同じ内容の情報を管理するCookieをローカルマシンに吐いて、 本サイトのドメイン内で、両方の情報を一覧表示したいのですが、 可能なのでしょうか。 ex)amazon.co.jpで「A」という書籍をウィッシュリストに登録   amazon-business.co.jpで「B」という書籍をウィッシュリストに登録   amazon.co.jpでウィッシュリストの管理をする際に「A」と「B」を一緒に管理できる。 恐らく、技術的には可能であると考えているのですが、 「セキュリティ上、非常に問題がある」や「ブラウザや セキュリティソフトに不正な処理として判断されてしまう」 等懸念点がございましたら、ご意見をいただけると助かります。 また、実装するとしたら、どのようなイメージで Cookieを吐いて、どのように読み込むかをご教示いただけると 非常に助かります。 よろしくお願い致します。

  • 二次元配列における要素数のはじき出し

    普通、配列の要素数を出すとき $num = @list; で良いですよね? ですが、二次元配列で、 $num = @list[1]; って形にするとエラーになります。 どうすればいいのでしょうか?

    • ベストアンサー
    • Perl
  • phpのsessionとcookieについて

    質問は以下に2つです。 プログラムの説明は、pass,idから認証を行い、sessionidを発行します。二度目の以降はsessioidから認証します。 sidpost.phpからpostでIDとパスワードを入力させます。 データベースはid, pass, sidの3つのカラムがあります。 <?PHP require_once'DB.php'; session_name("sid"); session_start(); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <?php $id = $_POST['id']; $pass =$_POST['pass']; $cookie = $_COOKIE['sid']; $sid = session_id(); //データベース参照 //プレースホルダーを使用 //id からpassを参照する //cookie から sidを参照する $data=$sth->fetchRow(DB_FETCHMODE_ASSOC);//参照したデータを$dataの連想配列に格納 //sid保存のプレースホルダー $sth2 = $dbh->prepare('UPDATE accountid SET sid=? WHERE id=? AND pass=?'); //cookieが保存されていない場合 if(!isset($cookie) && isset($pass) && isset($id)){ //idとpassから認証 if($pass === $data['pass']){ $sth2 = $dbh->execute($sth2, array($sid, $id, $pass)); echo "初めてのログインsid登録"; } //sidがある場合cookieとデータベースのsidを比較 }else if(isset($cookie)){ if($cookie == $data['sid']) echo "sidあり成功"; //クッキーがあり、データベースと一致しない場合,sidを破棄する }else{ echo"あるはずのクッキー" .$COOKIE['sid']."<br>"; $_SESSION=array(); setcookie('sid', '', time()-3600); session_destroy(); echo "ないはずのクックキー".$_COOKIE['sid']; } //それ以外は入力フォームにリダイレクト }else{ header("location: ./sidpost.php?error=error"); } $dbh->disconnect(); ?> </body> </html> 上のようなセッション管理のプログラムを書きました。 質問は2つありまして、 ・1つめは、通常セッション管理を行う際の、条件はどのようにするのが一般的ですか? IDとパスワードがデータベースと一致する場合としない場合の2通り、cookieがある場合、ない場合の2通り、もしcookieがある場合は、データベースの値と一致する場合としない場合の2通りが考えられます。一番最適な条件文はどのようにすればよいでしょうか? またその処理はどのようにすればよいのでしょうか。 例えばcookieがあり、データベースと一致しない場合、$_SESSIONの初期化、setcookieでクッキーの削除、session_destroy()するなど。。。なにかよくわからなくなってしまいました。 ・二つ目は、 上のプログラムではじめsession_name('sid')およびsession_start()を宣言し、クライアントとサーバに$sid=session_idを発行しています。なので、$_COOKIE['sid'];の値には session_id()($sid)になっているはずです。 下のほうで、セッションの管理を行う際、 //クッキーがある場合 else if(isset($cookie)){ if($cookie == $data['sid']) echo "sidあり成功"; //クッキーがあり、データベースと一致しない場合,sidを破棄する }else{ echo"あるはずのクッキー" .$COOKIE['sid']."<br>"; $_SESSION=array(); setcookie('sid', '', time()-3600); session_destroy(); echo "ないはずのクックキー".$_COOKIE['sid']; } クッキーがあり、データベースと一致しない場合に、sessionおよび、cookieの破棄をしています。この前後でechoをもちいて$_COOKIE['sid']の値を出力すると、 破棄するの前のechoでクッキーが表示されず、 破棄したあとのechoでクッキーが表示されました。 なぜこのような結果になるのですか、逆では?と思いました。

    • 締切済み
    • PHP
  • Accessでのシステム構築について

    工場で生産管理システムの構築を任されました。Accessを使用しての構築になるのですが、Accessとシステム構築が初心者のため何から手を付けてよいかわかりません。 一からご教示いただける方いましたら、よろしくお願いいたします。

  • PHPの配列要素に別の配列を入れるには?

    とある商品情報を管理するPHPプログラムを書いています。 最終的に、$Paramsの'goodIdArray'という要素に商品情報を2つ入れたいと思っています。 以下の通りに書いてみたんですが、うまくいきません。 $goods_id = array( 'goods_id' => '商品1', 'goods_id2' => '商品2'); $info['goods_id'] = $goods_id;  #$info配列の「goods_id」という要素にgoods_id配列を入れる $goodsIdArray[] = $info['goods_id']['goods_id']; #goodsIdArrayに商品1を入れる $goodsIdArray[] = $info['goods_id']['goods_id2']; #goodsIdArrayに商品2を入れる $Params = array('goodIdArray' => $goodsIdArray) #inParams配列の「goodIdArray」という要素に$goodsIdArray(商品1と商品2)を入れる 無駄に変数を使いまくっているように見えますが、もともとのプログラムが複数のPHPファイルにまたがって動作しているため、変数がこれだけの数になっています。 そもそも、ある配列の要素に別の配列(複数要素をもつもの)は入れられないんでしょうか。 素人の質問でトンチンカンなことを言っているかもしれませんが、ご回答お願いします。

    • 締切済み
    • PHP

専門家に質問してみよう