\n"; if (empty($_COOKIE[$GLOBALS['chat_session_name']]) && empty($_REQUEST[$GLOBALS['chat_session_name']])) { $empty = true; echo ''; session_id(md5(uniqid(rand()).time())); } session_start(); if (($empty == false) && empty($_SESSION['session_id'])) { session_regenerate_id(); // prevent fixation attacks echo ''; } //echo "\n\n"; $_SESSION['session_id'] = session_id(); //echo "\n"; if (!preg_match('@^[a-z0-9]{32}$@', $_SESSION['session_id'])) { ChatSessionRestart('Invalid Session ID', FALSE); return false; } if (empty($_SESSION['client_id'])) { $_SESSION['client_id'] = BrowserID(); $_SESSION['client_id_raw'] = BrowserRawID(); } else if ($_SESSION['client_id'] != BrowserID()) { $reason = 'Client BrowserID changed, possible session hijacking.'; $reason .= "\n New ID: ".BrowserID().' :: '.BrowserRawID(); $reason .= "\n Old ID: {$_SESSION['client_id']} :: {$_SESSION['client_id_raw']}"; ChatSessionRestart($reason, FALSE); return false; } if (empty($_SESSION['chap'])) { $_SESSION['chap'] = array(); $_SESSION['chap']['challenge'] = sha1(uniqid(rand())); } if (empty($_SESSION['security'])) $_SESSION['security'] = 1; if (!is_array($_SESSION['host'])) { $_SESSION['host'] = array(); $_SESSION['host']['ip'] = $_SERVER['REMOTE_ADDR']; $_SESSION['host']['addr'] = @gethostbyaddr($_SERVER['REMOTE_ADDR']); $_SESSION['host']['country'] = LookupIP2Country($_SERVER['REMOTE_ADDR']); //* if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $_SESSION['host']['proxyip'] = $_SERVER['HTTP_X_FORWARDED_FOR']; $_SESSION['host']['proxyaddr'] = @gethostbyaddr($_SERVER['HTTP_X_FORWARDED_FOR']); $_SESSION['host']['proxycountry'] = LookupIP2Country($_SERVER['HTTP_X_FORWARDED_FOR']); } //*/ } if ($_SESSION['security'] >= 2) { if ($_SESSION['host']['ip'] != $_SERVER['REMOTE_ADDR']) { if ($_SESSION['security'] == 4) { ChatSessionRestart('IP must not change when Session Security is at Level 4.', FALSE); return false; } if ($_SESSION['security'] == 3) { if (IPClassA($_SESSION['host']['ip']) != IPClassA($_SERVER['REMOTE_ADDR'])) { ChatSessionRestart('First quad of IP must not change when Session Security is at Level 3.', FALSE); return false; } } // FIXME: If it doesn't resolve it will compare the last 7 digits of the IP // which is not very correct to do. $host = @gethostbyaddr($_SERVER['REMOTE_ADDR']); if (substr($host, -7) == substr($_SESSION['host']['addr'], -7)) { $_SESSION['host']['ip'] = $_SERVER['REMOTE_ADDR']; $_SESSION['host']['country'] = LookupIP2Country($_SERVER['REMOTE_ADDR']); } else { ChatSessionRestart('Last 7 characters of the resolved hostname did not match.', FALSE); return false; } } /* if ($_SESSION['host']['proxyip'] != $_SERVER['HTTP_X_FORWARDED_FOR']) { $host = @gethostbyaddr($_SERVER['HTTP_X_FORWARDED_FOR']); if (substr($host, -7) == substr($_SESSION['host']['proxyaddr'], -7)) { $_SESSION['host']['proxyip'] = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { ChatSessionRestart('Last 7 characters of the proxied hostname did not match.'); return false; } } */ } if (!is_array($_SESSION['chats'])) $_SESSION['chats'] = array(); if (!is_array($_SESSION['imagebans'])) $_SESSION['imagebans'] = array(); //$_SESSION['client_start'] = time(); //$_SESSION['client_timer'] = time()-$_SESSION['client_start']; $_SESSION['chats'][0]['ident'] = substr(md5($_SESSION['session_id']), 0, 8); $_SESSION['chats'][0]['oldname'] = $_SESSION['chats'][0]['username']; //if (!empty($_SESSION['chats'][0]['id'])) // $_SESSION['chats'][0]['ident'] = substr(md5($_SESSION['chats'][0]['id']), 0, 8); setcookie($GLOBALS['chat_session_name'], $_SESSION['session_id'], time()+$GLOBALS['chat_session_life'], '/', '.pjj.cc'); foreach($_SESSION['chats'] as $key => $val) { if (($key > 0) && ($val['lasthit'] <= time()-900)) { unset($_SESSION['chats'][$key]); } } AddToViewers(); session_write_close(); session_start(); } function ChatSessionKill($reason='') { //$_SESSION = array(); //session_destroy(); session_write_close(); $_SESSION = array(); if ($reason) echo ""; } function ChatSessionRestart($reason='', $natural=TRUE) { if (!$natural) { $mail = $reason."\n\n".var_export($_SESSION, TRUE); mail('sessions@projectjj.com', 'ASR by '.$_SERVER['REMOTE_ADDR'], $mail); } ChatSessionKill($reason); session_id(md5(uniqid(time().'JJ'.rand()))); ChatSessionInit(); } // Automatic session startup //mmcache_set_session_handlers(); MMC_Lock('Session.'.$_COOKIE['ChatID']); ChatSessionInit(); ?>