tcookie()でtime() - 3600が効かなかった話
前提として
まずcookieの代替としてsessionが使えるならsessionを使ったほうがよさそうです。
理由はセキュリティ的リスクをsessionにするだけで軽減できるから。
また単純なデータの受け渡しなどは環境変数+サーバディレクトリの
パーミッションなどを考えたほうがセキュアになる可能性もありそうです。
(レンサバなどは注意が必要です)
私の今回のケースはSDKツールの関連でcookieを使う必要がありました。
が、有効期限をセッション間のみにするほうがよいとのことでした。
そんな中、setcookie関数を設定している際に起こった問題です。
setcookie関数の第3引数
第3引数でクッキーの有効期限を設定するのですが
よくある下記のような指定方法ではcookieが発行されないという現象が起きました。
setcookie( $name, $value, time() - 3600, $filename, $fqdn, true, true );
これだと単純にcookieが発行されていないという状態になりました。
環境
amazonlinux
php7.1
wordpress4.9.7
セッションクッキーを生成するには
セッション間のみ保持する(ブラウザを閉じると削除される)クッキーを発行するには
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のセッションは裏側でクッキーを発行しサーバに保存しているとのこと。
原因
つかみかねております。
もし発動条件をご存知の方がいらっしゃいましたら
ぜひコメントをお願いいたします。
Author And Source
この問題について(tcookie()でtime() - 3600が効かなかった話), 我々は、より多くの情報をここで見つけました https://qiita.com/SwuBHj8aKGqBKHet/items/9a917f6f0a6e8618d90e著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .