PDA

View Full Version : سوال: میزان امنیت session برای نگهداری اطلاعات حساس کاربر در بین صفحات



iman.developer
یک شنبه 06 شهریور 1390, 16:45 عصر
سلام
من بعد از لاگین کاربران برای تایید هویت آن ها در دیگر صفحات سایت ، آی دی کاربر را در یک session ذخیره میکنم و با استفاده از همان session اطلاعات مربوط به او را در صفحات مختلف نشان میدهیم. ولی فکر کنم یه جایی خونده بودم که استفاده از session ها ممکنه ریسک امنیتی محسوب بشه .برای همین میخواستم بپرسم که این تا چه حد درسته و آیا روشی برای امن کردن استفاده از session می شناسید؟
ممنون

idocsidocs
یک شنبه 06 شهریور 1390, 17:09 عصر
امنیت سسشن توی سرورهای اشتراکی 0 هست ! توی دیتابیس ذخیرشون کنید.

amin1softco
یک شنبه 06 شهریور 1390, 17:10 عصر
دقیقاً بیشتر cms های حرفه ایی سشن رو روی دیتابیس ذخیره می کنند......

iman.developer
یک شنبه 06 شهریور 1390, 17:15 عصر
ممنون
من دقیقا متوجه نشدم که آیا باید به جای سشن از دیتابیس استفاده کنم یا اینکه سشن را روی دیتابیش ذخیره کنم؟
لطفا بیشتر در مورد نحوه استفاده از دیتایس برای این منظور(نگه داشتن اطلاعات کاربر بین صفحات) توضیح دهید.

idocsidocs
یک شنبه 06 شهریور 1390, 17:57 عصر
ممنون
من دقیقا متوجه نشدم که آیا باید به جای سشن از دیتابیس استفاده کنم یا اینکه سشن را روی دیتابیش ذخیره کنم؟
لطفا بیشتر در مورد نحوه استفاده از دیتایس برای این منظور(نگه داشتن اطلاعات کاربر بین صفحات) توضیح دهید.
سسشن ها باید توی دیتابیس ذخیره بشن.

amin1softco
یک شنبه 06 شهریور 1390, 18:13 عصر
شما باید یک سشن خودتون تعریف کنید و کلاً قید توابع $_session و session_start خوده php رو بزنید و مثلاً در پایگاه یک جدول به نام سشن ایجاد کنید حاوی فیلد های زیر
sid : با یکی از توابع هش یک کلید اصلی ایجاد کنید
ip : آیپیه بازدید کننده رو اینجا ذخیره کنید
time : زمان ورودش رو در این فیلد ذخیره کنید.
location : موقعیتش در سایت
agent: مرورگری که باهاش وارد شده
val1
val2
بعد یک تابع برای اجرای سشن از خودتون بنویسید معادل session_start
بعد هر وقت چیزی لازم بود با استفاده از اون کلیده که خودتون روی پایگاه ایجاد کردین و ماله اون یوزر و آیپیه کارا رو انجام بدید و ول 1 و 2 هم برای ذخیره مقادیر لازمه
این لینک (https://www.stanford.edu/dept/its/communications/webservices/wiki/index.php/How_to_use_MySQL-based_sessions) و این لینک (http://php.net/manual/en/function.session-set-save-handler.php) رو ببنید.
این مثال مربوط به لینک دومه البته با استفاده از تابع سشن session_set_save_handler:


<?php
class Session
{

/**
* a database connection resource
* @var resource
*/
private $_sess_db;

/**
* Open the session
* @return bool
*/
public function open() {

if ($this->_sess_db = mysql_connect(SESSION_DB_HOST,
SESSION_DB_USER,
SESSION_DB_PASS)) {
return mysql_select_db(SESSION_DB_DATABASE, $this->_sess_db);
}
return false;

}

/**
* Close the session
* @return bool
*/
public function close() {

return mysql_close($this->_sess_db);

}

/**
* Close the session
* @return bool
*/
public function close() {

return mysql_close($this->_sess_db);

}

/**
* Read the session
* @param int session id
* @return string string of the sessoin
*/
public function read($id) {

$id = mysql_real_escape_string($id);
$sql = sprintf("SELECT `data` FROM `sessions` " .
"WHERE id = '%s'", $id);
if ($result = mysql_query($sql, $this->_sess_db)) {
if (mysql_num_rows($result)) {
$record = mysql_fetch_assoc($result);
return $record['data'];
}
}
return '';

}

/**
* Write the session
* @param int session id
* @param string data of the session
*/
public function write($id, $data) {

$sql = sprintf("REPLACE INTO `sessions` VALUES('%s', '%s', '%s')",
mysql_real_escape_string($id),
mysql_real_escape_string($data),
mysql_real_escape_string(time()));
return mysql_query($sql, $this->_sess_db);

}

/**
* Destoroy the session
* @param int session id
* @return bool
*/
public function destroy($id) {

$sql = sprintf("DELETE FROM `sessions` WHERE `id` = '%s'", $id);
return mysql_query($sql, $this->_sess_db);

}

/**
* Garbage Collector
* @param int life time (sec.)
* @return bool
* @see session.gc_divisor 100
* @see session.gc_maxlifetime 1440
* @see session.gc_probability 1
* @usage execution rate 1/100
* (session.gc_probability/session.gc_divisor)
*/
public function gc($max) {

$sql = sprintf("DELETE FROM `sessions` WHERE `timestamp` < '%s'",
mysql_real_escape_string(time() - $max));
return mysql_query($sql, $this->_sess_db);

}

}

//ini_set('session.gc_probability', 50);
ini_set('session.save_handler', 'user');

$session = new Session();
session_set_save_handler(array($session, 'open'),
array($session, 'close'),
array($session, 'read'),
array($session, 'write'),
array($session, 'destroy'),
array($session, 'gc'));

// below sample main

session_start();
session_regenerate_id(true);

if (isset($_SESSION['counter'])) {
$_SESSION['counter']++;
} else {
$_SESSION['counter'] = 1;
}

?>