tcookie()でtime() - 3600が効かなかった話


前提として

まずcookieの代替としてsessionが使えるならsessionを使ったほうがよさそうです。
理由はセキュリティ的リスクをsessionにするだけで軽減できるから。
また単純なデータの受け渡しなどは環境変数+サーバディレクトリの
パーミッションなどを考えたほうがセキュアになる可能性もありそうです。
(レンサバなどは注意が必要です)

私の今回のケースはSDKツールの関連でcookieを使う必要がありました。
が、有効期限をセッション間のみにするほうがよいとのことでした。
そんな中、setcookie関数を設定している際に起こった問題です。

setcookie関数の第3引数

第3引数でクッキーの有効期限を設定するのですが
よくある下記のような指定方法ではcookieが発行されないという現象が起きました。

non-generation.php

setcookie( $name, $value, time() - 3600, $filename, $fqdn, true, true );

これだと単純にcookieが発行されていないという状態になりました。

環境

amazonlinux
php7.1
wordpress4.9.7

セッションクッキーを生成するには

セッション間のみ保持する(ブラウザを閉じると削除される)クッキーを発行するには

generat-cookie.php

setcookie( $name, $value, 0, $filepath, $domain, true, true );

と第3引数を0にします。

setcookie関数の注意点

ドメイン属性を第4引数で指定することができます。
恥ずかしながら当方もここを厳密に指定したほうがセキュリティリスクを
減らすことができると思い指定していましたが
指定しないのが最もクッキーの送信範囲が狭く安全な状態になります。

デフォルトでは指定なしの状態とのこと。
具体的にはクッキーを生成したサーバにのみクッキーを送るという動きになります。

例として場面を想定してみると
レンサバを借りていて初期のドメインをもらえる場合があると思います。
Auserid.rensaba.com
共有レンサバの場合ほかの方は以下のアドレスをもらっている場合もありますよね。
Buserid.rensaba.com

この状態でAからsetcookiでドメイン属性をrensaba.comとすると
クッキーを埋め込まれたブラウザはBuserid.rensaba.comにもクッキーを送信してしまう動きになります。

逆に複数のサーバに送信されるクッキーを生成したい場合は
ドメイン属性を使って指定するという使い方になります。

cookieからsessionにすると減るリスク

http通信でデータが飛ばなくなる

通信をするということはデータが飛んでいるということです。
cookieの保存場所はクライアントのブラウザで
sessionの保存場所はサーバ内です。
サーバ内で完結できるアーキテクチャがあればそちらを優先したほうが
セキュリティの観点からはリスクが減らせます。

サイト閲覧者が操作できなくなる

cookieはクライアントのブラウザに保存されるので
削除したり、編集したりできます。
cookie、キャッシュ削除というあれですね。
となるとここにもリスクが発生しますから
そのリスクをなくすためにもsessionがよいとのこと。

phpのセッションはクッキーを発行している

余談ですがphpのセッションは裏側でクッキーを発行しサーバに保存しているとのこと。

原因

つかみかねております。
もし発動条件をご存知の方がいらっしゃいましたら
ぜひコメントをお願いいたします。