PDA

View Full Version : session



tehro0n
چهارشنبه 18 مرداد 1391, 13:39 عصر
سلام،
در صفحه ای قراره که آماری برای کاربران که مربوط به خودشان است با وارد کردن رمز عبور نمایش داده شود
تعداد کاربر و وارد کردن رمز در صفحه زیاده
اگر من رمز کاربر نفر اول رو با session ثبت کنم و زمان 60 ثانیه برای آن بگذارم، نفر دوم که رمز رو بزنه session آن روی نفر اول ذخیره میشه، پس از session_id و session_regenerate_id باید استفاده کنم، و session ها رو احتمالا به صورت آرایه ای در بیارم،
حالا از طرف دیگه هم وقتی کاربر با فلان آی دی اگر 60 ثانیه در صفحه ماند باید از طریق رفرش آن کاربر یا رفرش کاربران دیگه session ها بررسی بشه و آن هایی که زمانشان تمام شده unset بشن
این کار رو می خوام بدونم به صورت اصولی چطور باید انجام بدم، اگه میشه مثالی برام بزنید که راه رو درست برم.
ممنون

tehro0n
چهارشنبه 18 مرداد 1391, 18:49 عصر
:متفکر: :افسرده:

tehro0n
چهارشنبه 18 مرداد 1391, 19:49 عصر
دوستان یعنی کسی نیست با session کار کرده باشه؟
کاربر 2 و 3 که میاد سیژن کاربر 1 رو خراب می کنه، تابعی دارید که اوکی باشه؟
من برای captcha هم از سیژن استفاده می کنم و با سیژن های پسورد قاطی میشه
اگه باید از سیژن ترکیبی با مرورگر و .. استفاده کنم بفرمایید چطوری کاربرای مختلف سیژن مخصوص به خودشون رو بگیرن

iner30
چهارشنبه 18 مرداد 1391, 20:41 عصر
ببخشید الان دقیقا میخوایین چیکار کنین؟
میخوایین سشن ها رو جایی ذخیره کنین؟
خوب وقتی زمان رو 60 ثانیه بذارین ، خودش برای هر کاربر رو سر اون زمان unset میکنه دیگه!!!

tehro0n
چهارشنبه 18 مرداد 1391, 23:29 عصر
ببخشید الان دقیقا میخوایین چیکار کنین؟
میخوایین سشن ها رو جایی ذخیره کنین؟
خوب وقتی زمان رو 60 ثانیه بذارین ، خودش برای هر کاربر رو سر اون زمان unset میکنه دیگه!!!
می خوام حالتی مانند لوگین ایجاد بشه که کاربران اگه یوزر پسورد زدند اطلاعاتی رو بهشون نشون بده
سیژن مانند کوکی نیست که خودش unset کنه و شما فقط می تونی با زمانی که تو سیژن دیگه میریزی با زمان الان چک کنی!
من فعلا هرکاری می کنم یوزر اول به درستی وارد میشه ولی چون سیژن برای اون است یوزر دوم وارد نمیشه، کلا این سیژن ها جدا نیستند و در آخر هم موقع unset نمی دونم چطوری دقیقا همان کاربر رو unset کنم

≡ ALEX ≡
چهارشنبه 18 مرداد 1391, 23:35 عصر
هر session ای که با ورود یک کاربر در سمت سرور ساخته میشه مربوط به همان کاربر هست و امکان تداخل وجود نداره مگر اینکه خودتان ID خاصی را فراخوانی کنید. یک کلاس ساده و ابتدایی هم براتون میگذارم تا شیوه عملکر صحیح رو ببینید:



<?php
class Session
{
public function __construct()
{
@session_start();
if(!isset($_SESSION['initiated']))
{
session_regenerate_id(true);
$_SESSION['initiated'] = true;
}
}

public function Destruct()
{
@session_destroy();
}

public function Set($sname, $svalue)
{
$_SESSION[$sname] = $svalue;
}

public function Insert($sname, $svalue)
{
$_SESSION[$sname][] = $svalue;
}

public function Get($sname)
{
return $_SESSION[$sname];
}

public function Is_set($sname)
{
return isset($_SESSION[$sname]) ? true : false;
}

public function Un_set($sname, $fname = null)
{
if($fname === null)
{
if(isset($_SESSION[$sname]))
{
unset($_SESSION[$sname]);
}
}
else
{
if(isset($_SESSION[$sname][$fname]))
{
unset($_SESSION[$sname][$fname]);
}
}
}
}
?>

≡ ALEX ≡
چهارشنبه 18 مرداد 1391, 23:39 عصر
می خوام حالتی مانند لوگین ایجاد بشه که کاربران اگه یوزر پسورد زدند اطلاعاتی رو بهشون نشون بده
سیژن مانند کوکی نیست که خودش unset کنه و شما فقط می تونی با زمانی که تو سیژن دیگه میریزی با زمان الان چک کنی!
من فعلا هرکاری می کنم یوزر اول به درستی وارد میشه ولی چون سیژن برای اون است یوزر دوم وارد نمیشه، کلا این سیژن ها جدا نیستند و در آخر هم موقع unset نمی دونم چطوری دقیقا همان کاربر رو unset کنم

لطفا این مقاله را مطاله بفرمایید: https://www.owasp.org/index.php/Session_Management_Cheat_Sheet

tehro0n
پنج شنبه 19 مرداد 1391, 01:27 صبح
معرفی توابع که همه جا هست! من گفتم چطور بنویسم و چی رو اول تا آخر بنویسم! آن وقت شما مثال تابع هایی رو زدید که خودم اول پست گفتم!
و این که
session_regenerate_id(true) این تابع به خاطر true سیژن قبلی پاک میشه که کاربر قبلی اگه لوگین کرده باشه و یا با هم لوگین کنند سیژنش پاک میشه
لطفا مثالی درست بفرمایید اگه کار کردید و صفحه برای کاربران زیاد طراحی کردید

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

≡ ALEX ≡
پنج شنبه 19 مرداد 1391, 08:48 صبح
معرفی توابع که همه جا هست! من گفتم چطور بنویسم و چی رو اول تا آخر بنویسم! آن وقت شما مثال تابع هایی رو زدید که خودم اول پست گفتم!
و این که
session_regenerate_id(true) این تابع به خاطر true سیژن قبلی پاک میشه که کاربر قبلی اگه لوگین کرده باشه و یا با هم لوگین کنند سیژنش پاک میشه
لطفا مثالی درست بفرمایید اگه کار کردید و صفحه برای کاربران زیاد طراحی کردید

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

دوست عزیز با regenerate کردن session قبلی همان کاربر پاک می شود نه session های مربوط به بقیه کاربران سایت! ضمنا لینکی که دادم طریقه استفاده از Session Cookie رو به شما نشون میده که در صورت داشتن دسترسی جهت ایجاد فایل php.ini اختصاصی بر روی سرور هاستینگ میتونید تنظیمات مربوط به انقضا رو به راحتی انجام دهید.

ضمنا من کلا به روش انجام کار شما شک دارم چون غیر عادی به نظر می رسه. لطفا دقیقا توضیح بدهید که چه کاری می خواهید انجام دهید (نه فقط قسمت خاصی از پروژه را توضیح دهید یا تا بدین جا چه کاری کرده اید) و صورت مسئله اصلی رو بیان کنید تا بتونم کمکتون کنم.

MMSHFE
پنج شنبه 19 مرداد 1391, 16:22 عصر
دوست عزیز، چرا اینقدر مسئله رو برای خودتون پیچیده کردین؟! چون شما روی لوکال دارین تست میکنین، سشنها با هم قاطی شدن. برای تست کردن بطور واقعی، برای هر کاربر از یک مرورگر استفاده کنید. مثلاً کاربر 1 با IE و کاربر 2 با Firefox و کاربر 3 با Chrome و... سایت رو باز کنن تا در کار سشنهای کاربران تداخلی پیش نیاد. اونوقت میبینید که سشن هر کاربر بطور جداگانه کار میکنه و نیازی به session_regenerate_id و این دردسرها هم ندارین. طبیعیه که وقتی با یک مرورگر و یک سیستم سایت رو باز میکنید، سشن کاربر قبلی هنوز پابرجا باشه.
موفق باشید.

≡ ALEX ≡
پنج شنبه 19 مرداد 1391, 18:31 عصر
اوه، ایشون نگفتند که دارن روی لوکال تست می کنند!! اگر اینطوره بدیهی است که وب سرور فقط و فقط یک session می سازه و تمام تغییرات رو در مورد همین یک بازدید کننده وب سایت اعمال خواهد کرد. تنها راهش هم دوست عزیزمون گفتند: استفاده از چند مرورگر متفاوت برای هر یک از کاربران.

tehro0n
جمعه 20 مرداد 1391, 17:52 عصر
دوست عزیز، چرا اینقدر مسئله رو برای خودتون پیچیده کردین؟! چون شما روی لوکال دارین تست میکنین، سشنها با هم قاطی شدن. برای تست کردن بطور واقعی، برای هر کاربر از یک مرورگر استفاده کنید. مثلاً کاربر 1 با IE و کاربر 2 با Firefox و کاربر 3 با Chrome و... سایت رو باز کنن تا در کار سشنهای کاربران تداخلی پیش نیاد. اونوقت میبینید که سشن هر کاربر بطور جداگانه کار میکنه و نیازی به session_regenerate_id و این دردسرها هم ندارین. طبیعیه که وقتی با یک مرورگر و یک سیستم سایت رو باز میکنید، سشن کاربر قبلی هنوز پابرجا باشه.
موفق باشید.
بله این را در لوکال در نظر دارم، اما مشکل من در همان سرور حقیقی است، که برای نمونه از captcha که استفاده می کنم کاربر 1 صفحه 1 را باز می کند و کاربر 2 پس از آن صفحه 2 یا 1 را باز کند اگه کاربر 2 زودتر کپچا را ارسال کند در آخر unset قاعدتا باید سیژن کاربر 2 را پاک کند اما کاربر 1 را هم پاک می کنه که باعث میشه کاربر 1 دوباره متن جدید کپچا را بگیره!
همین کار با پسورد هم به همین شکل است

MMSHFE
جمعه 20 مرداد 1391, 18:01 عصر
برای بررسی دقیق باید کدتون رو ببینیم ولی در کل یک قاعده خوب اینه که بعد از اعتبارسنجی CAPTCHA کد موجود در سشن رو حذف کنید تا CAPTCHA قبلی نامعتبر بشه نه اینکه کلاً سشن رو حذف کنید. البته کدتون رو هنوز ندیدم ولی حدس میزنم روش unsetکردن شما اشتباه باشه. مثلاً ممکنه کد زیر رو گذاشته باشین:

unset($_SESSION);
که کد فوق اشتباهه و طبق مستندات PHP نتایج غیرمنتظره ای در بر خواهد داشت. درواقع شما باید اندیس موردنظرتون رو unset کنید نه کل آرایه SESSION_$ رو. باز هم تأکید میکنم کدتون رو باید ببینم تا بتونم دقیق راهنمایی کنم. شاید مشکلتون این نباشه ولی قطعاً با دیدن کد بهتر میشه راهنمایی کرد. درهرحال چیزی که مسلمه اینه که حل مشکلتون غیرممکن نیست.

tehro0n
جمعه 20 مرداد 1391, 18:39 عصر
شما برای نمونه آمارگیر وبگذر را در نظر بگیرید و مثال ساده برای آن بزنید، وقتی کاربری رمز مشاهده آمار وبگذر را وارد می کند می تواند رمز مشاهده آمار صفحه دیگری را نیز وارد کند و تا چند دقیقه با هم آن دو رمز در سیژن قرار داره
از طرف دیگه قطعا کاربران دیگری نیز وجود دارند که از رمز های آمار خود استفاده می کنند

این هم یک نمونه از کد مشابه وبگذر که می خوام طراحی کنم،
اینجا در ابتدای کد است و چک می کنه که سیژن درسته یا نه


session_start();
// Load SESSION
if (isset($_GET['pwd'])) {
$_pass = str_escape($mysqli, $_GET['pwd']);
} elseif (isset($_SESSION['passwd']) && $_SESSION['time'] > $REQUEST_TIME)
$_pass = $_SESSION['passwd'];
elseif (isset($_SESSION['time']) && $_SESSION['time'] < $REQUEST_TIME) {
unset($_SESSION['passwd']);
unset($_SESSION['time']);
} else
session_destroy();

این هم برای موقعی هست که سیژن هنوز ثبت نشده و کاربر رمز خود را صحیح وارد کرده و قراره ثبت شه

// SESSION PassWord
if (!isset($_SESSION['passwd'])) {
session_regenerate_id(false);
$_SESSION['passwd'] = $_pass;
$_SESSION['time'] = $REQUEST_TIME + 60;
} else
$_SESSION['time'] = $REQUEST_TIME + 60;
نمونه ای از captcha من در صفحه toolsir.com/contact و toolsir.com/poll وجود داره که اگه تاخیری در وارد کردن اطلاعات داشته باشید و کاربر دیگری احتمالا از کپچا استفاده کنه برای شما از بین می ره و پیغام خطا می گیرید

MMSHFE
شنبه 21 مرداد 1391, 18:47 عصر
آهان پس مشکل از این قراره! دوست گرامی، شما باید برای هر کاربر، سشن جدا بسازید. درواقع سشن Password شما خودش یک آرایه هست که اندیس خونه های آرایه، شناسه کاربری و مقدار هر خونه، رمز اون کاربر هست. اینطوری، اگه هر کاربر سشنش حذف بشه، به سشن بقیه کاربرها کاری نداره.

tehro0n
یک شنبه 22 مرداد 1391, 20:12 عصر
آهان پس مشکل از این قراره! دوست گرامی، شما باید برای هر کاربر، سشن جدا بسازید. درواقع سشن Password شما خودش یک آرایه هست که اندیس خونه های آرایه، شناسه کاربری و مقدار هر خونه، رمز اون کاربر هست. اینطوری، اگه هر کاربر سشنش حذف بشه، به سشن بقیه کاربرها کاری نداره.
یعنی میفرمایید به این شکل ذخیره و unset کنم؟

$_SESSION['passwd'.$time] = $_pass;
اگر ممکنه برای session_destroy() هم مثالی بیاورید، چون تعداد کاربر زیاده نمی خوام این سیژن ها روی سرور بمونه، شاید کاربر حالا حالا ها سر نزنه که شرط 60 ثانیه غلط بشه و سیژن آن ست بشه، می خوام کلا پس از مدتی سیژن کاربر پاک بشه..

tehro0n
پنج شنبه 26 مرداد 1391, 13:55 عصر
4 روزه یه سئوال سیژن رو هم جواب داده نشده، این انجمن هم قدیم اعضاش فعال بودن، الان همه فقط میان می پرسن!
حالا اگه روزی روزگاری کسی این پست رو جواب داد، اینم بگه که استفاده از کوکی ها به سرور فشار میاره یا نه؟ رمی چیزی می گیره؟
چون من یک سری اطلاعات محاسباتی رو که حدود 80 تا 100 خروجی هست به خاطر این که دوباره این اطلاعات محاسبه نشن با کوکی دارم ذخیره می کنم، می خوام بدونم کار درستی هست این تعداد یا نه
در کل مرورگر فایرفاکس کمتر ایراد می گیره ولی مرورگر کروم بیشتر از 160 کوکی از یک صفحه رو اررور سربار بودن می ده

MMSHFE
جمعه 27 مرداد 1391, 08:22 صبح
شرمنده دوست عزیز، بخاطر یکسری مشغله های کاری کمتر میتونم آنلاین بشم. درمورد مسئله Session منظورم این بود که سشن رمز کاربران رو اینطوری تعریف کنید:

$_SESSION['password']['userid'] = 'value';
و به جای userid شناسه کاربری کاربران و به جای value مقدار رمز اون کاربر رو بگذارین. حالا میتونید به راحتی سشنهای جداگانه برای کاربران داشته باشین. موقع حذف سشن هر کاربر هم اینطوری عمل کنید:

unset($_SESSION['password']['userid']);
که بازهم userid رو باید با شناسه کاربری کاربر دلخواهتون که میخواین سشنش رو حذف کنید، جایگزین کنید.
درمورد سؤال دومتون هم که درباره Cookie هست باید بگم که Cookie هم مثل هر متغیر دیگری، RAM سرور رو اشغال میکنه چون با هربار درخواست یک صفحه توسط کلاینت، توی بدنه درخواست، کوکیها هم برای سرور ارسال میشن تا توی متغیرهای مناسب توی آرایه COOKIE قرار داده بشن و این آرایه هم توی RAM ایجاد میشه اما اون پیغام سربار که به شما اعلام میشه مال این نیست. 160 متغیر چیزی نیست که سرور نتونه مدیریت کنه. مسئله سر اتلاف ترافیک هست. 160 متغیر با هر درخواست باید بین سرور و کلاینت مبادله بشن و این مسئله باعث میشه اطلاعاتی که برای مدیریت کوکیها بین سرور و کلاینت تبادل میشه، حجمی بیشتر از خود صفحه اصلی اشغال کنه و درنتیجه ترافیک سایت شما بیهوده مصرف میشه (بخصوص که این تنظیمات اکثراً ثابته و تغییر نمیکنه). اگه اصرار به خوندن یکباره از دیتابیس دارین، بهتره تنظیمات رو هم توی سشن ذخیره کنید. اینطوری امنیتش هم بیشتره و سرعت بارگذاری صفحاتتون هم بالا میره.
موفق باشید.

tehro0n
جمعه 27 مرداد 1391, 18:55 عصر
در مورد کوکی که فرمودید تنظیمات را ذخیره کنید منظورتان را نفهمیدم
من به این صورت ذخیره می کنم


if (isset($_COOKIE["counter_".$_url]['time'])) { // we have COOCKIE
$days['d1'] = $_COOKIE["counter_".$_url]['d1'];
.
.
} else {
$mysqli->query (
.
.
setcookie("counter_".$_url."[d1]", $days['d1'], $tomorrow);
}

کوکی ها حدود 80 تا هستند که اگه زمانشان تموم بشه دوباره از دیتابیس خونده میشه و با توجه به آدرس url که همان id انحصاری آن کاربر است دوباره ست میشود
اگه این نوع مشکل داره بفرمایید و اینکه تنظیمات چی در این کد ست بشه؟
ممنون

MMSHFE
جمعه 27 مرداد 1391, 20:19 عصر
کدتون مشکل خاصی نداره. فقط اینکه از کوکی استفاده شده کمی بحث برانگیز هست. خودتون قضاوت کنید: در هر درخواست که بین سرور و کلاینت ردوبدل میشه، این 80 کوکی علاوه بر حجم صفحات، باید منتقل بشن. بهتر نیست بجای اینکار از سشن استفاده کنید؟ نهایتاً برای ایجاد محدودیت زمانی هم یک خونه به آرایه سشن مربوط به هر کاربر اضافه کنید که زمان پایان اعتبار رو توش مشخص میکنید و اگه اون زمان گذشته باشه، دوباره از دیتابیس اطلاعات رو بخونید و توی سشن ذخیره کنید.

tehro0n
شنبه 28 مرداد 1391, 01:10 صبح
در این مورد من فکر کردم چون روزی 500 هزار بار این صفحه توسط کاربرا لود میشه اگه از سیژن استفاده کنم ممکنه بار سرورم خیلی بشه و به سرور فشار بیاد، و حجمی از اطلاعات هم بی خودی در سرور ذخیره بشه
رو این حساب فکر کردم ممکنه کوکی بهتر باشه، اگه شما با این شرایط فکر می کنید سیژن بهتره خوب از سیژن استفاده می کنم، چون الان برام سریعتر لود شدن اطلاعات و فشار کمتر روی سرور برام مهمه
در حال حاضر فقط برای پسورد از سیژن استفاده می کنم که قبلا در موردش بحث شد
اگه پاسختون به سیژن مثبته تایید بفرمایید

tehro0n
شنبه 28 مرداد 1391, 18:54 عصر
البته برای این که دقیق تر بتونید نظر بدید اینم اضافه می کنم که حدود 65 تا از این اطلاعات در یک row از دیتابیس ذخیره شده ولی 2 یا 3 صفحه که ممکنه کاربر بهش سر بزنه این اطلاعات نمایش پیدا می کنه، این مورد رو نمی دونم می ارزه که با سیژن یا کوکی ذخیره کنم یا دو بار کوئری بگیرم بگیرم فشار کمتری به سرور میاد

اما الباقی که حدود 20 تاست یک صفحه پر بازدیده و از طرفی هم count چند سلکتی می گیره که یکم سنگینه و این حتما باید یا با سیژن یا کوکی ذخیره شه

tehro0n
دوشنبه 30 مرداد 1391, 21:14 عصر
:متفکر::متفکر: