مشاهده دست آورد نظرسنجی: به اين كلاس چه امتيازي مي دهيد؟

رای دهنده
38. شما نمی توانید در این رای گیری رای بدهید
  • عالي

    29 76.32%
  • خوب

    6 15.79%
  • متوسط

    2 5.26%
  • ضعيف

    0 0%
  • بد

    1 2.63%
صفحه 1 از 3 123 آخرآخر
نمایش نتایج 1 تا 40 از 103

نام تاپیک: ذخيره Session در DB به جاي فايل

  1. #1

    Lightbulb ذخيره Session در DB به جاي فايل

    با سلام، لطفاً كلاسي كه براي اين كار نوشتم رو بررسي كنيد. مثال نمونه هم درباره نحوه استفاده از اون گذاشتم. لطفاً اگه سؤالي داشتين، بپرسين.
    توضيح خلاصه:
    با ايجاد يك شئ از اين كلاس قبل از فراخواني تابع session_start در هر اسكريپتي كه نياز به كار با Session داره، بدون نياز به هيچ كار اضافه ديگه، Sessionها توي ديتابيس ذخيره ميشن نه توي فايل. كافيه از اين كلاس يك شئ ايجاد كنيد و ساير كارهاي لازم براي استفاده از Session مثل قبل خواهد بود و هيچ تفاوتي در كد شما ايجاد نخواهد شد. براي مثال، با كمك آرايه SESSION_$ ميتونيد توي Session يك داده ذخيره كنيد يا يك داده رو حذف كنيد و كلي كارهاي ديگه.
    خوشحال ميشم نظراتتون رو بدونم.
    فایل های ضمیمه فایل های ضمیمه

  2. #2

    نقل قول: ذخيره Session در DB به جاي فايل

    الان دانلود می کنم و تست می کنم.

  3. #3

    نقل قول: ذخيره Session در DB به جاي فايل

    دوست عزیز فکر کنم که یه مدت وقتتون رو با سوالهام در این مورد بگیرم.

    سوال اول اینکه کد زیر چه نقشی داره و اینکه آیا روی همه سرورها می شه این مقدار رو تنظیم کرد یا نه؟

    گزینه های جایگزین user چی هستن؟

    ini_set('session.save_handler','user');

  4. #4

    نقل قول: ذخيره Session در DB به جاي فايل

    با سلام، اين تابع باعث ميشه كه كنترل كننده Session، كاربر معرفي بشه. اين گزينه توي php.ini با مقدار پيشفرض files مقداردهي شده كه باعث ميشه توي فايلها ذخيره بشه. تنها مقادير مجاز براي اين قسمت، files و user هستند.
    موفق باشيد.

  5. #5

    نقل قول: ذخيره Session در DB به جاي فايل

    ضمن عرض سلام مجدد، ديدم بد نيست يكسري توضيحات درباره اين كلاس ارائه بدم:
    اين كلاس فكر ميكنم خيلي به درد ميخوره. بخصوص براي جلوگيري از حملاتي به سايت مثل سرقت Session و... در سرورهاي اشتراكي كه همه به پوشه tmp ميتونن دسترسي داشته باشن. ابتدا كد كلاس رو مشاهده كنيد:

    <?PHP
    //Copyright محمد مصطفي شهركي @ http://www.barnamenevis.ir
    ini_set('session.save_handler','user');

    class MySessionHandler
    {
    private $time_out; //Time out for session
    private $salt; //Salt, an uniq string
    private $browser_hash; //Browser hash
    private $server; //Server name
    private $user; //User name
    private $pass; //Pass word
    private $db; //Database name

    public function Open($save_path, $session_name)
    {
    //Initialize your need here.
    //In my case, I need nothing.
    return true;
    }

    public function Close()
    {
    //Just deinitialize your resources
    return true;
    }

    public function Write($id,$data)
    {
    $safe_id=mysql_real_escape_string($id);
    $safe_data=mysql_real_escape_string($data);
    $hash=mysql_real_escape_string($this->browser_hash);
    $now=date("Y-m-d H:i:s");
    $query="INSERT INTO `sessions` (`id`,`data`,`modified`,`hash`) VALUES ('$safe_id','$safe_data','$now','$hash') ON DUPLICATE KEY UPDATE `data`='$safe_data', `modified`='$now',`hash`='$hash'";
    try
    {
    mysql_query($query);
    }
    catch(Exception $e)
    {
    return false;
    }
    return true;
    }

    public function Read($id)
    {
    $query='SELECT * FROM `sessions` WHERE (`id`=\''.mysql_real_escape_string($id).'\')';
    try
    {
    $result=mysql_query($query);
    }
    catch(Exception $e)
    {
    return '';
    }
    //Is there any???
    if (mysql_num_rows($result)!=1)
    {
    return '';
    }
    $data=mysql_fetch_assoc($result);
    //Now its time to validate...
    $time=strtotime($data['modified']);
    $hash=$data['hash'];
    //Check for time out and browser data
    if(time()-$time > $this->time_out || strcasecmp($this->browser_hash,$hash)!=0)
    {
    return '';
    }
    //Anything is ok, return data
    return $data['data'];
    }

    public function Destroy($id)
    {
    $safe_id=mysql_real_escape_string($id);
    $query="DELETE FROM `sessions` WHERE (`id`='$safe_id')";
    try
    {
    mysql_query($query);
    }
    catch(Exception $e)
    {
    return false;
    }
    $this->GC($this->time_out);
    return true;
    }

    public function GC($maxlifetime)
    {
    //You can use your timeout instead of this.
    $date=time()-$maxlifetime;
    $date_str=date("Y-m-d H:i:s",$date);
    $query="DELETE FROM `sessions` WHERE (`modified`<'$date')";
    try
    {
    mysql_query($query);
    }
    catch(Exception $e)
    {
    return false;
    }
    return true;
    }

    private function connect()
    {
    mysql_connect($this->server,$this->user,$this->pass) or die('Connection Error');
    mysql_select_db($this->db) or die('Database does not exit.');
    mysql_query('SET NAMES \'utf8\'');
    }

    public function __construct($server,$user,$pass,$db,$time_out=600, $salt='')
    {
    date_default_timezone_set('Asia/Tehran');
    if($salt=='')
    {
    $salt=md5('http://www.barnamenevis.ir');
    }
    $this->server=$server;
    $this->user=$user;
    $this->pass=$pass;
    $this->db=$db;
    $this->time_out=$time_out;
    $this->salt=$salt;
    $this->calcHash();
    $this->connect();
    session_set_save_handler(array(&$this,'Open'),arra y(&$this,'Close'),array(&$this,'Read'),array(&$thi s,'Write'),array(&$this,'Destroy'),array(&$this,'G C'));
    }

    private function calcHash()
    {
    $ip=isset($_SERVER['HTTP_CLIENT_IP'])?$_SERVER['HTTP_CLIENT_IP']:"Unknown";
    $ip.=isset($_SERVER['HTTP_X_FORWARDED_FOR'])?$_SERVER['HTTP_X_FORWARDED_FOR']:"Unknown";
    $ip.=isset($_SERVER['REMOTE_ADDR'])?$_SERVER['REMOTE_ADDR']:"Unknown";
    $agent=isset($_SERVER['HTTP_USER_AGENT'])?$_SERVER['HTTP_USER_AGENT']:'NoUserAgent';
    $browser_data=$this->salt.$_ip.$_agent;
    $this->browser_hash=md5($browser_data);
    }
    }
    ?>
    توي اين كلاس، بخشهاي زير وجود داره:
    تنظيم session.save_handler با مقدار user تا ديگه موقع ساخت Session از فايلها استفاده نشه.
    متد Open كه براي ايجاد يك Session جديد يا بازكردن Session موجود به كار ميره. همونطور كه ميبينيد، در كلاسي كه نوشتم، اين متد قرار نيست كاري انجام بده!
    متد Close كه براي بستن Session كاربرد داره و همونطور كه ميبينيد، در كلاسي كه نوشتم، اين متد هم كاري انجام نميده!
    متد Write كه براي نوشتن Session كاربرد داره و بعد از انجام كنترلهاي امنيتي، اطلاعات Session رو در بانك اطلاعاتي ذخيره ميكنه.
    متد Read كه براي خواندن Session به كار ميره و بعد از اينكه مطمئن شد Session ID واردشده معتبره و زمان اعتبار Session تمام نشده، اطلاعات Session رو از بانك اطلاعاتي استخراج كرده و بر ميگردونه.
    متد Destroy كه براي تخريب Session كاربرد داره و همونطور كه ميبينيد، بعد از حذف Session از بانك اطلاعاتي، متد GC رو صدا ميزنه كه به زباله روب معروفه!
    متد GC همونطور كه گفتم، به زباله روب معروفه و قاعدتاً بايد هر چند وقت يكبار بطور خودكار فراخواني بشه ولي تابحال نديدم اين اتفاق بيفته. شايد علتش اين باشه كه PHP براي استفاده بهينه از منابع سرور، فقط وقتي صداش ميزنه كه با كمبود حافظه مواجه بشه. به هر حال، با فراخواني اين تابع، Sessionهايي كه مدت اعتبارشون منقضي شده، از بانك اطلاعاتي حذف ميشن تا حافظه اشغال شده، آزاد بشه. براي اطمينان، توي متد Destroy اين متد رو خودمون فراخواني ميكنيم تا هرموقع يك Session تخريب شد، ساير Sessionهاي منقضي شده هم از بانك اطلاعاتي حذف بشن.
    متد Connect كه private هست و فقط داخل كلاس براي اتصال به بانك اطلاعاتي ازش استفاده ميكنيم.
    متد سازنده كلاس كه كارش معلومه : مقداردهي اوليه به فيلدهاي كلاس و فراخواني تابع session_set_save_handler و ارسال متدهاي كلاس بعنوان پارامتر براي اون تا به PHP بگيم از اين متدها براي كار با Session استفاده كن.
    و در آخر، متد calcHash كه private هست و با تركيب IP كاربر و IP پشت Proxy و IP پشت *** و همچنين Agent كه معرف سيستم عامل و مرورگر مورد استفاده است، يك كد Hash منحصر به فرد براي هر كاربر ايجاد ميكنه كه براي شناسايي كاربر استفاده ميشه. براي مثال، اگه IP فرد عوض بشه يا با مرورگر ديگه همزمان وارد سايت بشه، نميتونه از Session قبلي در اون مرورگر يا با IP جديد استفاده كنه.
    حالا ببينيم چطور از اين كلاس استفاده مي كنيم:
    اول يك جدول در بانك اطلاعاتي با ساختار زير ايجاد كنيد:

    CREATE TABLE IF NOT EXISTS `sessions` (
    `id` varchar(100) COLLATE utf8_bin NOT NULL,
    `data` text COLLATE utf8_bin NOT NULL,
    `modified` datetime NOT NULL,
    `hash` varchar(60) COLLATE utf8_bin NOT NULL,
    UNIQUE KEY `id` (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    <!doctype html public "-//w3c//dtd xhtml 1.0 strict//en"
    "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd">
    <!-- Copyright محمد مصطفي شهركي @ http://www.barnamenevis.ir -->
    <HTML xmlns="http://www.w3.org/1999/xhtml">
    <HEAD>
    <TITLE>Session Set Save Handler DEMO</TITLE>
    <META http-equiv="content-type" content="text/html; charset=utf-8"/>
    <?PHP
    require_once('sssh.class.php');
    ?>
    </HEAD>
    <BODY>
    <?PHP
    $session=new MySessionHandler('localhost','root','','session_db ');
    session_start();
    echo isset($_SESSION['test'])?$_SESSION['test']:'Test session is not defined';
    $_SESSION['test']='http://www.barnamenevis.ir';
    echo '<BR/>';
    echo isset($_SESSION['value'])?$_SESSION['value']:'value session is not defined';
    $_SESSION['value']='http://www.barnamenevis.ir';
    ?>
    </BODY>
    </HTML>
    خيلي ساده است، نه؟ كافيه يك شئ از كلاس ايجاد كنيم و بقيه كارها دقيقاً مثل قبله. انگار نه انگار كه Session توي DB ذخيره ميشه. مثل قبل با session_start و SESSION_$ و ساير توابع Session كار ميكنيم ولي ديگه فايلي براي ما ساخته نميشه. بنابراين، هرجا خواستين Session رو توي DB ذخيره كنيد، از اين كلاس يك شئ ايجاد كنيد و بعد با Session مثل قبل كار كنيد.
    اميدوارم به دردتون بخوره.
    موفق باشيد.

  6. #6

    نقل قول: ذخيره Session در DB به جاي فايل

    نقل قول نوشته شده توسط MMSHFE مشاهده تاپیک
    خيلي ساده است، نه؟ كافيه يك شئ از كلاس ايجاد كنيم و بقيه كارها دقيقاً مثل قبله. انگار نه انگار كه Session توي DB ذخيره ميشه. مثل قبل با session_start و SESSION_$ و ساير توابع Session كار ميكنيم ولي ديگه فايلي براي ما ساخته نميشه. بنابراين، هرجا خواستين Session رو توي DB ذخيره كنيد، از اين كلاس يك شئ ايجاد كنيد و بعد با Session مثل قبل كار كنيد.
    اميدوارم به دردتون بخوره.
    موفق باشيد.
    مرسی دوست عزیز، واقعا کلاس مفیدی هست.

    یه سوال برام پیش اومده:

    اگر از این کلاس استفاده کنیم، می شه گفت که توی هر صفحه باید یبار با پایگاه داده اتصال برقرار کنیم، سسشن ها رو توی دیتابیس ذخیره کنیم و مجددا اتصال رو ببندیم.

    حالا برای سایر کارهامون هم مجددا باید یه اتصال با پایگاه داده ایجاد کنیم، کوئری ها رو بفرستیم و بعد اتصال رو ببندیم.

    به نظرتون این فرایند (ایجاد دو اتصال در هر صفحه) با اضافی روی سرور ایجاد نمی کنه و آیا راهی نیست که بتونیم با یه اتصال هم سسشن ها رو ذخیره کنیم و هم سایر کوئری ها رو بفرستیم؟

    لطفا توضیح بدید.

  7. #7

    نقل قول: ذخيره Session در DB به جاي فايل

    با سلام، بعيد ميدونم مشكلي براي سرور پيش بياد. بخصوص طبق ادعاي سايت رسمي MySQL مبني بر اينكه در نسخه 5.3 به بعد، هربار كه درخواست اتصال به پايگاه داده ارسال ميشه، اگه از قبل اتصالي موجود باشه، لينك همون ارسال ميشه و اتصال جديد ايجاد نخواهد شد. درنتيجه اصلاً نيازي به بستن اتصال هم نخواهيد داشت. موفق باشيد.

  8. #8

    نقل قول: ذخيره Session در DB به جاي فايل

    نقل قول نوشته شده توسط MMSHFE مشاهده تاپیک
    با سلام، بعيد ميدونم مشكلي براي سرور پيش بياد. بخصوص طبق ادعاي سايت رسمي MySQL مبني بر اينكه در نسخه 5.3 به بعد، هربار كه درخواست اتصال به پايگاه داده ارسال ميشه، اگه از قبل اتصالي موجود باشه، لينك همون ارسال ميشه و اتصال جديد ايجاد نخواهد شد. درنتيجه اصلاً نيازي به بستن اتصال هم نخواهيد داشت. موفق باشيد.
    آیا تابعی که توی یه کلاس ایجاد می شه، توی سایر کلاسها هم کاربرد داره؟

    سوال دوم اینکه تابع mysql یه تابع قدیمی هست و توصیه می شه از mysqli استفاده کنیم. نظر شما چیه؟

  9. #9

    نقل قول: ذخيره Session در DB به جاي فايل

    اگه اون تابع static نباشه، فقط درصورتي ميشه ازش استفاده كرد كه يك شئ از اون كلاس ايجاد بشه و ازطريق اون شئ، تابع مربوطه رو صدا بزنيم. درمورد mysqli حق با شماست ولي من سعي كردم اين كلاس رو سريع بسازم و احتمالاً يك نسخه با mysqli هم خواهم ساخت. موفق باشيد.

  10. #10

    نقل قول: ذخيره Session در DB به جاي فايل

    نقل قول نوشته شده توسط MMSHFE مشاهده تاپیک
    اگه اون تابع static نباشه، فقط درصورتي ميشه ازش استفاده كرد كه يك شئ از اون كلاس ايجاد بشه و ازطريق اون شئ، تابع مربوطه رو صدا بزنيم. درمورد mysqli حق با شماست ولي من سعي كردم اين كلاس رو سريع بسازم و احتمالاً يك نسخه با mysqli هم خواهم ساخت. موفق باشيد.
    اینطوری کمی پیچیده می شه.

    فرض کنید ما یه کلاس برای ذخیره سسشن ها ایجاد کردیم، حالا می خوایم اتصالی که توی این کلاس ایجاد کردیم رو برای بقیه کلاسها هم استفاده کنیم.

    در این صورت با اتمام کار کلاس ذخیره سازی سسشن ها و فراخوانی تابع destruct اتصال از بین می ره و بقیه کلاسها نمی تونن از اتصال استفاده کنن.

    لطفا توضیح بدید.

  11. #11

    نقل قول: ذخيره Session در DB به جاي فايل

    با سلام، دوست گرامي نميدونم چه دليل خاصي دارين براي اينكه از همون اتصال استفاده كنيد؟ خوب يك اتصال جديد براي ساير كارها ايجاد كنيد و به اتصالي كه مربوط به كار Session هست كاري نداشته باشيد. بعلاوه، توي نسخه هاي 5.3 به بعد MySQL اگه يك اتصال رو صراحتاً نبنديم، موقع ايجاد اتصالهاي جديد، از همون اتصال قبلي استفاده ميشه.
    موفق باشيد.

  12. #12

    نقل قول: ذخيره Session در DB به جاي فايل

    نقل قول نوشته شده توسط MMSHFE مشاهده تاپیک
    با سلام، دوست گرامي نميدونم چه دليل خاصي دارين براي اينكه از همون اتصال استفاده كنيد؟ خوب يك اتصال جديد براي ساير كارها ايجاد كنيد و به اتصالي كه مربوط به كار Session هست كاري نداشته باشيد. بعلاوه، توي نسخه هاي 5.3 به بعد MySQL اگه يك اتصال رو صراحتاً نبنديم، موقع ايجاد اتصالهاي جديد، از همون اتصال قبلي استفاده ميشه.
    موفق باشيد.
    سایر دوستان می گن که اتصال با دیتابیس فشار زیادی به سرور می یاره و باید زود اتصال رو قطع کرد.

    من به این دلیل روی این مسئله حساس هستم.

  13. #13

    نقل قول: ذخيره Session در DB به جاي فايل

    نقل قول نوشته شده توسط MMSHFE مشاهده تاپیک
    با سلام، حقيقتش اولين باري هست كه اين مسئله رو ميشنوم. اگه اينطور بود، مطمئن باشين طراحان MySQL و PHP خودشون اين مسئله رو رعايت ميكردن و اتصالات به طور پيشفرض با خروج از اسكريپت، قطع ميشد. در هر حال، ميتونيد بعد از انجام هر كاري، با mysql_close اتصال رو ببنديد و هرموقع دوباره لازم بود كاري انجام بشه، اتصال مجدد برقرار كنيد. هرچند حقيقتاً نيازي بهش نديدم. توي سايتهاي بزرگي ديدم كه بازديدكنندگان زيادي هم داشتن ولي اتصالات رو نميبستن تا در مراجعات بعدي، دوباره از همون اتصالات استفاده كنند. يك مثال ساده: اگه بخواين 1 دقيقه اتومبلتون رو يك جا نگه دارين و دوباره راه بيفتين، خاموشش ميكنيد؟ مگه غير از اينه كه خاموش كردن و روشن كردن مجدد در بازه هاي زماني كوتاه، خودش به تنهايي بار اضافه ايجاد ميكنه؟ در اينجا هم وضع به همين منوال هست. سايتي كه آمار بازديد بالا داره، در هر لحظه يك اتصال به ديتابيس ميخواد ايجاد بشه كه اين خودش بار زيادي به سرور وارد ميكنه. چرا اجازه نديم درخواستهاي بعدي اتصال هم از همون اتصال موجود استفاده كنن؟
    موفق باشيد.
    یکی از دوستانی که روی بستن اتصال تاکید داشتن آقای کرامتی بود.

    منظورتون اینه که وقتی اتصال رو توی یه صفحه باز کردیم، دیگه اتصال رو نبندیم؟

    آیا با این کار، توی صفحات دیگه که احتیاج به ایجاد اتصال جدید هست، mysqli همون اتصالی که توی صفحات قبلی باز شده رو استفاده می کنه؟
    آخرین ویرایش به وسیله i-php-i : سه شنبه 27 اردیبهشت 1390 در 13:03 عصر

  14. #14

    نقل قول: ذخيره Session در DB به جاي فايل

    با سلام، من هم نميگم اتصال رو نبنديد. صحبت من سر اينه كه در كارهايي مثل Session يا كلاً سايتهايي كه بازديد زياد دارن، بستن و بازكردن اتصال، بار بيشتري رو به سرور وارد ميكنه. بله، وقتي يك اتصال در يك صفحه باز بشه و اون رو نبنديم و در صفحات بعد دوباره اقدام به برقراري اتصال كنيم، همون اتصال قبلي مورد استفاده قرار خواهد گرفت. ميتونيد درمورد دستور mysql_pconnect هم تحقيق كنيد. توي مستندات خود دستور mysqli_connect و mysql_connect ميتونيد اين مطلب رو مشاهده كنيد. درصورت وجود يك اتصال باز، همون اتصال مجدداً مورد استفاده قرار ميگيره و مجدداً اتصال جديد ايجاد نخواهد شد.
    موفق باشيد.

  15. #15

    نقل قول: ذخيره Session در DB به جاي فايل

    نقل قول نوشته شده توسط MMSHFE مشاهده تاپیک
    با سلام، من هم نميگم اتصال رو نبنديد. صحبت من سر اينه كه در كارهايي مثل Session يا كلاً سايتهايي كه بازديد زياد دارن، بستن و بازكردن اتصال، بار بيشتري رو به سرور وارد ميكنه. بله، وقتي يك اتصال در يك صفحه باز بشه و اون رو نبنديم و در صفحات بعد دوباره اقدام به برقراري اتصال كنيم، همون اتصال قبلي مورد استفاده قرار خواهد گرفت. ميتونيد درمورد دستور mysql_pconnect هم تحقيق كنيد. توي مستندات خود دستور mysqli_connect و mysql_connect ميتونيد اين مطلب رو مشاهده كنيد. درصورت وجود يك اتصال باز، همون اتصال مجدداً مورد استفاده قرار ميگيره و مجدداً اتصال جديد ايجاد نخواهد شد.
    موفق باشيد.
    از کدتون به خوبی استفاده می کنم.
    الان 6 مرورگر سافاری، کروم، اینترنت اکسپلورر، اپرا و نت اسکیپ رو استفاده کردم و وارد وب سایت شدم و بعد با زدن دکمه خروج از وب سایت خارج شدم.

    مسئله ای که هست اینه که بین این 6 مرورگر فقط مرورگر اینترنت اکسپلورر سطر مربوط به سسشن های خودش رو از دیتابیس حذف می کنه و بقیه مرورگرها سطر رو بصورت کامل حذف نمی کنن و فقط ستون data رو به کمک آپدیت کردن خالی می کنن.

    نظر شما در این مورد این مسئله چیه؟ آیا این مسئله مشکلی به وجود نمی یاره؟

  16. #16

    نقل قول: ذخيره Session در DB به جاي فايل

    با سلام، مشكل خاصي پيش نمياد. من خودم هم به اين مسئله دقت كردم و ديدم وقتي از فايلها استفاده ميشه هم موقع خروج، اون فايل به طور خودكار حذف نميشه. احتمالاً اين مسئله بخاطر طراحي مرورگر هست. البته دارم روي كدي كار ميكنم كه اون رو از طريق Cron Jobs تنظيم كنيم و هرموقع اجرا بشه، Sessionهاي Expireشده رو حذف كنه. موفق باشيد.

  17. #17

    نقل قول: ذخيره Session در DB به جاي فايل

    نقل قول نوشته شده توسط MMSHFE مشاهده تاپیک
    با سلام، مشكل خاصي پيش نمياد. من خودم هم به اين مسئله دقت كردم و ديدم وقتي از فايلها استفاده ميشه هم موقع خروج، اون فايل به طور خودكار حذف نميشه. احتمالاً اين مسئله بخاطر طراحي مرورگر هست. البته دارم روي كدي كار ميكنم كه اون رو از طريق Cron Jobs تنظيم كنيم و هرموقع اجرا بشه، Sessionهاي Expireشده رو حذف كنه. موفق باشيد.
    من یه کلاس نوشتم و توی سازنده کلاس کد زیر رو قرار دادم. سوال اولم اینه که این نوع فراخوانی کلاس مربوط به ذخیره کردن سسشن ها توی دیتابیس درست هست؟

    سوال دوم اینه که چطور می تونم بخش مربوط به ایجاد اتصال توی کلاس MySessionHandler رو حذف کنم، بطوری که از اتصال ایجاد شده توی سازنده استفاده کنم؟

    function __construct()
    {
    date_default_timezone_set('Asia/Tehran');
    $this->db = new mysqli('localhost','root','','data') or die ("امکان انجام درخواست شما وجود ندارد، لطفا مجددا تلاش کنيد");
    require_once('./includes/sssh.class.php');
    $session=new MySessionHandler('localhost','root','','data');
    session_start();
    }

  18. #18

    نقل قول: ذخيره Session در DB به جاي فايل

    با سلام، فكر نميكنم تغيير زيادي لازم باشه. كافيه توي سازنده كلاس يك پارامتر هم براي اتصال اضافه كنيد و چك كنيد كه اگه خالي نبود، اتصال جديد ايجاد نشه و از همون اتصال استفاده كنه. يعني يك فيلد اتصال هم اضافه كنيد و توي سازنده اون رو با پارامتر دريافتي مقداردهي كنيد. بعد، توي تابع connect، دستور ايجاد اتصال جديد رو حذف كرده و براي دستور انتخاب ديتابيس هم بعنوان پارامتر دوم، از فيلد اتصال كه توي سازنده مقداردهي شده، استفاده كنيد.
    موفق باشيد.

  19. #19

    نقل قول: ذخيره Session در DB به جاي فايل

    این کلاس رو فقط برای کاربران ثبت نامی انجام بدیم ؟
    یا برای ادمین هم انجام بدیم خوبه ؟
    ممنون

  20. #20

    نقل قول: ذخيره Session در DB به جاي فايل

    كلاً هر جا احساس كردين نياز به امنيت نسبتاً بيشتري دارين، ميتونيد از اين روش استفاده كنيد. قاعدتاً بخش مديريت سايت هم بهتره از اين روش استفاده كنه. موفق باشيد.

  21. #21

    نقل قول: ذخيره Session در DB به جاي فايل

    كلاً هر جا احساس كردين نياز به امنيت نسبتاً بيشتري دارين، ميتونيد از اين روش استفاده كنيد. قاعدتاً بخش مديريت سايت هم بهتره از اين روش استفاده كنه. موفق باشيد.
    من از این کلاس استفاده می کنم.

    داشتم کمی این کلاس رو تست می کردم که دیدم وقتی کوکی PHPSESSID رو حذف می کنم، هیچ مشکلی توی کار سسشن ها به وجود نمی یاد و سسشن ها به کار خودشون ادامه می دن !

    امکانش هست در این مورد توضیح بدید؟ آیا این مشئله نمی تونه یه خطر امنیتی باشه؟

  22. #22

    نقل قول: ذخيره Session در DB به جاي فايل

    اين مسئله مشكل خاصي نيست چون اين كلاس Session ID رو هم توي DB ذخيره ميكنه. علت اينكه Cookie ساخته ميشه هم حالت پيشفرض PHP هست كه مربوط به نحوه كارش با Sessionها در سمت كلاينت ميشه و ربطي به كد سمت سرور نداره. اتفاقاً به نظرم اينكه كلاس اصلاً به تنظيمات كلاينت و فايلهاي Cookie اون كاري نداره، خودش يك مزيت محسوب ميشه. البته اگه ميخواين كلاً ذخيره Cookie روي كلاينت براي انتقال Session ID رو از كار بندازين، كد زير رو به سازنده كلاس اضافه كنيد:

    ini_set('session.use_cookies', 0);
    ini_set('session.use_only_cookies', 0);

    موفق باشيد.

  23. #23

    نقل قول: ذخيره Session در DB به جاي فايل

    اين مسئله مشكل خاصي نيست چون اين كلاس Session ID رو هم توي DB ذخيره ميكنه. علت اينكه Cookie ساخته ميشه هم حالت پيشفرض PHP هست كه مربوط به نحوه كارش با Sessionها در سمت كلاينت ميشه و ربطي به كد سمت سرور نداره. اتفاقاً به نظرم اينكه كلاس اصلاً به تنظيمات كلاينت و فايلهاي Cookie اون كاري نداره، خودش يك مزيت محسوب ميشه. البته اگه ميخواين كلاً ذخيره Cookie روي كلاينت براي انتقال Session ID رو از كار بندازين، كد زير رو به سازنده كلاس اضافه كنيد:
    تا اونجاییکه من می دونم از ای دی سسشن برای شناسایی کاربر مورد نظر استفاده می شه. سسشن های اصلی هم توی دیتابیس ذخیره می شن.

    اگر این کوکی غیر فعال باشه، کار شناسایی کاربر به چه شکل انجام می شه؟ مثلا اگر 1000 نفر از ایران وارد بشن، از اونجاییکه آی پی های ایران تکراری هم داره، و اکثرا از مرورگرهای ie استفاده می کنن، کار شناسایی کاربر به چه صورت انجام می شه؟


    لطفا توضیح بدید.

  24. #24

    نقل قول: ذخيره Session در DB به جاي فايل

    عزيز دل برادر، يك نگاه دوباره به كلاس بندازين! كد Hash مخصوص كاربر كه با تركيب IP و مرورگر و سيستم عامل ساخته ميشه توي DB ذخيره ميشه و از اون طريق كاربر شناسايي ميشه. اين روش خيلي مطمئن تر هست چون حتي با Session Fixation هم نميشه بهش نفوذ كرد چون كد هشي كه براي كامپيوتر نفوذگر ساخته ميشه متفاوت خواهد بود و نميتونه صرفاً با داشتن يك Session ID معتبر، وارد سايت بشه. موفق باشيد.
    آخرین ویرایش به وسیله MMSHFE : دوشنبه 28 شهریور 1390 در 13:53 عصر دلیل: اصلاح جمله بندي و اطلاعات

  25. #25

    نقل قول: ذخيره Session در DB به جاي فايل

    عزيز دل برادر، يك نگاه دوباره به كلاس بندازين! كد Hash مخصوص كاربر كه با تركيب IP و مرورگر و سيستم عامل ساخته ميشه و زمان بازديد ساخته ميشه توي DB ذخيره ميشه و از اون طريق كاربر شناسايي ميشه. اين روش خيلي مطمئن تر هست چون حتي با Session Fixation هم نميشه بهش نفوذ كرد چون كد هشي كه براي كامپيوتر نفوذگر ساخته ميشه متفاوت خواهد بود و نميتونه صرفاً با داشتن يك Session ID معتبر، وارد سايت بشه. موفق باشيد.
    مشکل منم همینه دیگه !
    ای پی های ایرانی که تعدادشون محدود هست و این امکان وجود داره که چندین کاربر روی یه آی پی باشن (مگر اینکه بگید اینطور نیست) ! مرورگر و سیستم عامل همه کاربرها هم که مشخصه.

    هنوزم روی نظرتون هستید؟

  26. #26

    نقل قول: ذخيره Session در DB به جاي فايل

    دوست گرامي، خط آخر تابع calcHash رو اينطوري تغيير بدين:

    $this->browser_hash=md5($browser_data.session_id());

    حله؟
    اينطوري ديگه اگه همه اطلاعاتشون هم يكسان باشه، Session ID باعث تفاوت كد Hash ميشه. موفق باشيد.

  27. #27

    نقل قول: ذخيره Session در DB به جاي فايل

    اينطوري ديگه اگه همه اطلاعاتشون هم يكسان باشه، Session ID باعث تفاوت كد Hash ميشه. موفق باشيد.
    داداش منکه نمی خوام به زور مجبورتون کنم که نظرتون رو عوض کنید، به هر حال این نکته هم که گفتم ممکنه پیش بیاد و احتمالش زیاده.

  28. #28

    نقل قول: ذخيره Session در DB به جاي فايل

    دوست عزيز، من هم روي نظرم پافشاري بيجا ندارم. شما گفتين كه ممكنه IP و OS و Browser يكسان باشه، من هم كدي ارائه دادم كه PHPSESSID رو توي توليد Hash كاربر دخالت ميده تا اگه همه اون موارد قبلي يكسان بود، اين مورد آخر باعث بشه براي هر كاربر كد جداگانه اي توليد بشه. موفق باشيد.

  29. #29

    نقل قول: ذخيره Session در DB به جاي فايل

    دوست عزيز، من هم روي نظرم پافشاري بيجا ندارم. شما گفتين كه ممكنه IP و OS و Browser يكسان باشه، من هم كدي ارائه دادم كه PHPSESSID رو توي توليد Hash كاربر دخالت ميده تا اگه همه اون موارد قبلي يكسان بود، اين مورد آخر باعث بشه براي هر كاربر كد جداگانه اي توليد بشه. موفق باشيد.
    مطمئنن از کلاس شما توی همه پروژه هام استفاده می کنم. اما باید این مطلب آخری رو تغییر بدم. با توجه به طراحی خوب شما، بود و نبود ای دی سسشن روی کار تاثیر چندانی نمی ذاره ولی باید همه شرایط رو در نظر گرفت.

    اگر مجددا مشکلی پیش اومد برام توی این تاپک مطرح می کنم.

  30. #30

    نقل قول: ذخيره Session در DB به جاي فايل

    باسلام و تبریک سال نو
    استاد گرامی 'MMSHFE' یک سوال داشتم که نمیدونم آیا قابل بیان هست اینجا و یا خیر/
    من می خواستم بدونم الان با تغیر خط آخر Hash به browser_data.session_id حال اگر کاربر browser خود را ببندد بار بعدی که وارد سایت می شود ناشناس می باشد و یک شماره session جدید می گیرد در صورتی که در پایگاه داده هنوز از ایشان رکورد مربوط به session قبلی بر جاست و این در طولانی مدت که هیچ در کوتاه مدت باعث سنگین شدن بانک و مشکلات بعدی می شود. می خواستم چطور برای صفحه ام کدی بنویسم که اگر کاربر صفحه را بست اون اطلاعات بانک نیز از بین برود.

    باتشکر

  31. #31

    نقل قول: ذخيره Session در DB به جاي فايل

    با سلام، حقیقتش مرورگرهایی مثل IE خودشون رکورد مربوطه رو حذف میکنن ولی درمورد مرورگرهای FF و Chrome و... نمیدونم چرا حذف نمیشه. درهرحال میتونید موقع ایجاد شئ از کلاس مذکور، اگه timeout پیشفرض رو تغیر نداده باشین، مشابه مثال زیر، سشنهای Expireشده رو حذف کنید:

    $sssh = new MySessionHandler('localhost', 'root', '', 'dbname');
    $sssh->GC(600);

    اینطوری، سشنهایی که 10دقیقه از آخرین فعالیتشون گذشته و تغییری نداشتن، حذف میشن. موفق باشید.

  32. #32
    کاربر دائمی آواتار AmirSky
    تاریخ عضویت
    اسفند 1387
    محل زندگی
    تهران
    پست
    216

    نقل قول: ذخيره Session در DB به جاي فايل

    باسلام و ممنون از آقای شهرکی بابت کلاس خوبتون
    یه سوال : در تابع GC در خط 97 چرا از $date استفاده شده؟ چرا از $date_str استفاده نشده؟ آیا دلیل حذف نشدن ها این نبوده؟
    در خط 141 به خطا برخوردم که دیدم متغیر $_ip و $_agent در بالاتر به صورت $ip تعریف شده. ($browser_data=$this->salt.$_ip.$_agent;)
    آیا کس دیگری هم در این موارد به خطا برخورده یا نه؟

  33. #33

    نقل قول: ذخيره Session در DB به جاي فايل

    بله دوست عزیز در خطی که گفتید دو متغییر ip , agent به صورت $_ip و $_agent صدا زده شده. خودتان دستی درست کنید. من اینکار رو کردم جواب داد. درضمن آقا شهرکی قرار شده این کلاس رو کامل کنند و اون مشکلاتی که داشت رو برطرف کنند که بعد از بستن پنجره از بانک حذف شود. انشاءالله اون موقع می توانید در بهترین حالت استفاده کنید.

  34. #34
    کاربر دائمی آواتار lady64
    تاریخ عضویت
    مرداد 1390
    محل زندگی
    شمال ایران
    پست
    401

    نقل قول: ذخيره Session در DB به جاي فايل

    نقل قول نوشته شده توسط MMSHFE مشاهده تاپیک
    با سلام، حقیقتش مرورگرهایی مثل IE خودشون رکورد مربوطه رو حذف میکنن ولی درمورد مرورگرهای FF و Chrome و... نمیدونم چرا حذف نمیشه. درهرحال میتونید موقع ایجاد شئ از کلاس مذکور، اگه timeout پیشفرض رو تغیر نداده باشین، مشابه مثال زیر، سشنهای Expireشده رو حذف کنید:

    $sssh = new MySessionHandler('localhost', 'root', '', 'dbname');
    $sssh->GC(600);

    اینطوری، سشنهایی که 10دقیقه از آخرین فعالیتشون گذشته و تغییری نداشتن، حذف میشن. موفق باشید.
    سلام. من با ie امتحان میکنم اما رکورد ها حذف نمیشن . کد آخری هم که گذاشتید رو امتحان کردم ولی نشد.چکار کنم که رکوردهای درج شده با بستن مرورگر ie حذف بشن ؟

  35. #35

    نقل قول: ذخيره Session در DB به جاي فايل

    چه نسخه ای از IE هست؟ نسخه های جدید اومدن درستش کنن، بدترش کردن! دارم روی نسخه جدید اسکریپت کار میکنم. به زودی آماده میشه و توی همه مرورگرها به درستی و بطور کامل کار خواهد کرد. موفق باشید.

  36. #36
    کاربر دائمی آواتار AmirSky
    تاریخ عضویت
    اسفند 1387
    محل زندگی
    تهران
    پست
    216

    نقل قول: ذخيره Session در DB به جاي فايل

    با تشکر از آقای شهرکی
    حدود دو ماه است که دارم ازش استفاده میکنم و مشکل خاصی نداره
    با کروم هم عالی کار میکنه

  37. #37
    کاربر دائمی آواتار lady64
    تاریخ عضویت
    مرداد 1390
    محل زندگی
    شمال ایران
    پست
    401

    نقل قول: ذخيره Session در DB به جاي فايل

    نقل قول نوشته شده توسط MMSHFE مشاهده تاپیک
    چه نسخه ای از IE هست؟ نسخه های جدید اومدن درستش کنن، بدترش کردن! دارم روی نسخه جدید اسکریپت کار میکنم. به زودی آماده میشه و توی همه مرورگرها به درستی و بطور کامل کار خواهد کرد. موفق باشید.
    هم با ie7 هم با firefox امتحان کردم ولی رکوردها در بانک اطلاعاتی هستند و حذف نشدند.

  38. #38

    نقل قول: ذخيره Session در DB به جاي فايل

    سلام به همه دوستان
    من همه ارسال های شما را در مورد این کلاس خوندم . یه سوال داشتم . آیا با استفاده از این کلاس من می تونم کاربرای آنلاین در سامانه را نمایش بدم یا نه ؟؟
    اگر می شود به چه صورت و اگر نمی شود لطفاً در این مورد راهنمایی کنید ممنون میشم !!

  39. #39

    نقل قول: ذخيره Session در DB به جاي فايل

    فکر نمیکنم مشکلی وجود داشته باشه. فقط باید تعداد Sessionهای Expireنشده رو بشمارین که یک کوئری ساده برای این کار کافیه.

  40. #40

    نقل قول: ذخيره Session در DB به جاي فايل

    مرسی ولی منظور من تعداد کاربران آنلاین به همراه نام یا نام کاربریشون هست . آیا می شه ؟؟
    یه سوال دیگه هم که داشتم اینه که من الان با یه تیکه کد session id کاربری که login می کنه را در db نگه داری می کنم . می خوام بعد از یه تایمی چک کنم این session id هنوز وجود داره یا نه . چطور باید این کارو انجام بدم ؟؟؟ نکته ای هم که وجود داره اینه که session ها در db ذخیره نمی شوند .
    ممنون از راهنماییتون

صفحه 1 از 3 123 آخرآخر

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •