PDA

View Full Version : ذخیره دستی SESSION ها



sweb
شنبه 24 آذر 1386, 20:19 عصر
با درود من می خوام در مورد نحوه ذخیره سازی در SESSION ها بصورت دستی سوال کنم.

بهتره یادآوری کنم که این روش یکی از راهکار های امنیتی برای برنامه هایی هستند که برروی سرور هایی پیاده سازی میشند که چیندین وب سایت را میزبانی میکنه و خب پوشه tmp لینوکس و دیگه راهی واسه استخراج اطلاعات سیشن ها برای هکر ها . :لبخند:


خب واسه این کار باید از تابع session_set_save_handler رو قبل از session_start اجرا کرد. ورودی هاشم طبق رفرنس مشخصه (توابع open close read write delete gc) ... مشکلی تو این مسائل نیست.

من اینو (http://phpsec.org/projects/guide/5.html#5.1) تست کردم مشکلی نیست فقط برای بهره برداری ازش میخوام اولاً از کلاس دیتابیسی که خودم ساختم استفاده کنم بعد هم کلیه توابع ورودی رو داخل یک کلاس بزارم و به مشکل بر می خورم...


2 تا مشکل وجود داره :
1 . اینکه من میخوام از یک کلاس برای توابع استفاده کنم ولی به مشکل بر می خورم.
2 . من از ابجکت درست شده توسط یک کلاس برای ذخیره سازی در سیشن استفاده می کنم و به مشکل بر می خورم در حالی که اگه دستورات رو مستقیماً بدون استفاده از کلاس می دم به مشکل بر نمخورم.

erorr ها رو هم تو یک comment نوشتم تو کد.
امیدوارم عزیزان بتونن کمک کنن و عزیزانی که اطلاعات کافی دارن راهنمایی کنن متشکر. :لبخند:

کلاس sql من هم به صورت زیره :




/*

-- MySQL Table SQL :

CREATE TABLE IF NOT EXISTS `main_session` (
`session_id` varchar(32) collate utf8_bin NOT NULL,
`session_access` int(11) unsigned default NULL,
`session_data` text collate utf8_bin,
PRIMARY KEY (`session_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

*/


$dbserv = "localhost";
$dbuser = "root";
$dbpass = "";



$dbname = array(
"main",
);

class Sql
{
public $link;
public $result;
public function connect()
{
global $dbserv, $dbuser, $dbpass;
$this->link = mysql_pconnect($dbserv, $dbuser, $dbpass);
}
public function query($query, $dbindx = 0)
{
global $dbname;
mysql_select_db($dbname[$dbindx], $this->link);
mysql_query("SET NAMES `utf8`;", $this->link);
$this->result = mysql_query($string, $this->link);
}
public function close()
{
return mysql_close($this->link);
}
}

class Session
{
public function open()
{
global $sql;
if($sql->link)
{
return true;
}
return false;
}
public function close()
{
return true;
}
public function read($id)
{
global $sql;
$query = sprintf("SELECT `session_data` FROM `main_session` WHERE `session_id` = '%s'", mysql_real_escape_string($id));
$sql->query($query);
if ($sql->result)
{
if (mysql_num_rows($sql->result) == 1)
{
$row = mysql_fetch_array($sql->result);
return $row["session_data"];
}
}
return null;
}
public function write($id, $data)
{
global $sql;
$query = sprintf("REPLACE INTO `main_session` (`session_id`, `session_access`, `session_data`) VALUES ('%s', '%s', '%s');", mysql_real_escape_string($id), mysql_real_escape_string(time()), mysql_real_escape_string($data));
$sql->query($query);
return $sql->result;
}
public function delete($id)
{
global $sql;
$query = sprintf("DELETE FROM `main_session` WHERE `session_id` = '%s'", mysql_real_escape_string($id));
$sql->query($query);
return $sql->result;
}
public function gc($max)
{
global $sql;
$query = sprintf("DELETE FROM `main_session` WHERE `session_access` < '%s'", mysql_real_escape_string(time() - $max));
$sql->query($query);
return $sql->result;
}
}

$sql = new Sql();
$sql->connect();

session_set_save_handler("Session::open", "Session::close", "Session::read", "Session::write", "Session::delete", "Session::gc");

/*
This metod also hase been tested :

$mysh = new Session();
session_set_save_handler("$mysh->open", "$mysh->close", "$mysh->read", "$mysh->write", "$mysh->delete", "$mysh->gc");

*/

session_start();

$_SESSION["foo"] = "bar";
echo $_SESSION["foo"];


/* ERORRS :

Warning: session_set_save_handler() [function.session-set-save-handler]: Argument 1 is not a valid callback in E:\www\temp\sh.php on line 104

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at E:\www\temp\sh.php:104) in E:\www\temp\sh.php on line 114

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at E:\www\temp\sh.php:104) in E:\www\temp\sh.php on line 114

*/

MMSHFE
چهارشنبه 21 اردیبهشت 1390, 11:30 صبح
با سلام، براي رفع مشكلات:
خطاي اول:
callback رو اشتباه نوشتين:


$object = new Session();
session_set_save_handler(array(&$object,'open'), array(&$object,'close'), array(&$object,'read'), array(&$object,'write'), array(&$object,'delete), array(&$object,'gc'));

خطاي دوم و سوم:
فايل رو با كدگذاري UTF-8 without BOM ذخيره كنيد و قبل از شروع Session چيزي براي مرورگر نفرستيد.
موفق باشيد.

رضا قربانی
یک شنبه 25 اردیبهشت 1390, 13:23 عصر
این مشکلیه که اکثر بچه ها داشتن

قبل از شروع Session حتی یک خط فاصله هم نباید بگذارید !!!

mtchabok
دوشنبه 26 اردیبهشت 1390, 09:47 صبح
برای استفاده از کلاس به صورت استاتیک به روشی که در زیر نوشتم در هندلر سشن ثبت کنید :

session_set_save_handler(
array('Session','open'),
array('Session','close'),
array('Session','read'),
array('Session','write'),
array('Session','delete'),
array('Session','gc')
);