I am having problems with my session script, I mostly think it is from to many hours looking at the same script and missing something simple.
The last bug I am working out is that the following session script works great if my session string is numeric, but as soon as I add alpha to the string it is creating an error.
Here is the section that is generating the both alpha an numberic properly:
$create_session = strlen($SESSION_CONFIG [session_string])-1;
for ($i = 0; $i < 32; $i++) {
$Session.=$SESSION_CONFIG [session_string][mt_rand(0,$create_session)];
}
Here is the actual script:
<?php
$SESSION_CONFIG [session_string] = "abcdef0123456789";
$INCLUDED_FILES [session] = true;
require ("$SCRIPTS/xmldata.php");
// ------------------------------------------------------------------
// save session persistent data
// ------------------------------------------------------------------
function SaveSessionData () {
global $Session;
global $SESSION_DATA;
global $DEBUG_SW;
reset ($SESSION_DATA);
while (list ($key, $val) = each ($SESSION_DATA)) {
if ($val)
global $$key;
$data .= XmlDataSave ($key, $$key);
}
DBQuery ("UPDATE Sessions SET " .
"session_data = '" . addslashes ($data) . "' " .
"WHERE session_no = '$Session'");
}
// ------------------------------------------------------------------
// get session data from URL
// ------------------------------------------------------------------
function GetSessionURLData ($prefix = "ses_") {
global $HTTP_GET_VARS;
global $SESSION_DATA;
if ($HTTP_GET_VARS) {
$plen = strlen ($prefix);
reset ($HTTP_GET_VARS);
while (list ($key, $val) = each ($HTTP_GET_VARS)) {
if (substr ($key, 0, $plen) == $prefix) {
global $$key;
$SESSION_DATA [$key] = 1;
$$key = $val;
}
}
}
SaveSessionData ();
}
// check for cookies required
if (($SESSION_COOKIE) && ($HTTP_COOKIE_VARS ['Session'] == "")) {
header ("Location: /errors/?error=nocookie");
exit;
}
// initialize fields
$tmstmp = date ("YmdHis");
$access_limit = date ("YmdHis", time () - ($SESSION_CONFIG [session_limit] 60));
$session_limit = date ("YmdHis", time () - ($SESSION_CONFIG [session_days] 24 * 3600));
// If we don't have a user or session make them zero
if ($User == "") $User = 0;
if ($Session == "") $Session = 0;
// verify current session
if ($Session) {
$SESSION_FIELDS = DBGetArray ("SELECT * FROM Sessions WHERE " .
"session_no = '$Session' AND " .
"last_access > '$access_limit' " .
"ORDER BY session_no DESC LIMIT 1");
}
if (!$SESSION_FIELDS)
$Session = 0;
// check if user number has been changed
if ($Session && ($User != $SESSION_FIELDS ['user_no'])) {
$User = $SESSION_FIELDS ['user_no'];
$set_user = 1;
}
// set User_Field array
if ($User) {
$USER_FIELDS = DBGetArray ("SELECT * FROM Users WHERE user_no = '$User' ");
}
if (!$USER_FIELDS) {
$User = 0;
$set_user = 1;
}
if (!$User && $SESSION_CONFIG [session_create]) {
DBQuery ("INSERT INTO Users (first_session) VALUES (NOW()) ");
$User = DBInsertID ();
$set_user = 1;
}
// create a new session record
if (!$Session) {
// delete all session records older than $Session_Days
DBQuery ("DELETE FROM Sessions WHERE last_access < '$session_limit'");
// delete all related records with no session record
for (reset ($SESSION_CONFIG [log_cleanup]); $table = current ($SESSION_CONFIG [log_cleanup]); next ($SESSION_CONFIG [log_cleanup])) {
$query = DBQuery ("SELECT ${table}.session_no ".
"FROM $table LEFT JOIN Sessions USING (session_no)" .
"WHERE Sessions.session_no IS NULL ");
while (list ($old_session) = DBFetchRow ($query)) {
DBQuery ("DELETE FROM $table WHERE session_no = '$old_session'");
}
DBFreeResult ($query);
}
// Clean up expired sessions
DBQuery ("UPDATE Sessions SET " .
"user_verified = 'no', " .
"session_data = NULL " .
"WHERE last_access < '$access_limit'");
$session_data = '';
// detect users browser information
include ("$SCRIPTS/browser.php");
// create new session record
mt_srand(time());
$create_session = strlen($SESSION_CONFIG [session_string])-1;
for ($i = 0; $i < 32; $i++) {
$Session.=$SESSION_CONFIG [session_string][mt_rand(0,$create_session)];
}
DBQuery ("INSERT INTO Sessions (" .
"session_no, " .
"user_no, " .
"ip_address, " .
"browser, " .
"version, " .
"system, " .
"first_access, " .
"last_access, " .
"num_access, " .
"session_data " .
") VALUES (" .
"'" . addslashes ($Session) . "', " .
"'" . addslashes ($User) . "', " .
"'" . addslashes ($REMOTE_ADDR) . "', " .
"'" . addslashes ($BROWSER [name]) . "', " .
"'" . addslashes ($BROWSER [major]) . "', " .
"'" . addslashes ($BROWSER [system]) . "', " .
"NOW(), " .
"NOW(), " .
"1," .
"'" . addslashes ($session_data) . "' " .
")");
// set the session cookie
setcookie ("Session", "$Session", 0, "/", $Session_Domain, 0);
// set Session_Fields
$SESSION_FIELDS = DBGetArray ("SELECT * FROM Sessions WHERE session_no = '$Session' ");
// update the user record
if ($User) {
DBQuery ("UPDATE Users SET " .
"first_session = IF(first_session is NULL, NOW(), first_session), " .
"last_session = NOW(), " .
"num_access = num_access + 1, " .
"num_sessions = num_sessions + 1 " .
"WHERE user_no = '$User'");
}
} else {
// update the session time of last access
DBQuery ("UPDATE Sessions SET " .
"last_access = NOW(), " .
"num_access = num_access + 1 " .
"WHERE session_no = $Session ");
DBQuery ("UPDATE Users SET " .
"num_access = num_access + 1 " .
"WHERE user_no = '$User'");
}
// set the user cookie if the user number has been changed
if ($set_user) {
setcookie ("User", "$User", time ()+ (236524*3600), "/", $Session_Domain, 0);
}
$SESSID = "Session=$Session";
// set session data array and variables
$SESSION_DATA = XmlDataLoad ($SESSION_FIELDS ['session_data']);
// ------------------------------------------------------------------
?>