マジック・クッキー?(嘘)
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)