محافظت از شناسه جلسه در PHP. PHP session_id() در هر درخواست به روز می شود، $_COOKIE خالی است مکانیسم جلسات کاری در php

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

من نیاز به چنین مکانیزمی را با جزئیات شرح نمی دهم. اینها موارد کتاب درسی مانند سبد خرید در فروشگاه الکترونیکی، مجوز، و همچنین مشکلات کاملاً بی اهمیت نیستند، مانند محافظت از بخش های تعاملی یک سایت در برابر هرزنامه.

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

اگر فقط اولین مورد فعال باشد، در شروع جلسه (هر تماس session_start()) یک کوکی برای مشتری تنظیم شده است. مرورگر با هر درخواست بعدی به درستی این کوکی را برمی گرداند و PHP یک شناسه جلسه دارد. اگر مرورگر کوکی ها را برنگرداند، مشکلات شروع می شود. در این حالت، بدون دریافت کوکی با شناسه، PHP همیشه یک جلسه جدید را شروع می کند و مکانیسم کار نمی کند.

اگر فقط مورد دوم فعال باشد، کوکی تنظیم نشده است. و این چیزی است که اتفاق می افتد، به خاطر آن، در واقع، ارزش استفاده از مکانیسم جلسه داخلی را دارد. پس از اینکه اسکریپت کار خود را انجام داد و صفحه به طور کامل تشکیل شد، PHP کل صفحه را اسکن می کند و یک شناسه جلسه به هر لینک و به هر فرم اضافه می کند. چیزی شبیه این به نظر می رسد:
شاخصتبدیل می شود
شاخص
و یک فیلد مخفی به فرم ها اضافه می شود

و مرورگر، وقتی روی هر پیوندی کلیک می‌کنید، یا وقتی روی دکمه‌ای در فرم کلیک می‌کنید، متغیر مورد نیاز ما - شناسه جلسه - را در درخواست ارسال می‌کند!
به دلایل واضح، شناسه فقط به پیوندهای نسبی اضافه می شود.

از نظر تئوری، در جلسات خانگی خود در مورد کوکی ها و پایگاه داده، می توانیم به صورت دستی انتقال شناسه را به همه پیوندها اختصاص دهیم - و سپس جلسات خودمان بدون توجه به کوکی ها کار خواهند کرد. اما آیا موافق هستید - وقتی شخص دیگری این کار را انجام می دهد خوشایندتر است؟ ;-)

پیش فرض در آخرین نسخه ها PHP هر دو گزینه را فعال کرده است. PHP چگونه با این موضوع برخورد می کند؟ آشپز همیشه به نمایش گذاشته می شود. و پیوندها تنها در صورتی تکمیل می شوند که PHP یک کوکی با شناسه جلسه را شناسایی نکرده باشد. هنگامی که کاربر برای اولین بار در این جلسه از سایت بازدید می کند، یک کوکی قرار می گیرد و لینک ها تکمیل می شوند. در درخواست بعدی، در صورت پشتیبانی از کوکی ها، PHP کوکی را می بیند و تکمیل لینک ها را متوقف می کند. اگر کوکی ها کار نکنند، PHP به درستی شناسه را به پیوندها اضافه می کند و جلسه از بین نمی رود.
کاربرانی که کوکی‌ها را فعال کرده‌اند، فقط یک بار پیوند طولانی با شناسه را می‌بینند.

فوو انتقال شناسنامه کامل شد.
اکنون تنها چیزی که باقی می ماند این است که فایل داده را در سمت سرور به آن متصل کنید.
PHP این کار را برای ما انجام خواهد داد. فقط نوشتن کافی است
session_start();
$_SESSION [ "test" ]= "سلام دنیا!" ;

و PHP متغیر تست را در فایل مرتبط با این جلسه می نویسد.
در اینجا یک نکته بسیار مهم وجود دارد.
آرایه $_SESSION- خاص
در واقع شامل متغیرهایی است که می خواهیم در اسکریپت های مختلف در دسترس قرار دهیم.
برای قرار دادن یک متغیر در یک جلسه، فقط آن را به عنصر آرایه $_SESSION اختصاص دهید.
برای بدست آوردن مقدار آن، کافیست به همان عنصر دسترسی داشته باشید. یک مثال در زیر خواهد بود.

جمع آوری زباله - حذف منسوخ شده فایل های PHPخودش هم این کار را می کند. و همچنین رمزگذاری داده ها و یک سری چیزهای ضروری دیگر. در نتیجه این مراقبت، کار با جلسات بسیار ساده است.
در اینجا ما در واقع به مثال نحوه عملکرد جلسات می رسیم.
یک مثال بسیار کوچک:
session_start();

اکو "شما این صفحه را به روز کردید". $_SESSION["counter"]++. "یک بار."
پژواک"
به روز رسانی"؛
?>

ما بررسی می کنیم که آیا یک متغیر شمارنده در جلسه داریم یا خیر، آن را با مقدار 0 ایجاد می کنیم و سپس مقدار آن را نمایش می دهیم و آن را یک افزایش می دهیم. مقدار افزایش یافته در جلسه نوشته می شود و دفعه بعد که اسکریپت فراخوانی می شود، متغیر دارای مقدار 1 و غیره خواهد بود.
خیلی ساده است.

برای دسترسی به متغیرهای جلسه در هر صفحه از سایت، باید در ابتدای هر فایلی که در آن به جلسات نیاز داریم، فقط یک خط (!) بنویسید:
session_start();
و سپس به عناصر آرایه $_SESSION دسترسی پیدا کنید. به عنوان مثال، یک بررسی مجوز چیزی شبیه به این است:
session_start();
if ($_SESSION [ "مجاز" ]<> 1 ) {
header ("مکان: /auth.php");
خروج؛
}

حذف متغیرها از یک جلسه
اگر register_globals=off دارید، فقط بنویسید
unset($_SESSION [ "var" ]);
اگر نه، پس نزدیکباید باهاش ​​بنویسم
session_unregister("var");

رایج ترین خطاهایی که PHP هنگام تلاش برای کار با جلسات ایجاد می کند موارد زیر است:
دوتاشون
هشدار: کوکی جلسه ارسال نمی شود - سرصفحه ها قبلا ارسال شده اند
هشدار: محدود کننده کش جلسه ارسال نمی شود - سرصفحه ها قبلا ارسال شده اند

به همین دلیل، راه حل در این تاپیک توضیح داده شده است
سوم،
هشدار: open(/tmp\sess_SID، O_RDWR) ناموفق بود: چنین فایل یا دایرکتوری (2) در full_script_path در شماره خط وجود ندارد(قبلاً به نظر می رسید هشدار: نوشتن داده های جلسه (فایل ها) ناموفق بود. لطفاً بررسی کنید که تنظیمات فعلی session.save_path صحیح است (/tmp)),
اگر از انگلیسی ترجمه شود، مشکل را با جزئیات توضیح می دهد: مسیر دایرکتوری مشخص شده در php.ini که فایل های جلسه در آن نوشته شده است، در دسترس نیست. این خطا راحت ترین رفع آن است. فقط یک دایرکتوری را ثبت کنید که وجود دارد و قابل نوشتن است، برای مثال،
session.save_path = c:\windows\temp
و فراموش نکنید که بعد از این کار Apache را مجددا راه اندازی کنید.

همانطور که معلوم است، هوش انسان محدودیتی ندارد، بنابراین من مجبورم توضیح دهم:
پیامی در مورد خطای سوم (دایرکتوری پیدا نمی شود) به ناچار منجر به ظاهر شدن دو مورد اول می شود، زیرا پیام خطا به مرورگر و هدرها پس از عدم استفاده از آن خروجی می شود. بنابراین برای نتیجه گیری زودرس عجله نکنید، بلکه ابتدا مسیر درست را بنویسید!

رایج ترین مشکل بعدی هنگام کار با جلسات، میراث سنگین register_globals است. نام متغیرهای اسکریپت را که با شاخص های آرایه $_SESSION مطابقت دارند، ندهید!
با register_globals=on مقادیر روی هم بازنویسی می‌شوند و شما گیج می‌شوید.
و با register_globals=off، خطای دیگری ظاهر می‌شود: «اسکریپت شما احتمالاً متکی به یک اثر جانبی جلسه است که تا PHP 4.2.3 وجود داشته است.»، اگر اسکریپت دارای یک متغیر session است که مقدار ندارد، و یک متغیر سراسری با همنام . برای خلاص شدن از شر آن، همیشه باید متغیرها را قبل از استفاده مقداردهی اولیه کنید (یا حداقل وجود آنها را بررسی کنید) و نام متغیرهای سراسری را که منطبق با شاخص های آرایه $_SESSION باشد، ندهید.

اگر کار نمی کند، اما هیچ پیامی نمایش داده نمی شود، در همان ابتدای اسکریپت که مسئول نمایش همه خطاها روی صفحه است، دو خط اضافه کنید - ممکن است خطاهایی وجود داشته باشد، اما شما آنها را نمی بینید.
ini_set("خطاهای_نمایش" , 1 );
error_reporting (E_ALL);

یا خطاها را در error_log ببینید. به طور کلی، موضوع نمایش پیام های خطا از حوصله این مقاله خارج است، بنابراین فقط مطمئن شوید که حداقل می توانید آنها را ببینید. در این بخش می توانید کمی بیشتر در مورد یافتن خطاها مطالعه کنید.

اگر مطمئن هستید که هیچ خطایی وجود ندارد، اما مثال داده شده به هر حال کار نمی کند، ممکن است PHP انتقال شناسه از طریق URL را فعال نکند. و کوکی ها به دلایلی کار نمی کنند.
ببینید چه مشکلی در کوکی های شما وجود دارد.
به طور کلی، اگر جلسات شما کار نمی کند، ابتدا سعی کنید شناسه جلسه را به صورت دستی ارسال کنید، یعنی یک پیوند ایجاد کنید و یک شناسه به آن اختصاص دهید:
session_start();
if (!isset($_SESSION [ "counter" ])) $_SESSION [ "counter" ]= 0 ;
اکو "شما این صفحه را به روز کردید". $_SESSION["counter"]++. "یک بار

به روز رسانی"؛
?>

با این حال، باید مطمئن شوید که دستورالعمل session.use_only_cookies فعال نیست، که مانع از آن می شود که PHP شناسه جلسه را در صورت ارسال از طریق URL بپذیرد.

اگر این مثال کار نکرد، پس مشکل یا بی اهمیت است غلط املایی(نیمی از "مشکلات" مربوط به جلسات از نام متغیر اشتباه املایی ناشی می شود) یا همینطور نسخه قدیمی PHP: پشتیبانی جلسه در نسخه 4.0 و آرایه ظاهر شد $_SESSION- در 4.1 (قبل از این استفاده می شد HTTP_SESSION_VARS $).
اگر کار کرد، پس مشکل در کوکی هاست. نظارت کنید که سرور چه نوع کوکی را روی مرورگر تنظیم می کند و آیا مرورگر آن را برمی گرداند یا خیر. جستجو با مشاهده تبادل هدرهای HTTP بین مرورگر و سرور بسیار مفید است.
توضیح نحوه کار کوکی ها فراتر از محدوده این متن طولانی است، اما حداقل مطمئن شوید که سرور یک کوکی با یک شناسه ارسال می کند و مرورگر آن را برمی گرداند. و در عین حال شناسه ها با یکدیگر مطابقت دارند =)
تنظیم کوکی باید به این صورت باشد
Set-Cookie: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6;
یا چگونه
Set-Cookie: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6; مسیر=/
(اگر اسکریپت را نه از دایرکتوری ریشه درخواست می کنید)
پاسخ سرور باید شبیه باشد
کوکی: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6
یا
کوکی: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6; b=b
اگر مرورگر کوکی هایی غیر از شناسه جلسه را برگرداند.

اگر مرورگر کوکی‌ها را برنمی‌گرداند، بررسی کنید که آیا کوکی‌ها اصلاً کار می‌کنند یا خیر.
اطمینان حاصل کنید که دامنه ای که به آن دسترسی دارید یک نام معمولی (با حداقل یک نقطه و بدون نویسه غیرقانونی مانند زیرخط) داشته باشد و حافظه پنهان مرورگر خود را پاک کنید - اینها دو دلیل اصلی هستند که ممکن است کوکی ها کار نکنند.

اگر مثال از اینجا کار می کند، اما کد شما کار نمی کند، پس واضح است که مشکل در جلسات نیست، بلکه در الگوریتم است. به دنبال جایی باشید که متغیر را گم کرده اید، مثال را مرحله به مرحله از اینجا منتقل کنید و اسکریپت خود را اشکال زدایی کنید.

اگر از تغییر مسیر سرصفحه یا ناوبری جاوا اسکریپت استفاده کنید، ممکن است مشکل دیگری ایجاد شود.
واقعیت این است که PHP به طور خودکار شناسه جلسه را فقط به پیوندهایی مانند آن اضافه می کند ، اما این کار را برای هدرها، جاوا اسکریپت، متا تگ ها انجام نمی دهد.
بنابراین، شما باید شناسه را به صورت دستی اضافه کنید، به عنوان مثال، مانند زیر:
header("Location: /script.php?" . session_name(). "=" . session_id());

همچنین، یک مشکل بسیار نادر، و کاملاً مشخص نیست که از کجا می آید، این است که تنظیمات session.save_handler مقداری متفاوت از فایل ها دارد. اگر اینطور نیست، آن را اصلاح کنید.

ایمنی
امنیت جلسه یک موضوع گسترده است. بنابراین، من بر روی چند نکته اصلی تمرکز می کنم.
بیشترین کتاب درسی این است که شناسه را عبور ندهید نوار آدرس. این حتی در php.ini نوشته شده است، اما این کارکرد جلسات را محدود می کند. اگر تصمیم دارید این توصیه را دنبال کنید، علاوه بر session.use_trans_sid = 0، session.use_only_cookies = 1 را فراموش نکنید
توصیه می شود که جلسه را به یک آدرس IP متصل کنید: به این ترتیب، اگر شناسه به سرقت رفته باشد، شرور همچنان نمی تواند در بیشتر موارد از آن استفاده کند.
توصیه می شود از دستورالعمل session.save_path استفاده کنید که به شما امکان می دهد دایرکتوری خود را برای ذخیره فایل های جلسه تنظیم کنید. این امن تر از ذخیره آنها در فهرست موقت مشترک پیش فرض سرور است.

اطلاعات تکمیلی:

  • علاوه بر کوکی‌ها، مکانیسم جلسه همچنین هدرهایی را ارسال می‌کند که ذخیره‌سازی صفحه را ممنوع می‌کند (همان محدودکننده کش). برای html این درست و ضروری است. اما زمانی که می خواهید فایلی را با استفاده از اسکریپتی که مجوز را بررسی می کند ارسال کنید، اینترنت اکسپلورر از دانلود آن امتناع می کند. به خاطر این عنوان است. تماس بگیرید
    session_cache_limiter("خصوصی");
    باید قبل از شروع جلسه مشکل را حل کند.
  • ممکن است عجیب به نظر برسد، اما در آرایه $_SESSIONشما نمی توانید از شاخص های عددی استفاده کنید - $_SESSION [ 1 ]، $_SESSION [ "10" ]- جلسات کار نخواهد کرد.
  • جایی بین نسخه های 4.2 و 5.0 امکان تنظیم session.use_trans_sid با استفاده از آن وجود نداشت. ini_set(). با شروع از 5.0 دوباره امکان پذیر است.
  • قبل از نسخه 4.3.3 کوکی، PHP تنها در صورتی یک کوکی ارسال می کرد که هنگام شروع جلسه هیچ شناسه ای در درخواست وجود نداشت. اکنون در هر تماس یک کوکی ارسال می شود session_start()

    نمونه ای از مجوز با استفاده از جلسات
    بیایید همه موارد فوق را با یک مثال کوچک توضیح دهیم:
    بیایید فایل auth.php را ایجاد کنیم:
    if (isset($_POST [ "auth_name" ]))
    {
    $sql = "انتخاب * از کاربران WHERE name=?s";
    $row = $db -> getRow($sql, $_POST["auth_name"]);
    if ($row && password_verify ($_POST [ "auth_pass" ], $row [ "pass" ])) (
    $_SESSION [ "user_id" ] = ردیف $ [ "id" ];
    }
    header("مکان: http://" . $_SERVER [ "HTTP_HOST"]. $_SERVER [ "REQUEST_URI" ]);
    خروج؛
    }

    if (isset($_GET [ "action" ]) AND $_GET [ "action" ]== "logout" ) (
    session_start();
    session_destroy();
    header("مکان: http://" . $_SERVER [ "HTTP_HOST" ]. "/" );
    خروج؛
    }

    if (!isset($_SESSION [ "user_id" ])) (
    ?>








    خروج؛
    }

    اکنون تنها کاری که باید انجام دهید این است که خط را در تمام اسکریپت های محافظت شده بنویسید
    نیاز به "auth.php" ;
    این مثال فرض می‌کند که جلسه قبلاً شروع شده است و یک اتصال به پایگاه داده با استفاده از کلاس برای کار ایمن و راحت با MySQL ایجاد شده است. همچنین فرض می کند که رمز عبور با استفاده از تابع توصیه شده password_hash هش شده است.
    نمونه ای از یک فایل محافظت شده:

    session_start();
    شامل "safemysql.class.php" باشد.
    $db = new safemysql ([ "db" => "test" ]);
    شامل "auth.php" ;
    ?>
    راز

    خروج

    OPS! لینک های بسیار مفید:
    http://www.php.net/manual/ru/ref.session.php - آخرین و جدیدترین اطلاعات در مورد پشتیبانی جلسه در PHP در اسناد رسمی، به علاوه نظرات متعدد کاربران. خواندن بسیار توصیه می شود.
    http://phpclub.ru/manrus/f/ref.session.html - ترجمه بسیار قدیمی این فصل به روسی، از اسناد ترجمه شده توسط الکساندر پیرامیدین.
    http://phpclub.ru/detail/article/sessions
    مقاله ای با عنوان رقت انگیز "حقیقت در مورد جلسات". تصوری دوسوگرا به جا می گذارد. در ابتدا، نویسنده به وضوح در مورد مکانیسم جلسه صحبت می کند، اما روش هایی که او تا پایان مقاله ارائه می دهد کاملاً نامشخص است.

    مقاله کتاب درسی توسط دیمیتری بورودین از سایت
    http://php.spb.ru/ به شدت توصیه نمی شود.
    بچه ها خیلی قدیمی شده نه تنها حاوی نادرستی واقعی است، بلکه جلسات در PHP به سادگی برای مدت طولانی کار نمی کنند.
    با تشکر فراوان از دیما برای آن، این اولین مقاله در مورد جلسات به زبان روسی بود، من خودم از آن مطالعه کردم، اما اکنون باید آن را به یک استراحت شایسته ارسال کنم.
    همچنین متاسفانه بسیاری از مقالات دیگر که در اینترنت هستند و سال هاست به روز نمی شوند نیز قدیمی هستند.

  • من نمی توانم بفهمم چرا، اما همه پاسخ ها را امتحان کردم/گوگل.. چیزی پیدا نکردم. وضعیت اینجاست:

    کد لوکال هاست

    نتیجه:

    () session_id از طریق برنامه pages و زمانی که صفحه به‌روزرسانی می‌شود، سازگار باشد. $_COOKIE["PHPSESSID"] با session_id () مطابقت دارد

    سرور مستقیم

    Session_start();

    نتیجه:

    echo session_id();

    print_r($_COOKIE["PHPSESSID"]);

    session_id() در هر درخواست، بارگذاری مجدد صفحه یا بازدید از صفحه دیگر تغییر می کند. $_COOKIE["PHPSESSID"] NULL/خالی است. از همین کد در بالای صفحه استفاده شده است. بدون محتوای دیگری

    این مشکل باعث سردرد واقعی من شده است، چه پیکربندی یا خطای سرور دقیقا می تواند باعث این مشکل شود؟ چرا کوکی PHPSESSID خالی است، فکر می‌کنم به این دلیل است که session_id() مرتبط در هر درخواستی نیز بازنشانی می‌شود؟ هر کمکی لطفا بچه ها!ویرایش: من یک فایل آزمایشی ساده با سه خط در محلی ساختم

    سرور راه دور

    . این به کد من مربوط نیست. $_COOKIE["PHPSESSID"] هنوز خالی است و session_id() جدید هر بار که به‌روزرسانی می‌شود روی میزبان واقعی اتفاق می‌افتد.

    error_reporting SET TO ALL من این را در یک میزبان زنده دریافت می کنم:

    توجه: نمایه تعریف نشده: PHPSESSID در /home/vivaplug/public_html/dev/wp-content/plugins/test.php در خط 5

    هدرهای گوگل کروم

    LOCALHOST

    درخواست URL:http://vivaplugins.com/dev/wp-content/plugins/test.php روش درخواست: دریافت کد وضعیت: 200 OK درخواست منبع Headersview Accept:text/html,application/xhtml+xml,application/xml; q=0.9,image/webp,*/*;q=0.8 Accept-Encoding:gzip,deflate,sdch Accept-Language:en-US,en;q=0.8 Cache-Control:max-age=0 Connection:keep- Alive Host:vivaplugins.com User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML، مانند Gecko) Chrome/30.0.1599.101 Safari/537.36 پاسخ Headersview منبع Age:no-Cache-Control -cache, must-revalidate, post-check=0, pre-check=0 Content-Encoding:gzip Content-Type:text/html Date:Tue, 05 Nov 2013 07:07:49 GMT Pragma:no-cache server: میزبانی پیشرفته توسط http://www.unixy.net/varnish Transfer-Encoding:chunked Vari:Accept-Encoding Via:1.1 varnish X-Cache:HIT X-Cache-Hits:2 X-Cacheable:YES X-Powered-By :PHP/5.4.20 X-Varnish:1984840969 1984839805

    جلسات در PHP مکانیزمی برای ذخیره اطلاعات مربوط به کامپیوتر مشتری در سمت سرور است. در واقع جلسات در PHP چندان موضوع پیچیده ای نیستند، اما برای درک آن باید بدانید که کوکی ها در PHP چگونه کار می کنند. بنابراین، اگر نمی‌دانید کوکی‌ها در PHP چگونه کار می‌کنند، ابتدا مقاله مربوطه را بخوانید و سپس به اینجا بازگردید.

    کلمه session از انگلیسی به عنوان session ترجمه شده است، بنابراین معنای جلسات در PHP واضح تر می شود، اما برنامه نویسان اصطلاح "sesions" را انتخاب کرده اند و ما در این مقاله از آن استفاده خواهیم کرد.

    جلسات در PHP بسیار شبیه به مکانیسم کوکی هستند، همان کلید => جفت ارزش، فقط آنها در سمت سرور ذخیره می شوند.

    تابع session_start().

    باید جلسه را شروع کنیم، برای این کار تابع session_start() وجود دارد. این تابع یک جلسه یا جلسه را شروع می کند، هر چه می خواهید آن را صدا بزنید.

    توصیه می شود که تابع session_start() را در همان ابتدای صفحه فراخوانی کنید، اما در مثال های من این کار را انجام نمی دهم.

    آرایه $_SESSION

    Session ها گروهی از متغیرها هستند که در سرور ذخیره می شوند اما به یک بازدید کننده منحصر به فرد اشاره می کنند. باز هم این نکته کلیدی است: جلسات بر روی سرور ذخیره می شود.

    به منظور اطمینان از تعامل هر بازدید کننده با داده های خود از جلسه خود، ما استفاده می کنیم کوکی، دستوری که PHP خود را ایجاد می کند، لازم نیست نگران آن باشید. این کوکی فقط مربوط به سرور است و نمی توان از آن برای به دست آوردن اطلاعات کاربر استفاده کرد.

    در سرور، داده های جلسه در آن ذخیره می شود فایل متنیو در برنامه PHP در آرایه $_SESSION موجود هستند. برای ذخیره یک متغیر در یک جلسه، باید یک مقدار در این آرایه به آن اختصاص دهید.

    بیایید در نهایت شروع به استفاده از مثال کنیم. خیلی ساده است.

    جلسات در PHP معنی"؛ ?>

    حال بیایید سعی کنیم مقدار را از آرایه $_SESSION در مثالی دیگر بدست آوریم.

    جلسات در PHP

    لطفاً توجه داشته باشید که اگر در مثال دوم تابع session_start() را حذف کنیم، به داده های آرایه $_SESSION دسترسی نخواهیم داشت.

    تابع session_id().

    پس از ایجاد یک جلسه، به طور خودکار با استفاده از تابع session_id () به شناسه منحصر به فرد جلسه دسترسی خواهید داشت. این تابع به شما امکان می دهد هم مقدار ID جلسه را تنظیم و هم دریافت کنید.

    جلسات در PHP

    می توانید در نوار ابزار توسعه دهنده مرورگر خود (در کروم، Ctrl + Shift + I و سپس Resources را فشار دهید و یک کوکی در آنجا پیدا می کنید)، این دامنه یک کوکی برای مرورگر شما با نام PHPSESSID و تقریباً زیر تنظیم کرده است. مقدار: "7g5df9rkd1hhvr33lq1k6c72p7".

    سرور با مقدار PHPSESSID است که مرورگر شما را تعیین می‌کند و با مجموعه متغیرهای مربوطه که از طریق آرایه $_SESSION در دسترس اسکریپت قرار می‌گیرد، همانطور که قبلاً نوشته شد، کار می‌کند.

    تابع session_name().

    در حالی که تابع session_id() به شما امکان می دهد مقدار session ID را بدست آورید، تابع session_name() به شما امکان می دهد نام جلسه را بدست آورید.

    جلسات در PHP

    یک بار دیگر در مورد تابع session_start()

    اکنون ما در مورد نحوه عملکرد جلسات در PHP بیشتر می دانیم و باید یک بار دیگر به تابع session_start() برگردیم. این تابع مکانیسم جلسه را برای کاربر فعلی مقداردهی اولیه می کند. دقیقاً چگونه این اتفاق می افتد:

    • اگر کاربر برای اولین بار سایت را راه اندازی کرد، سپس session_start() یک کوکی روی کلاینت تنظیم می کند و ذخیره سازی موقت روی سرور مرتبط با شناسه کاربر ایجاد می کند.
    • فروشگاه مرتبط با شناسه فعلی ارسال شده را مشخص می کند.
    • اگر داده ای در حافظه سرور وجود داشته باشد، در آرایه $_SESSION قرار می گیرد.
    • اگر register_globals از فایل php.ini روشن باشد، تمام عناصر آرایه $_SESSION به متغیرهای سراسری تبدیل می شوند.

    مثال استفاده از جلسه

    اکنون به مثالی نگاه می کنیم که به ما امکان می دهد آزمایش های کوچکی را با جلسات انجام دهیم.

    جلسات در PHP

    شمارنده

    شما صفحه ای را در جلسه فعلی باز کرده ایدیک بار

    مثال را در "> this tab باز کنید.

    تمام کارهای جلسه بر اساس آرایه $_SESSION است، این به وضوح در این مثال قابل مشاهده است.

    اگر پنجره مرورگر را ببندید، جلسه به پایان می رسد و شمارنده ما به صفر می رسد. این رفتار جلسات در PHP قابل تغییر است.

    پایان دادن به یک جلسه

    برای پایان دادن به جلسه نیاز داریم:

    1. آرایه $_SESSION را پاک کنید.
    2. حافظه موقت روی سرور را حذف کنید.
    3. حذف کوکی های جلسه

    می توانید آرایه $_SESSION را با استفاده از تابع session_unset() پاک کنید.

    تابع session_destroy() ذخیره سازی موقت روی سرور را حذف می کند. اتفاقا او کار دیگری انجام نمی دهد.

    شما باید یک کوکی جلسه را با استفاده از تابع setcookie() که در درس کار با کوکی ها در PHP یاد گرفتیم حذف کنید.

    نمونه ای از پایان دادن به یک جلسه:

    پایان دادن به یک جلسه

    جلسه به پایان رسید.

    اکنون می توانید آزمایشی را انجام دهید: یک مثال را با شمارنده در یک پنجره اجرا کنید، شمارنده را افزایش دهید، و سپس مثال را با حذف جلسه اجرا کنید و صفحه را با شمارنده دوباره تازه کنید.

    شما می توانید یک فایل کوکی را مانند این حذف کنید:

    setcookie(session_name()، ""، time() - 60*60*24*32، "/")

    یک بار دیگر در مورد توابع session_name() و session_id()

    توابع session_name() و session_id() به ندرت در عمل استفاده می شوند، اما من در مورد آنها می نویسم زیرا مقاله باید مکانیسم نحوه عملکرد جلسات در PHP را آشکار کند.

    شما می توانید از این توابع برای تعیین نام و شناسه جلسات خود استفاده کنید، اما این توصیه نمی شود. اگر می‌خواهید آنها را تنظیم کنید، این توابع را با آرگومان‌ها قبل از تابع session_start() بنویسید، مانند مثال زیر:

    جلسات در PHP

    با استفاده از این مثال، به همه کاربران یک شناسه جلسه اختصاص داده می شود.

    بیایید نگاهی دقیق‌تر به اینجا بیاندازیم: اگر مثال را از بخش مربوط به تابع session_name() (این لینک) در مرورگرهای مختلف (به عنوان مثال کروم و اینترنت اکسپلورر) اجرا کنید، هر مرورگر شناسه جلسه منحصر به فرد خود را خواهد داشت. . مرورگرها هر کدام کوکی ها را در پوشه خود ذخیره می کنند، بنابراین تابع session_start() به هر مرورگر اجازه می دهد شناسه منحصر به فرد خود را ایجاد کند و بر این اساس، یک حافظه منحصر به فرد برای هر مرورگر در سرور ایجاد می شود. بنابراین، مثال شمارنده (این یکی) به طور مستقل در هر مرورگر کار خواهد کرد.

    اگر شناسه جلسه یکسانی را برای همه کاربران تنظیم کنید، آن‌ها با یک فضای ذخیره‌سازی روی سرور کار خواهند کرد. در اینجا نمونه ای از شمارنده ای است که بازدیدهای مرورگرهای مختلف را شمارش می کند:

    100) ( session_unset(); session_destroy(); ) ?> جلسات در PHP

    پیشخوان شماره 2

    صفحه را در مرورگرهای مختلف باز کردیک بار

    مثال را در "> this tab باز کنید.

    اگر این مثال را اجرا کنید، این یک واقعیت نیست که یکی را در آنجا ببینید. سایر بازدیدکنندگان ممکن است قبلاً مقادیر موجود در session store روی سرور را تغییر داده باشند. من نمی دانم سرور در این مورد چه زمانی فضای ذخیره سازی را حذف می کند، بنابراین اگر شمارنده از 100 بیشتر شود، جلسه را پایان می دهم.

    تنظیم زمان انتظار

    به طور پیش فرض، جلسه "زنده" است تا زمانی که بازدید کننده پنجره مرورگر را ببندد. این به این دلیل است که تابع session_start() چنین کوکی را روی کلاینت قرار می دهد.

    طول عمر جلسه را می توان با استفاده از تابع session_set_cookie_params () تغییر داد، در اینجا نحو آن است.

    session_set_cookie_params (طول عمر int [، مسیر رشته [، دامنه رشته [، امن bool]]])

    در عمل فقط کافی است از اولین پارامتر (طول عمر) استفاده کنید، در اینجا زمان را بر حسب ثانیه می نویسید که تعیین می کند سرور چه مدت باید وضعیت جلسه را پس از بستن مرورگر به خاطر بسپارد.

    اثر تابع session_set_cookie_params() فقط برای دوره ای که اسکریپت در حال اجرا است اعمال می شود.

    در اینجا مثالی از استفاده از این تابع آورده شده است:

    جلسات در PHP

    پیشخوان شماره 3

    مقدار متقابل:.

    شمارنده را در "> این برگه باز کنید.

    پیشخوان را باز کنید و مرورگر را ببندید، پس از 30 ثانیه دوباره این مثال را باز کنید. جلسه شما ذخیره خواهد شد.

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

    اساساً، مدیریت جلسه تضمین می‌کند که کاربر متصل فعلی، شخصی است که احراز هویت شده است. اما متأسفانه، جلسات به یک هدف آشکار برای هکرها تبدیل شده اند زیرا می توانند بدون نیاز به احراز هویت، دسترسی به وب سرور را مجاز کنند.

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

    در این مقاله سعی خواهم کرد تمام راه هایی را که برای محافظت از Session ID در PHP می شناسم بیان کنم.

    استفاده از کوکی ها

    به طور پیش فرض، تمام اطلاعات جلسه، از جمله ID، به کوکی منتقل می شود. اما همیشه این اتفاق نمی افتد. برخی از کاربران کوکی ها را در مرورگر خود غیرفعال می کنند. در این صورت مرورگر شناسه جلسه را در URL ارسال می کند.

    در اینجا شناسه به صورت متنی واضح منتقل می شود، برخلاف جلسه از طریق یک کوکی، زمانی که اطلاعات در هدر HTTP پنهان می شود. ساده ترین راه برای محافظت در برابر این امر، ممنوع کردن انتقال شناسه جلسه از طریق نوار آدرس است. این را می توان با نوشتن موارد زیر در فایل پیکربندی سرور آپاچی .htaccess انجام داد:

    Php_flag session.use_only_cookies فعال است

    با استفاده از رمزگذاری

    اگر سایت شما باید اطلاعات حساسی مانند شماره کارت اعتباری را پردازش کند (سلام از سونی)، باید از رمزگذاری SSL3.0 یا TSL1.0 استفاده کنید. برای انجام این کار، هنگام تنظیم یک کوکی، باید true را برای پارامتر امن مشخص کنید.

    اگر رمز عبور جلسه را در متغیر $_SESSION ذخیره می‌کنید (هنوز بهتر است از sql استفاده کنید)، پس نباید آن را در متن شفاف ذخیره کنید.

    اگر ($_SESSION["گذرواژه"] == $userpass) ( // کد )

    کد بالا امن نیست زیرا رمز عبور به صورت متن ساده در متغیر جلسه ذخیره می شود. در عوض، از رمزگذاری md5 استفاده کنید، چیزی شبیه به این:

    اگر ($_SESSION["md5password"] == md5($userpass)) ( // کد )

    بررسی مرورگر

    برای جلوگیری از امکان استفاده از یک جلسه از یک مرورگر (رایانه) دیگر، باید قسمت هدر HTTP عامل کاربر را بررسی کنید:

    Session_start(); if (isset($_SESSION["HTTP_USER_AGENT"])) (اگر ($_SESSION["HTTP_USER_AGENT"] != md5($_SERVER["HTTP_USER_AGENT"])) ( // کد ) ) دیگری ($_SESSION["HTTP_USER_USER"] ] = md5($_SERVER["HTTP_USER_AGENT"])

    تاریخ انقضا جلسه

    طول عمر جلسه و همچنین طول عمر کوکی ها را محدود کنید. به طور پیش فرض، مدت زمان جلسه 1440 ثانیه است. می توانید این مقدار را از طریق php.ini و htaccess. تغییر دهید. مثال برای .htaccess:

    # طول عمر جلسه در ثانیه
    php_value session.gc_maxlifetime 3600
    # طول عمر کوکی در چند ثانیه
    php_value session.cookie_lifetime 3600

    اتصال با آدرس IP

    در شرایط خاص (نه همیشه)، باید با آدرس IP متصل شوید. عمدتاً زمانی که تعداد کاربران محدود است و آی پی های ثابت دارند. چک می تواند بر اساس لیست آدرس های IP مجاز باشد،

    Include("ip_list.php"); //$ip_white_list = آرایه ("admin1" => "111.222.333.444"، "admin2" => "555.666.777.888"); if(!empty(array_search($_SERVER["REMOTE_ADDR"],$ip_white_list))) ( header("Location: admin.php"); ) else (echo "ACCESS DENY!";)

    یا با آدرس IP برای هر درخواست (فقط برای IP استاتیک):

    If(isset($_SESSION["ip"]) و $_SESSION["ip"] == $_SERVER["REMOTE_ADDR"]) ( header ("Location: admin.php"); ) else ( session_unset(); $ _SESSION["ip"] = $_SERVER["REMOTE_ADDR"] )

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

    جلسات در PHP یا به عنوان داده های مربوط به کاربر یا مشتری که از یک سایت بازدید می کند، هنگام جابجایی بین صفحات یک سایت بدون مشکل ذخیره می شود. درس خیلی مهمه مربوط به ایجاد 95٪ از وب سایت ها.

    جلسه در php چیست؟

    جلسات برای ذخیره داده های موقت (مثلاً اینکه کاربر از یک سایت بازدید کرده است) هنگام پیمایش بین صفحات همان سایت استفاده می شود. هنگام استفاده از جلسات، داده ها در فایل های موقت روی سرور ذخیره می شوند.
    اغلب جلسات (و همچنین کوکی ها) هنگام ایجاد فروشگاه های آنلاین، انجمن ها، تابلوهای پیام، شبکه های اجتماعی، وبلاگ ها و سایر منابع استفاده می شود. راحتی سیستم جلسه ذخیره اطلاعات موقت کاربر/مشتری وارد شده است، که اطلاعات مربوط به آنها برای مدت زمان مشخصی به سرعت قابل دسترسی است. جلسه دارای تاریخ انقضای طبیعی است - تا زمانی که مرورگر بسته شود. اگر فقط صفحه را ببندید، پس از باز کردن سایت، اطلاعات مربوط به کاربر/مشتری همچنان در دسترس خواهد بود.

    منطق جلسه

    Session (یا session) نوعی ذخیره سازی موقت داده است. من فوراً به شما هشدار می دهم که صرفه جویی در مقدار کمی داده ارزش آن را دارد. به عنوان مثال، لاگین و رمز عبور کاربر بازدیدکننده یا شماره سریال او در پایگاه داده.

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

    فایل index.php

    Session_start(); // هر فایلی که می‌خواهید در آن از داده‌های جلسه استفاده کنید، باید حاوی دستور "شروع جلسه" در ابتدای کد باشد

    $login = "admin";
    $password = "گذر";
    $_SESSION["login"] = $login; // یک متغیر حاوی لاگین ذخیره کنید
    $_SESSION["password"] = $password; // یک متغیر حاوی رمز عبور ذخیره کنید

    3. وقتی به صفحه دیگری از سایت می روید، این داده ها نیز در دسترس خواهند بود:

    فایل example.php(یا هر صفحه دیگری)

    Echo "ورود شما ".$_SESSION["login"]; // "ورود شما مدیر است" را نمایش می دهد، اگرچه ما هیچ داده ای را در این صفحه ثبت نکردیم!
    ببینید، ساده است!

    4. اگر می خواهید داده های جلسه را پاک کنید، تنها کاری که باید انجام دهید این است:

    فایل example.php

    Session_start(); // "شروع جلسه" دوباره

    Unset($_SESSION["login"]); // به این ترتیب متغیر ثبت نشده یا "نابود شد"
    echo "ورود شما ".$_SESSION["login"]; // "ورود شما" را نمایش می دهد. از آنجایی که ما آن را در خط آخر نابود کردیم، هیچ داده ای وجود ندارد

    Session_Destroy(); // جلسه را از بین ببرید. همه داده‌ها، از جمله $_SESSION["رمز عبور"] دیگر وجود ندارد. هنگام درخواست آنها، یک خطا نمایش داده می شود
    به طور کلی، چنین انتقالی شبیه به روش POST است، اما دیگر نیازی به نوشتن کدهای غیر ضروری زیادی نیست و تمام داده های منتقل شده از صفحه به صفحه در فایل های موقت روی سرور ذخیره می شود. تکرار می کنم، جلسات باید حاوی مقادیر کمی از داده ها باشد، بنابراین برای ذخیره ورود / رمز عبور، سبد خرید و سایر حجم های کوچک مناسب هستند.

    ارسال یک مقدار یا آرایه با استفاده از یک جلسه PHP

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

    ما دوباره از یک صفحه شروع خاص استفاده می کنیم index.php

    Session_start();

    $r = آرایه ("یک"، "دو"، "سه");

    $_SESSION["arr"] = $r;

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

    فایل مقصد، صفحه test.phpجایی که آرایه را باز می کنیم

    Session_start();
    print_r($_SESSION["arr"]);
    // چاپ خواهد شد
    /*
    آرایه
    => یک
    => دو
    => سه
    */
    ?>
    ممکن است بخواهید در مورد درس در . به طور کلی، همه چیز باید روشن باشد.

    توابع دیگر برای کار با جلسات

    session_unregister (رشته)- جلسه مقدار متغیر جهانی مشخص شده را فراموش می کند.
    session_destroy()- جلسه از بین می رود (به عنوان مثال، اگر کاربر با کلیک بر روی دکمه خروج از سیستم خارج شود).
    session_set_cookie_params (طول عمر int [، مسیر رشته [، دامنه رشته]])- با استفاده از این تابع می توانید با تنظیم unix_timestamp که زمان مرگ جلسه را تعیین می کند، تعیین کنید که یک جلسه چقدر زنده بماند.

    لیست توابع کار با جلسات در php
    session_cache_expire - انقضای کش فعلی را برمی گرداند
    session_cache_limiter - محدود کننده کش فعلی را دریافت و/یا تنظیم می کند
    session_commit یک نام مستعار برای session_write_close() است.
    session_decode - داده های جلسه را از یک رشته رمزگشایی می کند
    session_destroy - تمام داده های ثبت شده برای جلسه را از بین می برد
    session_encode - داده های جلسه جاری را به عنوان یک رشته رمزگذاری می کند
    session_get_cookie_params - پارامترهای کوکی جلسه را دریافت می کند
    session_id - شناسه جلسه فعلی را می گیرد و/یا تنظیم می کند
    session_is_registered - تعیین می کند که آیا متغیر در جلسه ثبت شده است یا خیر
    session_module_name - ماژول جلسه فعلی را دریافت و/یا تنظیم می کند
    session_name - نام جلسه فعلی را می گیرد و/یا تنظیم می کند
    session_regenerate_id - شناسه جلسه فعلی را با یک شناسه تازه ایجاد شده تغییر می دهد
    session_register - یک یا چند متغیر را برای جلسه جاری ثبت می کند
    session_save_path - مسیر ذخیره جلسه جاری را دریافت و/یا تنظیم می کند
    session_set_cookie_params - پارامترهای کوکی جلسه را تنظیم می کند
    session_set_save_handler - عملکردهای ذخیره سازی جلسه در سطح کاربر را تنظیم می کند
    session_start - داده های جلسه را مقداردهی اولیه می کند
    session_unregister - یک متغیر را از جلسه فعلی لغو ثبت می کند
    session_unset - همه متغیرهای جلسه را آزاد می کند
    session_write_close - داده های جلسه و پایان جلسه را می نویسد

    نمونه کارهای جلسه

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

    تعداد بازدید از یک صفحه در یک جلسه

    // یک مثال ساده از استفاده از جلسات بدون کوکی.
    session_name("test");
    session_start();
    $_SESSION["count"] = @$_SESSION["count"] + 1;
    ?>

    شمارنده


    شما این صفحه را در جلسه فعلی مرورگر خود باز کرده اید
    زمان(ها).
    برای بازنشانی این شمارنده، مرورگر خود را ببندید.
    برای به روز رسانی صفحه اینجا را کلیک کنید!
    با هر انتقال شمارنده 1 افزایش می یابد)

    با تشکر از توجه شما! در تلاش های خود موفق باشید!