2 // vim: foldmethod=marker
6 * @author Masaki Fujimoto <fujimoto@php.net>
7 * @license http://www.opensource.org/licenses/bsd-license.php The BSD License
16 * @author Masaki Fujimoto <fujimoto@php.net>
26 /** @var object Ethna_Logger loggerオブジェクト */
29 /** @var string セッション名 */
32 /** @var string セッションデータ保存ディレクトリ */
33 var $session_save_dir;
35 /** @var bool セッション開始フラグ */
36 var $session_start = false;
38 /** @var bool 匿名セッションフラグ */
39 var $anonymous = false;
44 * Ethna_Sessionクラスのコンストラクタ
47 * @param string $appid アプリケーションID(セッション名として使用)
48 * @param string $save_dir セッションデータを保存するディレクトリ
50 function Ethna_Session($appid, $save_dir, $logger)
52 $this->session_name = "${appid}SESSID";
53 $this->session_save_dir = $save_dir;
54 $this->logger =& $logger;
56 if ($this->session_save_dir != "") {
57 session_save_path($this->session_save_dir);
60 session_name($this->session_name);
61 session_cache_limiter('private, must-revalidate');
63 $this->session_start = false;
64 if (isset($_SERVER['REQUEST_METHOD']) == false) {
68 if (strcasecmp($_SERVER['REQUEST_METHOD'], 'post') == 0) {
73 if (array_key_exists($this->session_name, $http_vars)
74 && $http_vars[$this->session_name] != null) {
75 $_COOKIE[$this->session_name] = $http_vars[$this->session_name];
86 if (!empty($_COOKIE[$this->session_name]) ||
87 (ini_get("session.use_trans_sid") == 1 &&
88 !empty($_REQUEST[$this->session_name]))
91 $this->session_start = true;
94 if ($this->isValid() == false) {
95 setcookie($this->session_name, "", 0, "/");
96 $this->session_start = false;
100 if ($this->get('__anonymous__')) {
101 $this->anonymous = true;
110 * @return bool true:正当なセッション false:不当なセッション
114 if (!$this->session_start) {
115 if (!empty($_COOKIE[$this->session_name]) || session_id() != null) {
116 setcookie($this->session_name, "", 0, "/");
121 // check remote address
122 if (!isset($_SESSION['REMOTE_ADDR'])
123 || $this->_validateRemoteAddr($_SESSION['REMOTE_ADDR'],
124 $_SERVER['REMOTE_ADDR']) == false) {
125 // we do not allow this
126 setcookie($this->session_name, "", 0, "/");
128 $this->session_start = false;
139 * @param int $lifetime セッション有効期間(秒単位, 0ならセッションクッキー)
140 * @return bool true:正常終了 false:エラー
142 function start($lifetime = 0, $anonymous = false)
144 if ($this->session_start) {
146 $_SESSION['REMOTE_ADDR'] = $_SERVER['REMOTE_ADDR'];
147 $_SESSION['__anonymous__'] = $anonymous;
151 if (is_null($lifetime)) {
152 ini_set('session.use_cookies', 0);
154 ini_set('session.use_cookies', 1);
157 session_set_cookie_params($lifetime);
158 session_id(Ethna_Util::getRandom());
160 $_SESSION['REMOTE_ADDR'] = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR']: false;
161 $_SESSION['__anonymous__'] = $anonymous;
162 $this->anonymous = $anonymous;
163 $this->session_start = true;
172 * @return bool true:正常終了 false:エラー
176 if (!$this->session_start) {
181 $this->session_start = false;
182 setcookie($this->session_name, "", 0, "/");
191 * @return bool true:正常終了 false:エラー
193 function regenerateId($lifetime = 0, $anonymous = false)
195 if (! $this->session_start) {
202 $this->start($lifetime, $anonymous);
204 unset($tmp['REMOTE_ADDR']);
205 unset($tmp['__anonymous__']);
206 foreach ($tmp as $key => $value) {
207 $_SESSION[$key] = $value;
217 * @param string $name キー
218 * @return mixed 取得した値(null:セッションが開始されていない)
222 if (!$this->session_start) {
226 if (!isset($_SESSION[$name])) {
229 return $_SESSION[$name];
236 * @param string $name キー
237 * @param string $value 値
238 * @return bool true:正常終了 false:エラー(セッションが開始されていない)
240 function set($name, $value)
242 if (!$this->session_start) {
247 $_SESSION[$name] = $value;
256 * @param string $name キー
257 * @return bool true:正常終了 false:エラー(セッションが開始されていない)
259 function remove($name)
261 if (!$this->session_start) {
265 unset($_SESSION[$name]);
271 * セッションが開始されているかどうかを返す
274 * @param string $anonymous 匿名セッションを「開始」とみなすかどうか(default: false)
275 * @return bool true:開始済み false:開始されていない
277 function isStart($anonymous = false)
280 return $this->session_start;
282 if ($this->session_start && $this->isAnonymous() != true) {
294 * @return bool true:匿名セッション false:非匿名セッション/セッション開始されていない
296 function isAnonymous()
298 return $this->anonymous;
302 * セッションに保存されたIPアドレスとアクセス元のIPアドレスが
303 * 同一ネットワーク範囲かどうかを判別する(16bit mask)
306 * @param string $src_ip セッション開始時のアクセス元IPアドレス
307 * @param string $dst_ip 現在のアクセス元IPアドレス
308 * @return bool true:正常終了 false:不正なIPアドレス
310 function _validateRemoteAddr($src_ip, $dst_ip)
312 $src = ip2long($src_ip);
313 $dst = ip2long($dst_ip);
315 if (($src & 0xffff0000) == ($dst & 0xffff0000)) {
318 $this->logger->log(LOG_NOTICE, "session IP validation failed [%s] - [%s]",