マジック・クッキー?(嘘)
2017年5月29日19:00 公開
php7へのバージョンアップで発生したクッキー使用の認証エラーについて。
自分的には結論出たというか、元々の処理に戻してエラーが出なくなったので、これで解決というか、fixにしたいと思います。
結局、やはりphp7になったら型宣言について厳格になったというのが、最終的っつーか、根本的な原因なんでしょうね。
ただ今回はそれだけでなく。
私、set_cookie
は、ネイティブphpの関数呼んでいると思っていたんですけれど。
開発環境のエラーメッセージを見ていたら、/core/input.php
でエラー、なんてあったりしたんですよね。
ということは、framework
である
CodeIgniter
のシステム部分で出ているんだと気付いて、チェックしてみたところが以下のコードです。
CodeIgniter /system/core/input.php /** * Set cookie * * Accepts an arbitrary number of parameters (up to 7) or an associative * array in the first parameter containing all the values. * * @paramstring|mixed[]$nameCookie name or an array containing parameters * @paramstring$valueCookie value * @paramint$expireCookie expiration time in seconds * @paramstring$domainCookie domain (e.g.: '.yourdomain.com') * @paramstring$pathCookie path (default: '/') * @paramstring$prefixCookie name prefix * @parambool$secureWhether to only transfer cookies via SSL * @parambool$httponlyWhether to only makes the cookie accessible via HTTP (no javascript) * @returnvoid */ public function set_cookie($name, $value = '', $expire = '', $domain = '', $path = '/', $prefix = '', $secure = NULL, $httponly = NULL) { if (is_array($name)) { // always leave 'name' in last place, as the loop will break otherwise, due to $$item foreach (array('value', 'expire', 'domain', 'path', 'prefix', 'secure', 'httponly', 'name') as $item) { if (isset($name[$item])) { $$item = $name[$item]; } } } if ($prefix === '' && config_item('cookie_prefix') !== '') { $prefix = config_item('cookie_prefix'); } if ($domain == '' && config_item('cookie_domain') != '') { $domain = config_item('cookie_domain'); } if ($path === '/' && config_item('cookie_path') !== '/') { $path = config_item('cookie_path'); } $secure = ($secure === NULL && config_item('cookie_secure') !== NULL) ? (bool) config_item('cookie_secure') : (bool) $secure; $httponly = ($httponly === NULL && config_item('cookie_httponly') !== NULL) ? (bool) config_item('cookie_httponly') : (bool) $httponly; if ( ! is_numeric($expire)) { $expire = time() - 86500; } else { $expire = ($expire > 0) ? time() + $expire : 0; } setcookie($prefix.$name, $value, $expire, $path, $domain, $secure, $httponly); }
このコードで何が引っかかっていたかというと。
CodeIgniter の set_cookie では、 expire として渡された int値をシステム日付(Unix)に足して、phpネイティブの setcookie に渡しているんですよね。
で、私は、自分で書いていたコードで、set_cookie の expire に time()+有効時間 を渡していました。
おそらく、この段階で expire値は結構ギリギリだったかも?
でこれを更に time() にプラスしていたので、要は値的に int でなくなっていたんじゃないでしょうか。
で問題の /core/input.php 内の set_cookie 関数(メソッド)で、phpネイティブの setcookie にexpire を渡す時に型宣言エラー(int型でない)となってしまったのではないか、と。
こんな風に推測しました。
一応、きちんと説明付くんじゃないかな~
php5で平気だったのは、ま、元々そうなんだけど、phpが型についてはある意味大らかっつーかアバウトっつーかいい加減で、「ん?なんか来た?……ま、いいか、やっとこ♪」という風に処理していてくれたんじゃないかなぁ。
きっちりしたプログラマっつーかエンジニア気質の人は、phpのこういう所が嫌なんだろうけど。
ザッパーな私は親近感を覚えるphpの判断&挙動だったりしますv
でも徐々に、こういう所、なくなっていっちゃうんでしょうねぇ。
メニューページ
メインコンテンツ
タグ別
公開日別
Popular Entries
Recent Comments
Information
Recent Update
Preview
Information(Board)