マジック・クッキー?(嘘)

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

うちの型落ちMacもぽちぽちとアップデートかけていたりする訳ですが。最近ちょっと多くないですかー?Big Surさん?ちょっと勘弁して欲しいんですけど!確かに明らかにクライアントとして使用すべきMac
Read more
当初は常識的に?レンタルサーバー上でクーロン実行考えていたですが。良く良く考えてみれば。私が今クーロンで実行させたいと思っているスクリプトは、レンタルサーバーで実行する必要全然ない、んですよねー。要は
Read more
php7.2 へのバージョンアップが予定通り、レンタルサーバーさんでされました。一応、事前にドキュメント読んだりはしたつもりだったですが。出ました。思いっ切り出ましたね!エラー。しかも、ちょっと恥ずか
Read more
全然気づいていなかったけれども。コンテンツサイトでjstreeが動かなくなっていたんですよね。ちょっと前にごちょごちょ弄くってはいたので、何かやらかしたか?!と思っていたのですが。(ほら、jsだから、
Read more
ちょっと都合に付き、MySQLをサイトで使うようにしようかなと思い立ちました。でもいきなりレンタルサーバー様でMySQL使うのはリスキー。取り敢えず、検証環境で使えるように、とうことで、やはりNASで
Read more

Recent Comments

Information

緊急連絡は現在ありません。

Recent Update

さて。改装しておよそ1か月経過しました。といっても、見かけは変えてないつもりなのでわからないでしょーが。今回の改装ポイントは、前は完全関数型使用でした、が、今回は可能な限りクラス使用しています。うん、
Read more
DjangoでのエラーをADMINSにメール送信出来る環境を整え。なかなか良い感じにバグフィックス出来るようになってきたな~Sentryお役御免か?なんて良い気になってましたよ、ハイ。すいません、私で
Read more
うちの型落ちMacもぽちぽちとアップデートかけていたりする訳ですが。最近ちょっと多くないですかー?Big Surさん?ちょっと勘弁して欲しいんですけど!確かに明らかにクライアントとして使用すべきMac
Read more
PythonとDjangoアップデートであります。早いですよ、やっぱり!(Pythonも3.9。。。4はいつ頃なんだっけ?確かもうスケジュールされてたような。あれ、Djangoだけかな)Djangoで
Read more
サイト改装、というか、プログラム&フレームワーク切替から少々時間経過しました。(確か8月頭に処理した筈)思わぬエラーや自分的見落としやらミスによるエラー対応もほぼほぼ終了。終息したかなっと思ってます。
Read more

Preview

Information(Board)

サイト改装しました! といいつつ、表向きは全く変わらない(ように作った)筈です。 何かおかしいところがございましたら、ご連絡頂けると助かります。
Read more