زنگ

کسانی هستند که این خبر را قبل از شما می خوانند.
برای دریافت آخرین مقالات مشترک شوید.
پست الکترونیک
نام
نام خانوادگی
چگونه می خواهید The Bell را بخوانید
بدون اسپم

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

استفاده از جلسات فناوری ساده: PHP یا با استفاده از شناسه گذشت (معمولاً از یک جلسه) داده ها را از یک جلسه موجود دریافت می کند کوکی) ، یا اگر چیزی منتقل نشد ، جلسه جدید ایجاد می شود. پس از شروع جلسه ، PHP سطح جهانی $ _SESSION را با اطلاعات جلسه جمع می کند. هنگامی که PHP خارج می شود ، به طور خودکار محتویات superglobal $ _SESSION را سریال می کند و برای ضبط جلسه ، آن را برای ذخیره با استفاده از یک جلسه گیرنده ارسال می کند.

PHP بصورت پیش فرض از یک هندلر داخلی استفاده می کند فایل ها برای صرفه جویی در جلسات ، که در متغیر session.save_handler INI تنظیم شده است. این کنترل کننده داده ها را در سرور موجود در دایرکتوری مشخص شده در جلسه تنظیمات session.save_path ذخیره می کند.

ساده ترین مثال استفاده از یک جلسه ، برای مثال نمایش تعداد بازدیدهای صفحه برای هر کاربر:

انسداد جلسه چگونه ممکن است؟

در وب سایت php در بخش توضیحات جلسه یک یادداشت وجود دارد (http://php.net/manual/ru/session.examples.basic.php):

جلسات با استفاده از پرونده ها (به طور پیش فرض در PHP) ، بلافاصله پس از باز کردن جلسه با عملکرد session_start () یا به طور غیرمستقیم هنگام مشخص کردن session.auto_start ، پرونده جلسه را مسدود کنید. پس از قفل شدن ، هیچ اسکریپت دیگری نمی تواند به همان جلسه جلسه دسترسی داشته باشد تا اینکه بسته شود یا اینکه اسکریپت به پایان برسد یا اینکه عملکرد session_write_close () فراخوانی شود.

به احتمال زیاد این مسئله برای سایتهایی که به طور فعال از آنها استفاده می کنند به مشکل تبدیل می شود آژاکس و چندین درخواست همزمان کنید. آسانترین راه حل این مشکل فراخوانی تابع session_write_close () است به محض اینکه تمام تغییرات لازم در جلسه انجام شد ، ترجیحا به شروع فیلمنامه نزدیکتر شوید. همچنین می توانید از مکانیزم جلسه دیگری استفاده کنید که از همزمانی حمایت کند.

اخیراً مشکل مسدود کردن جلسات شایع تر شده است. این تا حدودی به دلیل عارضه سایتها و لزوم انجام محاسبات بیشتر در سمت سرور و همچنین توزیع بیشتر است. آژاکس... متأسفانه ، منطق کاربرد ، به ویژه اگر پیچیده باشد ، همیشه زمان انسداد فرآیندهای رقابت برای یک جلسه را به طور موثری محدود نمی کند. اوضاع از آنجا تشدید می شود که 3-5 چنین مشتریانی قادر به سرعت کارگران PHP را با فرآیندهای منجمد و بیکار مهار می کنند ، در نتیجه سایت شروع به صدور می کند خطای 5XX .

ساده ترین نمونه جلسات مسدود کردن:

// فقط برای یک فیلمنامه ?>

اگر این پرونده را ابتدا در اولین برگه باز کنید ، و سپس در برگه دوم ، برگه دوم منتظر خواهد بود تا اولین آن تمام شود. یعنی در واقع ، برگه دوم صبر خواهد کرد تا اولین نسخه پرونده جلسه را منتشر کند (که در این حالت خاص 30 ثانیه طول می کشد). این مشکل به خوبی در وبلاگ شرکت توضیح داده شده است 1C-Bitrix در حبرابر.

چه گزینه هایی برای حل این مشکل وجود دارد

برای ذخیره جلسات می توانید از بانکهای اطلاعاتی مانند MySQL یا PostgreSQL (که با توجه به قابلیت های اکثر پایگاه های داده و سرعت کار در آن کاملاً صحیح نیست این وظیفه), بهم پیوست (ذخیره جلسه را تضمین نمی کند ، ممکن است حذف شود) و ردیسکه ما اعتقاد داریم ذخیره سازی بهینه... از نظر سرعت ، از Memcached فرومایه نیست ، اما در عین حال می تواند ایمنی داده ها را تضمین کند.

و مهمترین مزیت ردیس - هنگام ذخیره جلسات در آن ، آنها مسدود نمی شوند.

در کنترل پنل () ما می توانید فضای ذخیره جلسه در Redis را برای همه سایتهای موجود در حساب خود فعال کنید. برای این کار ، به " وب سایتها"، و سپس کادر را علامت بزنید -" ذخیره جلسات کلیه سایتها در Redis".

مواد اضافی

بخش ها

SSH

FTP

برنامه های وب

  • بررسی اجمالی نصب برنامه (محیط مجازی داکر)

تشخیص مشکلات

دامنه ها

  • لغو نام دامنه در منطقه .RU / .РФ که ثبت کننده آن Beget برای آن است
  • انتقال حقوق مربوط به نام دامنه .RU / .РФ / .SU و مناطق بین المللی (تغییر مدیر دامنه)

سلام بر جامعه عزیز.

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

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

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

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

عملکرد startSession () (// اگر جلسه از قبل شروع شده است ، اجرای را متوقف کنید و TRUE // (پارامتر session.auto_start را در پرونده تنظیمات php.ini باید غیرفعال کنید - مقدار پیش فرض) اگر (session_id ()) درست برگردد ، دیگر بازگشت session_start ()؛ // توجه: قبل از نسخه 5.3.0 ، عملکرد session_start () حتی در صورت بروز خطا ، TRUE را بازگرداند. // اگر از نسخه زیر 5.3.0 استفاده می کنید ، اعتبارسنجی اضافی session_id () // را بعد از فراخوانی session_start () انجام دهید. ویرایش اسلحه () (اگر (session_id ())) (// اگر جلسه فعال وجود دارد ، کوکی های جلسه ، setcookie (session_name ()) ، session_id () ، زمان () - 60 * 60 * 24) را حذف یا حذف کنید ( )؛ session_destroy ()؛))

توجه داشته باشید: فرض بر این است که خواننده دانش اساسی در مورد جلسات PHP دارد ، بنابراین ما نحوه کارکرد session_start () و session_destroy () را پوشش نمی دهیم. وظایف چیدمان فرم ورود به سیستم و تأیید اعتبار کاربر مربوط به موضوع مقاله نیست ، بنابراین ما نیز از آنها صرف نظر خواهیم کرد. بگذارید فقط یادآوری کنم که برای شناسایی کاربر در هر درخواست بعدی ، در لحظه ورود موفق ، باید شناسه کاربر را در متغیر جلسه (با نام کاربری مثلاً) ذخیره کنیم ، که در کلیه درخواستهای بعدی در طول عمر جلسه در دسترس خواهد بود. همچنین لازم است که پردازش نتیجه عملکرد startSession () ما را پیاده سازی کند. اگر عملکرد FALSE برگردد ، فرم ورود را در مرورگر نمایش دهید. اگر تابع TRUE را برگرداند ، و متغیر جلسه حاوی شناسه کاربر مجاز (در مورد ما ، userid) وجود داشته باشد ، صفحه کاربر مجاز را نمایش دهید (برای جزئیات بیشتر در مورد استفاده از خطا ، افزودنیهای 2013-06-07 را در بخش متغیرهای جلسه مشاهده کنید).

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

کنترل عدم تحرک کاربر با ابزارهای داخلی PHP

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

عملکرد startSession () (// مدت زمان غیرفعال کردن کاربر (در ثانیه) $ sessionLifetime \u003d 300؛ اگر (session_id ()) درست برگردد ؛ // تنظیم طول عمر کوکی ini_set ("session.cookie_lifetime" ، $ sessionLifetime)؛ // اگر مدت زمان عدم فعالیت کاربر تنظیم شده است ، طول جلسه را روی سرور تنظیم کنید // توجه: برای سرور تولید ، توصیه می شود این پارامترها را در پرونده php.ini از پیش تنظیم کنید اگر ($ sessionLifetime) ini_set ("session.gc_maxlifetime" ، $ sessionLifetime)؛ if (session_start ( )) (setcookie (session_name ()، session_id ()، time () + $ sessionLifetime)؛ true true؛) other false false؛)

چند توضیح همانطور که می دانید ، PHP تعیین می کند که کدام جلسه برای شروع با نام کوکی که توسط مرورگر در عنوان درخواست قرار دارد ، شروع شود. مرورگر ، به نوبه خود ، این کوکی را از سرور دریافت می کند ، جایی که عملکرد session_start () آن را در آن قرار می دهد. اگر کوکی در مرورگر منقضی شده باشد ، در درخواست منتقل نمی شود ، این بدان معناست که PHP قادر به تعیین کدام جلسه برای شروع نیست و این را ایجاد جلسه جدید تلقی می کند. پارامتر تنظیمات PHP session.gc_maxlifetime که برابر با زمان غیرفعال کردن کاربر ما است ، طول جلسه PHP را تنظیم می کند و توسط سرور کنترل می شود. کنترل طول جلسه به شرح زیر عمل می کند (در اینجا ما نمونه ای از ذخیره جلسه در پرونده های موقت را به عنوان رایج ترین و پیش فرض نسخه در PHP در نظر می گیریم).

در زمان ایجاد یک جلسه جدید ، پرونده ای به نام sess_ در دایرکتوری ایجاد شده به عنوان دایرکتوری ذخیره سازی جلسات در جلسه پارامتر تنظیمات PHP ایجاد می شود.save_path جایی که - شناسه جلسه. علاوه بر این ، در هر درخواست ، در زمان شروع جلسه موجود ، PHP زمان اصلاح این پرونده را به روز می کند. بنابراین ، در هر درخواست بعدی PHP ، با تفاوت بین زمان فعلی و زمان آخرین تغییر پرونده جلسه ، می تواند تعیین کند که جلسه فعال است یا عمر آن قبلاً تمام شده است. (مکانیسم حذف پرونده های جلسه قدیمی با جزئیات بیشتر در بخش بعدی مورد بحث قرار گرفته است).

توجه داشته باشید: در اینجا لازم به ذکر است که پارامتر session.gc_maxlifetime تمام جلسات را در یک سرور تحت تأثیر قرار می دهد (دقیق تر ، در یک فرایند اصلی PHP). در عمل ، این بدان معناست که اگر چندین سایت روی سرور در حال اجرا هستند و هرکدام از آنها زمان خود را برای عدم فعالیت کاربران اختصاص داده اند ، تنظیم این پارامتر در یکی از سایت ها منجر به نصب آن برای سایت های دیگر می شود. همین مسئله در مورد میزبانی مشترک نیز انجام می شود. برای جلوگیری از این وضعیت ، دایرکتوری های جلسه جداگانه برای هر سایت در یک سرور استفاده می شود. تنظیم مسیر دایرکتوری جلسه با استفاده از پارامتر session.save_path در پرونده تنظیمات php.ini یا با فراخوانی تابع ini_set () انجام می شود. پس از آن جلسات هر سایت در دایرکتوری های جداگانه ذخیره می شود و پارامتر session.gc_maxlifetime که در یکی از سایت ها تنظیم شده است ، فقط برای جلسه آن معتبر خواهد بود. ما این مورد را به طور جزئی مورد بررسی قرار نمی دهیم ، به خصوص که گزینه قابل انعطاف تری برای کنترل عدم فعالیت کاربر داریم.

کنترل عدم تحرک کاربر با استفاده از متغیرهای جلسه

به نظر می رسد که نسخه قبلی ، به دلیل سادگی (فقط چند ردیف اضافی از کد) ، همه آنچه را که لازم داریم ارائه می دهد. اما اگر نتواند هر درخواستی را نتیجه فعالیت کاربر دانست؟ به عنوان مثال ، این صفحه دارای یک تایمر است که به صورت دوره ای درخواست AJAX را برای دریافت به روزرسانی از سرور انجام می دهد. چنین درخواستی را نمی توان فعالیت کاربر در نظر گرفت ، به این معنی که تمدید خودکار طول جلسه در این مورد صحیح نیست. اما می دانیم که PHP هر زمان که فراخوانی تابع session_start () فراخوانی شود ، به طور خودکار زمان تغییر پرونده جلسه را به روز می کند ، بدین معنی که هر درخواستی به طولانی شدن طول جلسه منجر شود و هیچ وقت عدم تحرک کاربر رخ نمی دهد. علاوه بر این ، آخرین یادداشت از قسمت قبلی در مورد پیچیدگی های پارامتر session.gc_maxlifetime ممکن است برای اجرای بسیار گیج کننده و پیچیده به نظر برسد.

برای حل این مشکل ، ما از استفاده از مکانیسم های PHP داخلی استفاده خواهیم کرد و چندین متغیر جلسه جدید را معرفی خواهیم کرد که به ما امکان می دهد زمان عدم تحرک کاربر را به تنهایی کنترل کنیم.

شروع کارکرد ($ isUserActivity \u003d true) ($ sessionLifetime \u003d 300؛ اگر (session_id ()) درست برگردد ؛ // طول عمر کوکی را تنظیم کنید تا مرورگر بسته شود (همه چیز را در سمت سرور کنترل خواهیم کرد)) ini_set ("session.cookie_lifetime" ، 0) ؛ اگر (! session_start ()) نادرست برگردد ؛ $ t \u003d زمان () ؛ اگر ($ sessionLifetime) (// اگر زمان عدم فعالیت کاربر تعیین شده است ، // بررسی زمان سپری شده از آخرین فعالیت کاربر را بررسی کنید // (زمان آخرین درخواست هنگامی که متغیر جلسه فعال بودن به روز شد)) ((صادر ($ _ SESSION ["ماندگاری")) && $ t - $ _ SESSION ["lastactivity"]\u003e \u003d $ sessionLifetime) (// اگر زمان از آخرین فعالیت کاربر سپری شده است) / مدت زمان غیرفعالیت بیشتر ، سپس جلسه منقضی شده است ، و شما نیاز دارید که جلسه را به پایان برساند تخریب () ؛ غلط برگردید ؛) دیگری (// اگر زمان وقوع هنوز رخ نداده است ، // و اگر درخواست به عنوان نتیجه فعالیت کاربر آمده است ، // متغیر تحرک را با مقدار جریان به روز کنید. vr emeny ، // بدین ترتیب زمان جلسه را با یک جلسه دیگر افزایش می دهد. اگر زمان ($ isUserActivity) $ _SESSION ["lastactivity"] \u003d $ t؛ )) درست برگردان؛ )

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

به روز رسانی از 2013-06-07
پردازش نتیجه عملکرد sessionStart ()

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

همانطور که مشاهده می کنید ، عملکرد sessionStart می تواند FALSE را در دو حالت برگرداند. در هر صورت جلسه به دلیل برخی از خطاهای سرور داخلی (به عنوان مثال ، تنظیمات نادرست جلسه در php.ini) شروع نمی شود ، یا این جلسه تمام شده است. در حالت اول ، باید با خطایی که مشکلی در سرور وجود دارد ، و نوعی تماس با پشتیبانی ، کاربر را به صفحه هدایت کنیم. در حالت دوم ، باید کاربر را به فرم ورود به سیستم انتقال دهیم و پیام مربوطه را در آن نمایش دهیم که جلسه تمام شده است. برای این کار باید کدهای خطا را وارد کرده و کدهای مربوطه را به جای FALSE برگردانیم و در روش فراخوانی آن را بررسی کرده و مطابق آن عمل کنیم.

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

توجه داشته باشید: چه اتفاقی می افتد اگر مرورگر بسته شود و کوکی نام جلسه به طور خودکار از بین برود؟ درخواست به سرور دفعه بعد که مرورگر باز می شود ، حاوی کوکی های جلسه نخواهد بود و سرور قادر به باز کردن جلسه و بررسی زمان عدم فعالیت کاربر نخواهد بود. برای ما ، این به معنای ایجاد یک جلسه جدید است و به هیچ وجه بر عملکرد یا امنیت تأثیر نمی گذارد. اما یک سؤال منصفانه پیش می آید - اگر تا الان پس از اتمام مهلت ، آن را خراب کرده ایم ، جلسه قدیمی را نابود می کنیم؟ یا آیا اکنون برای همیشه در فهرست فهرست قرار خواهد گرفت؟ برای تمیز کردن جلسات قدیمی ، پی اچ پی مکانیزمی به نام جمع آوری زباله دارد. این در زمان درخواست بعدی به سرور شروع می شود و کلیه جلسات قدیمی را بر اساس تاریخ پاک می کند آخرین تغییر پرونده های جلسه با این حال ، مکانیسم جمع آوری زباله بر اساس هر درخواست به سرور شروع نمی شود. فراوانی (یا به عبارت بهتر ، احتمال) راه اندازی توسط دو پارامتر تنظیمات session.gc_probability و session.gc_divisor تعیین می شود. نتیجه تقسیم پارامتر اول به دوم ، احتمال شروع مکانیسم جمع آوری زباله است. بنابراین ، برای اینکه مکانیسم تمیز کردن جلسه در هر درخواست به سرور شروع شود ، این پارامترها باید روی مقادیر مساوی تنظیم شوند ، به عنوان مثال "1". این روش تضمین می کند که دایرکتوری جلسه تمیز باشد ، اما برای سرور آشکارا بیش از حد سربار است. بنابراین ، در سیستم های تولید ، session.gc_divisor بصورت پیش فرض روی 1000 تنظیم می شود ، بدین معنی که موتور جمع آوری زباله با احتمال 1/1000 شروع می شود. اگر با این تنظیمات در پرونده php.ini خود آزمایش کنید ، متوجه خواهید شد که در مورد فوق ، هنگامی که مرورگر تمام کوکی های خود را بسته و پاک می کند ، جلسات قدیمی مدتی هنوز در فهرست دایرکتوری ها قرار دارند. اما این نباید شما را نگران کند ، زیرا همانطور که قبلاً نیز گفته شد ، این به هیچ وجه بر ایمنی مکانیسم ما تأثیر نمی گذارد.

به روز رسانی از 2013-06-07

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

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

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

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

در مثال ما ، این بدان معناست که بلافاصله پس از باز کردن جلسه ، بررسی طول عمر آن و وجود کاربر مجاز ، باید تمام متغیرهای جلسه اضافی لازم برای برنامه (در صورت وجود) را بخوانیم و ذخیره کنیم ، سپس با فراخوانی session_write_close () ، جلسه را ببندید و ادامه دهیم. اجرای یک فیلمنامه ، خواه یک نظرسنجی طولانی باشد یا یک درخواست منظم.

جلسات محافظت از استفاده غیرمجاز

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

چرا این امکان پذیر است؟ بدیهی است ، زیرا نام و نام شناسه جلسه همیشه برای کل طول جلسه یکسان است و در صورت دریافت این داده ها ، می توانید آزادانه درخواست هایی را به نمایندگی از کاربر دیگری ارسال کنید (طبیعتاً در طول عمر این جلسه). شاید این رایج ترین نوع حمله نباشد ، اما در تئوری همه چیز کاملاً عملی به نظر می رسد ، به خصوص با توجه به اینکه چنین Trojan حتی به سرپرست کوکی های مرورگر کاربر نیازی به حقوق سرپرستان ندارد.

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

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

(اجازه دهید بخشی از کدی که قبلاً مورد بحث قرار گرفته است را حذف کنیم).

عملکرد startSession ($ isUserActivity \u003d true) (// طول عمر شناسه جلسه $ idLifetime \u003d 60؛ ... if ($ idLifetime) (// اگر طول عمر شناسه جلسه تنظیم شده است ، // بررسی زمان سپری شده از زمان ایجاد یا آخرین جلسه بازسازی // (زمان آخرین درخواست زمانی که زمان شروع متغیر جلسه به روز شد) اگر (صادر ($ _ SESSION ["شروع"))) (if ($ t - $ _ SESSION ["starttime"]\u003e \u003d $ idLifetime) (// Time شناسه جلسه منقضی شده است // یک شناسه جدید ایجاد کنید session_regenerate_id (true)؛ $ _SESSION ["starttime"] \u003d $ t؛)) other "(// اگر جلسه به تازگی ایجاد شده است به اینجا می رسیم // زمان تولید شناسه جلسه را در زمان فعلی تنظیم کنیم. $ _SESSION ["زمان شروع"] \u003d $ t؛)) درست است ؛)

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

توجه داشته باشید: هنگامی که تابع session_regenerate_id () فراخوانی می شود ، شناسه جدید جلسه وارد کوکی مرورگر می شود که یک کوکی جدید ، مشابه عملکرد session_start () را ارسال می کند ، بنابراین نیازی نیست که ما خود کوکی را به روز کنیم.

اگر می خواهیم جلسات خود را تا حد امکان ایمن کنیم ، کافی است طول عمر شناسه را بر روی یک تنظیم کنیم ، یا حتی عملکرد session_regenerate_id () را در خارج از براکت ها قرار دهیم و همه چک ها را حذف کنیم ، که منجر به احیای شناسه در هر درخواست خواهد شد. (من تأثیر این رویکرد را روی عملکرد آزمایش نکرده ام و فقط می توانم بگویم که تابع session_regenerate_id (true) در اصل فقط 4 عمل را انجام می دهد: تولید یک شناسه جدید ، ایجاد یک هدر از کوکی جلسه ، حذف قدیمی و حذف پرونده جدید.

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

امکان کار همزمان در یک مرورگر به نمایندگی از چندین کاربر

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

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

عملکرد startSession ($ isUserActivity \u003d true، $ prefix \u003d null) (... if (session_id ()) true true؛ // اگر پیشوند کاربر در پارامترها منتقل شد ، // یک نام جلسه منحصر به فرد تنظیم کنید که شامل این پیشوند است ، // در غیر این صورت نامی مشترک برای همه کاربران (برای مثال ، MYPROJECT) session_name ("MYPROJECT". (پیشوند $؟ "_". پیشوند $: ""))؛ ini_set ("session.cookie_lifetime" ، 0) ؛ اگر (! session_start ()) بازگشت به دروغ ؛ ...)

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

نتیجه

در پایان ، من کد نهایی کامل توابع ما را برای کار با آنها خواهم داد جلسات PHP، از جمله تمام کارهایی که در بالا بحث شد.

عملکرد startSession ($ isUserActivity \u003d true، $ prefix \u003d null) ($ sessionLifetime \u003d 300؛ $ idLifetime \u003d 60؛ if (session_id ()) true true؛ session_name ("MYPROJECT". (پیشوند $؟ "_". $ prefix: ""))؛ ini_set ("session.cookie_lifetime" ، 0) ؛ اگر (! session_start ()) نادرست برگردد ؛ $ t \u003d زمان () ؛ اگر ($ sessionLifetime) (اگر (صادرکننده ($ _ جلسه) ["ماندگاری"]) ) && $ t - $ _ SESSION ["lastactivity"]\u003e \u003d $ sessionLifetime (ruSession ()؛ false false Return؛) و غیره (اگر ($ isUserActivity) $ _SESSION ["lastactivity"] \u003d $ t؛)) if ($ idLifetime) ) (if (isset ($ _ SESSION ["starttime"])) "(if ($ t - $ _ SESSION [" starttime "]\u003e \u003d $ idLifetime) (session_regenerate_id (true)؛ $ _SESSION [" starttime "] \u003d $ t؛ )) other ($ _SESSION ["starttime"] \u003d $ t؛)) true () true () true () (if (session_id ())) (session_unset ()؛ setcookie (session_name ()، session_id ()) time () -60 * 60 * 24)؛ session_destroy ()؛))

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

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

بیایید با اضافه کردن فیلدها به جدول شروع کنیم « کاربران» ... ما به یک فیلد برای ذخیره آدرس ایمیل ، فیلدی برای کاربر کاربر (0 - غیرفعال ، 1 - فعال) و یک فیلد با تاریخ ثبت احتیاج داریم.





سپس باید ترفند کنید save_user.phpبا افزودن چک برای صحت آدرس ایمیل و ارسال نامه ای جهت تأیید ثبت نام. نامه حاوی پیوندی با دو متغیر است که به روش get منتقل شده است : ورود و تولید ، منحصر به فرد برای هر کاربر ، کد. ما به کد نیاز داریم تا کاربر نتواند حساب خود را بدون نامه فعال کند و این اطمینان را به ما می دهد که آدرس ایمیل وارد شده واقعاً به او تعلق دارد. بعد از استخراج داده های ارسالی از متغیرهای جهانی کد زیر را اضافه کنید:

اگر (صادر کننده ($ _ POST ["ایمیل"])) ($ email \u003d $ _POST ["ایمیل"] ؛ اگر ($ email \u003d\u003d "") (تنظیم نشده است ($ ایمیل) ؛))
اگر (خالی (ورود به سیستم $) یا خالی (رمز عبور $) یا خالی (کد $) یا خالی ($ ایمیل))
// اضافه کردن یک متغیر باه- نامهنشانی
// اگر کاربر نام کاربری یا رمز ورود خود را وارد نکرد ، ما خطایی را صادر می کنیم و اسکریپت را متوقف می کنیم
{
خروج ("شما تمام اطلاعات را وارد نکردید ، برگردید و همه قسمتها را پر کنید!")؛ // متوقف کردن اجرای اسکریپت ها
}
اگر (! preg_match ("/ [ایمیل محافظت شده]+ \\. (2،3) / i "، پست الکترونیکی $)) // آدرس ایمیل را بررسی کنید عبارات با قاعده برای صحت
(خروج ("نامه الکترونیکی نامعتبر وارد شد!")))

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

// اگر نه ، سپس داده را ذخیره کنید
$ result2 \u003d mysql_query ("وارد کاربران شوید (ورود ، گذرواژه ، نماد ، ایمیل ، تاریخ) VALUES (" $ ورود "،" رمز عبور $ "،" $ avatar "،" ایمیل $ "، اکنون ()))؛
// بررسی کنید که آیا خطایی وجود دارد یا خیر
if ($ result2 \u003d\u003d "TRUE")
{
$ result3 \u003d mysql_query ("انتخاب شناسه از کاربران WHERE login \u003d" $ login "" ، db $) ؛ // شناسه کاربر را بازیابی کنید. با تشکر از او ، ما یک کد فعال سازی منحصر به فرد خواهیم داشت ، زیرا نمی توان دو شناسه یکسان داشت.
$ myrow3 \u003d mysql_fetch_array (result3 $)؛
$ activation \u003d md5 ($ myrow3 ["id"]) .md5 ($ ورود)؛ // کدفعال سازیحساب. بگذارید شناسه را رمزگذاری کنیم و از طریق عملکرد md5 وارد شوید. بعید است که کاربر بتواند چنین ترکیبی را به صورت دستی از طریق نوار آدرس انتخاب کند.
$ subject \u003d "تأیید ثبت نام"؛ //موضوع پیام
$ پیام \u003d "سلام! با تشکر از شما برای ثبت نام در citename.ru \\ n ورود شما:". $ وارد شوید. "\\ n
برای فعال کردن حساب خود پیوند را دنبال کنید: \\ nhttp: //localhost/test3/activation.php؟ ورود \u003d ". $ ورود." & Code \u003d ". $ activation." \\ N با احترام ، \\ n
Administrator citename.ru "؛ // محتوای پیام
نامه (ایمیل $ ، موضوع $ ، پیام $ ، "نوع محتوا: متن / هواپیما ؛ Charset \u003d windows-1251 \\ r \\ n")؛ // ارسال یک پیام

اکو "نامه ای برای تأیید ثبت نام برای شما ارسال شده است. توجه! این لینک به مدت 1 ساعت معتبر است. صفحه اصلی"؛ // صحبت در مورد ایمیل ارسال شده به کاربر
}

پیغام فرستاده شد! اکنون کاربر آن را باز کرده و پیوند مشخص شده به صفحه را که کد فعال سازی را بررسی می کند ، دنبال می کند. پس از اطمینان از صحت کد ، ثبت را با تغییر مقدار فیلد در دیتابیس تأیید می کنیم فعال سازی از "0" به "1".

ایجاد پرونده activation.php

شامل ("bd.php")؛ // فایلbd. پی اچ پی باید در همان پوشه مانند همه افراد باشد ، اگر اینگونه نیست که فقط مسیر را تغییر دهید
$ result4 \u003d mysql_query ("SELECT avatar از کاربران WHERE activation \u003d" 0 "AND UNIX_TIMESTAMP () - UNIX_TIMESTAMP (تاریخ)\u003e 3600") ؛ // بازیابی آواتارهای کاربرانی که ظرف یک ساعت حساب خود را فعال نکرده اند. بنابراین ، آنها باید از پایگاه داده و همچنین پرونده های آواتارهای آنها حذف شوند
if (mysql_num_rows (نتیجه 4 $)\u003e 0) (
$ myrow4 \u003d mysql_fetch_array (result4 $)؛
انجام دادن
{
// اگر استاندارد نیستند ، آواتارها را در یک حلقه حذف کنید
if ($ myrow4 ["avatar"] \u003d\u003d "آواتار / net-avatara.jpg") ($ a \u003d "کاری نکن"؛)
دیگری (
uninkink ($ myrow4 ["نماد"])؛ // پرونده را حذف کنید
}
}
در حالی که ($ myrow4 \u003d mysql_fetch_array (نتیجه 4 $))؛
}
mysql_query ("DELETE از کاربران WHERE activation \u003d" 0 "AND UNIX_TIMESTAMP () - UNIX_TIMESTAMP (تاریخ)\u003e 3600")؛ // کاربران را از پایگاه داده حذف کنید
if (صادرکننده ($ _ GET ["کد"])) (کد $ \u003d $ _ دریافت ["کد"]؛) //کد تایید
دیگر
(خروج ("شما بدون کد تأیید وارد صفحه شدید!"))) // اگر مشخص نشده باشدکد، سپس ما یک خطا می دهیم
if (isset ($ _ GET ["ورود"])) ($ log \u003d $ _ GET ["ورود"]؛) // ورود به سیستم برای فعال کردن
دیگر
(خروج ("شما بدون ورود به صفحه وارد شدید!"))) // اگر ورود به سیستم را مشخص نکرده اید ، خطایی را صادر می کنیم
$ result \u003d mysql_query ("انتخاب شناسه از کاربران که در آن ورود به سیستم \u003d" $ ورود "" ، db $)؛ // با استفاده از شناسه کاربری ، شناسه کاربری را بازیابی کنید
$ activation \u003d md5 ($ myrow ["id"]). md5 ($ ورود)؛ // ایجاد همان کد تأیید
if (فعال سازی $ \u003d\u003d کد کد) ( // مقایسه به دست آمده ازآدرس و کد تولید شده
mysql_query ("به روز رسانی کاربران تنظیم فعال سازی \u003d" 1 "در اینجا ورود به سیستم \u003d" $ ورود "" ، db $)؛ // اگر برابر باشد ، کاربر را فعال کنید
echo "نامه شما تأیید شده است! اکنون می توانید با استفاده از نام کاربری خود وارد سایت شوید! صفحه اصلی"؛
}
دیگری (تکرار "خطا! ایمیل شما تأیید نشده است! صفحه اصلی")؛
// اگر از بدست آمده باشدآدرس و کد تولید شده برابر نیست ، بنابراین ما خطایی می دهیم
}
?>

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

$ result \u003d mysql_query ("SELECT * از کاربران که در آن ورود به سیستم \u003d" $ ورود "و رمزعبور \u003d" $ رمز عبور "و فعال سازی \u003d" 1 "" ، دلار db)؛ // بازیابی اطلاعات از داده های مربوط به کاربر با ورود به سیستم
// ما اضافه کردیم "وفعال سازی\u003d "1" "، یعنی کاربر فقط در بین فعالین جستجو می شود. توصیه می شود برای داده های کاربر این شرط را به سایر چک های مشابه اضافه کنید.

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

ورود خودکار






هم اکنون ثبت نام کنید


رمز ورود خود را فراموش کرده اید؟

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

if (isset ($ _ POST ["login"])) ($ login \u003d $ _POST ["ورود"]؛ if ($ login \u003d\u003d "") (تنظیم نشده ($ ورود)؛)) // اگر وارد شده توسط کاربر وارد متغیر ورود به سیستم شوید ، در صورت خالی بودن ، متغیر را نابود کنید
if (صادرکننده ($ _ POST ["ایمیل"])) ($ email \u003d $ _POST ["ایمیل"]؛ if ($ email \u003d\u003d "") (تنظیم نشده (ایمیل)))) // در صورت خالی بودن ، نامه الکترونیکی وارد شده توسط کاربر را وارد کنید ، سپس متغیر را نابود کنید
if (صادر کننده (ورود به سایت $) و صادر کننده (ایمیل)) ( // در صورت وجود متغیرهای مورد نیاز

شامل ("bd.php")؛

$ result \u003d mysql_query ("انتخاب شناسه از کاربران که در آن ورود به سیستم \u003d" $ ورود "و ایمیل \u003d" $ email "و فعال سازی \u003d" 1 "" ، db $)؛ // چنینچهدرکاربره- نامه
$ myrow \u003d mysql_fetch_array (نتیجه $)؛
if (خالی ($ myrow ["id"]) یا $ myrow ["id"] \u003d\u003d "") (
// در صورت عدم وجود کاربر فعال با این ورود و آدرس ایمیل
derket ("هیچ کاربر با این آدرس ایمیل در هیچ پایگاه داده CIA یافت نشد. صفحه اصلی")؛
}
// اگر یک کاربر با چنین نام کاربری و ایمیل پیدا شد ، باید یک رمز عبور تصادفی برای او تولید کنید ، آن را در دیتابیس به روز کنید و آن را به ایمیل ارسال کنید
$ datenow \u003d تاریخ ("YmdHis")؛ // واگذاری تاریخ
$ new_password \u003d md5 ($ datenow)؛ // تاریخ را رمزگذاری کنید
$ new_password \u003d substr ($ new_password ، 2 ، 6)؛ // استخراج 6 کاراکتر از رمز ، از دوم شروع کنید. این رمز عبور تصادفی ما خواهد بود. در مرحله بعد ، ما آن را به پایگاه داده می نویسیم ، و آن را طبق معمول رمزگذاری می كنیم.

$ new_password_sh \u003d strrev (md5 ($ new_password)). "b3p6f"؛ // رمزگذاری شده
mysql_query ("به روز رسانی کاربران تنظیم گذرواژه \u003d" $ new_password_sh "WHERE login \u003d" $ login "" ، db $)؛ // به روز شدهکه درپایه
// تشکیل پیام

$ message \u003d "سلام" ، $ login. "! ما یک رمز ورود برای شما ایجاد کردیم ، اکنون می توانید با استفاده از آن وارد سایت citename.ru شوید. پس از وارد کردن ، توصیه می شود آن را تغییر دهید. رمزعبور: \\ n". $ new_password؛ // متن پیام
نامه (نامه الکترونیکی $ ، "بازیابی رمز عبور" ، پیام $ ، "نوع محتوا: متن / هواپیما ؛ Charset \u003d windows-1251 \\ r \\ n")؛ // ارسالپیام

اکو " نامه ای با رمز عبور برای نامه الکترونیکی شما ارسال شده است. بعد از 5 ثانیه منتقل می شوید. اگر نمی خواهید صبر کنید ، لطفا اینجا را کلیک کنید. "؛ // تغییر مسیر کاربر
}
دیگری ( // اگر هنوز هیچ داده ای وارد نشده است
پژواک "


رمز ورود خود را فراموش کرده اید؟


رمز ورود خود را فراموش کرده اید؟



ورود به سیستم خود را وارد کنید:



نامه الکترونیکی خود را وارد کنید:






";
}
?>

در مرحله بعد ، ما وارد یک اتوماتیک می شویم. اینگونه کار خواهد کرد: پس از ورود به سیستم با موفقیت در کادر انتخاب ، دکمه خودکار "بله" در کوکی وارد می شود. اگر سرور آن خودکار \u003d "بله" را در مرورگر ببیند ، جلسه ای را آغاز می کند و متغیرها را در آنجا می کشد. سپس جلسات در حال اجرا بر علیه پایگاه داده بررسی می شود.

بیایید باز کنیم امتحان. پی اچ پی و کد را بعد از ورود موفقیت آمیز اضافه کنید:

اگر (صادر ($ _ POST ["ذخیره"])) (
// اگر کاربر بخواهد داده های خود را برای ورود بعدی ذخیره کند ، ما آنرا در کوکی های مرورگر خود ذخیره می کنیم

setcookie ("id" ، $ myrow ["id"] ، زمان () + 9999999)؛)
if (صادر ($ _ POST ["autovhod"])) (
// اگر کاربر بخواهد به طور خودکار وارد سایت شود
setcookie ("خودکار" ، "بله" ، زمان () + 9999999)؛
setcookie ("ورود به سیستم" ، $ _POST ["ورود"] ، زمان () + 9999999)؛
setcookie ("رمز عبور" ، $ _POST ["رمز عبور"] ، زمان () + 9999999)؛
setcookie ("id" ، $ myrow ["id"] ، زمان () + 9999999)؛)

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

// کل روش در جلسات کار می کند. در آن است که داده های کاربر در حین حضور در سایت ذخیره می شود. اجرای آنها در همان ابتدای صفحه بسیار حائز اهمیت است !!!
session_start ()؛
شامل ("bd.php")؛ // فایل bd.php باید در همان پوشه مانند سایر افراد باشد ، اگر اینگونه نباشد ، فقط کافیست مسیر را تغییر دهید
اگر (صادر ($ _ COOKIE ["خودکار"]) و صادر ($ _ COOKIE ["ورود"]) و صادر شوید ($ _ COOKIE ["رمز عبور"]))
{// در صورت وجود متغیرهای مورد نیاز
if ($ _COOKIE ["خودکار"] \u003d\u003d "بله") ( // اگر کاربر می خواهد به طور خودکار وارد سیستم شود ، سپس جلسات را شروع کنید
$ _SESSION ["پسورد"] \u003d strrev (md5 ($ _ COOKIE ["رمز عبور"])). "B3p6f"؛ // در کوکی ها رمز عبور رمزگذاری نشده بود ، اما در جلسات معمولاً رمزگذاری می شود
$ _SESSION ["login"] \u003d $ _ COOKIE ["ورود"]؛ // جلسهاز جانبوارد شدن
$ _SESSION ["id"] \u003d $ _ COOKIE ["id"]؛ //شناسه کاربر
}
}

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

Setcookie ("خودکار" ، "" ، زمان () + 9999999)؛ // ورود خودکار پاک کنید

همچنین لازم است به آن اضافه شود به روز رسانی_ کاربر. پی اچ پی بعد از به روزرسانی ورود به جلسه:

$ _SESSION ["ورود به سیستم"] \u003d $ ورود؛ // ورود به جلسه را در جلسه به روز کنید
if (صادر ($ _ COOKIE ["ورود"])) (
setcookie ("ورود" ، $ ورود ، زمان () + 9999999)؛ // در حال بروز رسانیوارد شدنکه درکلوچه ها
}

و همین کار را با رمز انجام دهید

$ result4 \u003d mysql_query ("به روز رسانی کاربران تنظیم گذرواژه \u003d" $ رمز عبور "WHERE login \u003d" $ old_login "" ، db $)؛ // به روز رسانیکلمه عبور
if ($ result4 \u003d\u003d "TRUE") ( // در صورت صحت ، آن را در جلسه به روز کنید
$ _SESSION ["پسورد"] \u003d $ رمزعبور؛
if (صادرکننده ($ _ COOKIE ["گذرواژه"])) (
setcookie ("رمز عبور" ، $ _ POST ["رمز عبور"] ، زمان () + 9999999)؛ // در حال بروز رسانیکلمه عبورکه درکلوچه ها, اگر یکآنهاوجود دارد
}

خودشه. امیدوارم موفق شوید! موفق باشید!

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

  • ما رمز عبور را با استفاده از الگوریتم رمزگذاری می کنیم MD5
  • رمز عبور "نمکی" خواهد بود
  • بررسی کنید که ورود شلوغ است یا خیر
  • فعال سازی کاربر با نامه
  • نوشتن و ذخیره داده ها در MySQL DBMS

برای نوشتن این اسکریپت ، باید درک کنیم ثبت نام کاربر چیست. ثبت نام کاربر دریافت اطلاعات از یک کاربر واقعی ، پردازش و ذخیره داده ها است.

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

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

بیایید ساختار مجوزهای اسکریپت را برای اجرای ثبت نام خود با مجوز در نظر بگیریم. ما باید اسکریپت ها را به اجزای منطقی تقسیم کنیم. ماژول های ثبت نام و مجوز را در یک فهرست جداگانه قرار داده ایم. ما همچنین اتصال به دیتابیس را در دایرکتوریهای جداگانه قرار خواهیم داد. MySQL، پرونده با توابع سفارشی ، پرونده سبک CSS و الگوی ما HTML... این ساختار به شما امکان می دهد تا به سرعت در اسکریپت ها حرکت کنید. تصور کنید که شما یک سایت بزرگ با تنه ماژول و غیره دارید. و اگر نظمی وجود نداشته باشد ، پیدا کردن چیزی در چنین آشفتگی بسیار دشوار خواهد بود.

از آنجا که ما تمام داده ها را در آن ذخیره خواهیم کرد MySQL DBMS، سپس بیایید یک جدول کوچک ایجاد کنیم که در آن داده های ثبت نام را ذخیره می کنیم.

ابتدا باید یک جدول در دیتابیس ایجاد کنید. جدول نامیده می شود bez_reg جایی که bez پیشوند جدول ، و رج نام جدول

ساختار جدول: bez_reg

- - جدول جدول `bez_reg` - ایجاد جدول اگر وجود ندارد bez_reg` (` id` int (11) NULL AUTO_INCREMENT نیست ، `login` varchar (200) NOT NULL ،` pass` varchar (32) NULL ، `نمک` varchar (32) NOT NULL ،` activ_hex` varchar (32) NULL ، `status` int (1) NOT NULL ، KEY PRIMARY (` id`)) ENGINE \u003d MyISAM DEFAULT CHARSET \u003d utf8 AUTO_INCREMENT \u003d 1؛

حال اجازه دهید اسکریپت های اصلی را برای کارهای بعدی ایجاد کنیم.

پرونده INDEX.PHP

پرونده CONFIG.PHP

"); ?>

پرونده 404.html

خطای 404

خطای 404

یک خطای 404 در صفحه رخ داده است

برگشتن

پرونده BD.PHP

پرونده INDEX.HTML

ثبت نام کاربر PHP MySQL با فعال سازی ایمیل

پرونده FUNCT.PHP

"." \\ n "؛ اگر (is_array ($ داده)) (پیشگویی (داده $ به عنوان $ Val) $ اشتباه است. \u003d"

  • "$ Val"
  • "." \\ n "؛) دیگری $ err. \u003d"
  • "$ data."
  • "." \\ n "؛ $ خطا. \u003d""." \\ n "؛ $ err Return؛) / ** بسته بندی ساده برای نمایش داده های MySQL *param رشته $ sql * / عملکرد mysqlQuery ($ sql) ($ res \u003d mysql_query ($ sql)) ؛ / * بررسی نتیجه این نمایش پرس و جو واقعی ارسال شده به MySQL ، و همچنین خطا. دستیابی به اشکال زدایی. * / if (! $ res) ($ message \u003d "درخواست نامعتبر:". mysql_error (). "\\ n"؛ $ پیام \u003d \u003d پرس و جو به طور کامل : ". $ sql؛ die ($ پیام)؛) بازگرداندن $ res؛) / ** مولد ساده نمک *param رشته $ sql * / عملکرد نمک () (نمک $ \u003d بستر (md5 (صریح ())) ، - 8)؛ نمک دلخواه را برگردانید؛)

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

    پرونده REG.PHP

    شما با موفقیت ثبت نام کردید! لطفاً حساب خود را فعال کنید !!"؛ // اگر (صادر (($ _ GET [" کلید "]))) حساب را فعال کنید (// کلید $ sql \u003d" SELECT * از "را بررسی کنید. BEZ_DBPREFIX." Reg` WHERE` activ_hex` \u003d "" Escape_str ( $ _GET ["کلید"]). "" "؛ $ Res \u003d mysqlQuery ($ sql)؛ if (mysql_num_rows ($ res) \u003d\u003d 0) $ err \u003d" کلید فعال سازی صحیح نیست! "؛ // بررسی خطاها و نمایش دادن به کاربر اگر (تعداد ($ err)\u003e 0) echo showErrorMessage ($ err) باشد ، دیگری (// آدرس کاربر $ row \u003d mysql_fetch_assoc ($ res)) را بدست آورید؛ // ایمیل را فعال کنید کاربر $ sql \u003d "UPDATE`". BEZ_DBPREFIX. "reg` SET` status` \u003d 1 WHERE` login` \u003d "". $ email. "" "؛ $ res \u003d mysqlQuery ($ sql)؛ // ارسال ایمیل برای فعال سازی $ title \u003d "(! LANG: حساب شما در سایت http: // با موفقیت فعال شد"; $message = "Поздравляю Вас, Ваш аккаунт на http://сайт успешно активирован"; sendMessageMail($email, BEZ_MAIL_AUTOR, $title, $message); /*Перенаправляем пользователя на нужную нам страницу*/ header("Location:". BEZ_HOST ."less/reg/?mode=reg&active=ok"); exit; } } /*Если нажата кнопка на регистрацию, начинаем проверку*/ if(isset($_POST["submit"])) { //Утюжим пришедшие данные if(empty($_POST["email"])) $err = "Поле Email не может быть пустым!"; else { if(!preg_match("/^!} [ایمیل محافظت شده](+ \\.) + (2،6) $ / i "، $ _POST [" ایمیل "])) $ err \u003d" نامه نادرست وارد شده است "." \\ N "؛) اگر (خالی ($ _ POST [ "pass"])) $ err \u003d "قسمت گذرواژه خالی نیست"؛ اگر (خالی ($ _ POST ["pass2"])) $ err \u003d "قسمت تأیید رمز عبور نمی تواند خالی باشد" ؛ // بررسی خطاها و خروجی برای کاربر در صورتی که (تعداد ($ err)\u003e 0) echo showErrorMessage ($ err) را نمایش دهد ، دیگری (/ * ادامه بررسی اطلاعات وارد شده رمزهای عبور را برای تطبیق * بررسی کنید * / if ($ _ POST ["pass"]! \u003d $ _POST ["pass2" ]) $ err \u003d "گذرواژه ها مطابقت ندارند"؛ // خطاها را بررسی کنید و اگر (تعداد ($ err)\u003e 0) echo showErrorMessage ($ err) echo showErrorMessage را نشان دادید ، کاربر دیگری را بررسی کنید * / $ sql \u003d "SELECT` login` FROM`". BEZ_DBPREFIX. "reg` WHERE` login` \u003d" ". Escape_str ($ _ POST [" email "])." ""؛ $ res \u003d mysqlQuery ($ sql)؛ if (mysql_num_rows ($ res)\u003e 0) $ err \u003d "ببخشید ورود: ". $ _POST [" ایمیل "]" مشغول شوید! "؛ // خطاها را بررسی کنید و اگر (تعداد ($ err)\u003e 0) echo showErrorMessage ($ err) echo show را به کاربر نمایش دهید ، دیگری (// // HASH نمک را دریافت کنید $ $ \u003d نمک \u003d نمک () ؛ // کلمه عبور نمکی $ pass \u003d md5 (md5 ($ _ POST ["عبور"]) $ $ نمک)؛ / * اگر همه چیز خوب است ، داده ها را به پایگاه داده بنویسید * / $ sql \u003d "INSERT INTO". BEZ_DBPREFIX. "reg` VALUES (" "" "" . Escape_str ($ _ POST ["ایمیل"]). "" "" "$ $ pass." "" "" $. نمک. "" ، "". md5 ($ نمک) "" ، 0) "؛ $ res \u003d mysqlQuery ($ sql)؛ // ارسال نامه ای برای فعال کردن $ url \u003d BEZ_HOST. "less / reg /؟ mode \u003d reg & key \u003d". md5 ($ نمک)؛ $ title \u003d "(! LANG: ثبت نام در http: / /سایت اینترنتی"; $message = "Для активации Вашего акаунта пройдите по ссылке ". $url .""; sendMessageMail($_POST["email"], BEZ_MAIL_AUTOR, $title, $message); //Сбрасываем параметры header("Location:". BEZ_HOST ."less/reg/?mode=reg&status=ok"); exit; } } } } ?>!}

    پرونده REG_FORM.HTML

    ثبت نام کاربر PHP MySQL با فعال سازی ایمیل

    پست الکترونیک *:
    کلمه عبور *:
    تایید رمز عبور *:

    زمینه هایی با یک نماد * مورد نیاز هستند

    از آنجا که ما برای ثبت نام کاربران آماده هستیم ، نوبت به نوشتن مجوز رسیده است. بیایید یک فرم برای مجوز کاربر ایجاد کنیم ، سپس یک کنترل کننده فرم تأیید نامه بنویسید و در آخر یک فیلمنامه تهیه کنیم show.php که به ما نشان خواهد داد که آیا ما در سیستم مجاز هستیم یا نه.

    پرونده AUTH.PHP

    0) echo showErrorMessage ($ err)؛ دیگری (/ * برای تأیید صحت کاربر ، یک درخواست برای واکشی از پایگاه داده ایجاد کنید * / $ sql \u003d "SELECT * FROM" "BEZ_DBPREFIX." reg` WHERE `login` \u003d" ". Escape_str ($ _ POST [" email "]) . "" AND "status` \u003d 1"؛ $ res \u003d mysqlQuery ($ sql)؛ // اگر ورود به سیستم مطابقت دارد ، رمز عبور را بررسی کنید اگر (mysql_num_rows ($ res)\u003e 0) (// دریافت داده ها از جدول $ row \u003d mysql_fetch_assoc ( $ res)؛ if (md5 (md5 ($ _ POST ["pass"])). $ row ["نمک"]) \u003d\u003d $ row ["pass"]) ($ _SESSION ["user"] \u003d true؛ // بازگرداندن عنوان پارامترها ("موقعیت مکانی:" ". $ _POST [" ایمیل "]" یافت نشد!)))))\u003e\u003e

    برای کسانی که آخرین نسخه PHP را دارند ، من این اسکریپت را با استفاده از ارسال می کنم PDO از آنجا که انبساط MySQL مستهلک شده و از نسخه PHP جدیدتر حذف شده است. ثبت نام و مجوز php mysql pdo را بارگیری کنید

    این بایگانی در تاریخ 24 فوریه 2015 به روز شد.

    توجه: اگر از این اسکریپت بر روی سرور محلی مانند استفاده می کنید انقباض, XAMPP، پس نباید منتظر نامه های صندوق پستی خود باشید. نامه ها خالی است ارسال ایمیل... که در منکر می توانید آنها را در طول راه پیدا کنید Z: \\ tmp \\! Sendmail \\ می توانید این پرونده ها را در هر سرویس گیرنده نامه باز کنید.

    ما یاد خواهیم گرفت که احراز هویت ساده کاربر را در سایت انجام دهیم. این سایت فقط می تواند دارای صفحات برای کاربران مجاز باشد و در صورت اضافه کردن اعتبار احراز هویت به آنها ، آنها کاملاً کار می کنند. برای ایجاد آن ، به یک پایگاه داده MySQL نیاز دارید. اگر می خواهید اطلاعات کاربر اضافه کنید ، می تواند 5 ستون (حداقل) یا بیشتر داشته باشد. بیایید پایگاه داده را "کاربرات" بنامیم.

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

    کد MySQL

    ایجاد جدول "کاربران" ("ID" int (11) NULL AUTO_INCREMENT ، "UID" int (11) NULL ، `نام کاربری" متن NULL ، متن "پست الکترونیکی" NULL ، متن "رمز عبور" NULL ، کلید اصلی) (`ID`)) ENGINE \u003d MyISAM DEFAULT CHARSET \u003d utf8 AUTO_INCREMENT \u003d 1؛

    حال بیایید پرونده "sql.php" ایجاد کنیم. وی مسئول اتصال به دیتابیس است. این کد ابتدا با اتصال به سرور ، متغیرهایی را برای سرور و کاربر ایجاد می کند. دوم ، این پایگاه داده را انتخاب می کند ، در این حالت "USERAUTH". برای دسترسی به پایگاه داده ، این پرونده باید به "log.php" و "reg.php" وصل شود.

    کد PHP

    // نام کاربری MySQL شما $ pass \u003d "تغییر مسیر"؛ // رمزعبور $ conn \u003d mysql_connect (سرور $ ، کاربر کاربر ، $ pass)؛ // اتصال به سرور $ db \u003d mysql_select_db ("userauth" ، $ conn)؛ // پایگاه داده را انتخاب کنید اگر (! دلار db) ( // در صورت عدم امکان انتخاب بانک اطلاعاتی echo "متأسفیم ، خطا: (/\u003e"؛ // پیام خطا را نشان می دهد خروج () // اجازه می دهد اسکریپت های دیگر PHP کار کنند } ?>

    بعد صفحه ورود به سیستم است ، بیایید آنرا "login.php" بنامیم. ابتدا داده های وارد شده را برای خطا بررسی می کند. این صفحه دارای زمینه هایی برای نام کاربری ، رمز عبور ، دکمه ارسال و پیوند ثبت نام است. هنگامی که کاربر دکمه "ورود" را کلیک می کند ، فرم با کد از پرونده "log.php" پردازش می شود و سپس سیستم وارد سیستم می شود.

    کد PHP

    0) { // در صورت وجود خطاهای جلسه $ err \u003d "

    "؛ // پیش نمایش جدول را شروع کنید ($ _SESSION [" ERRMSG "] به عنوان $ msg) (" // هر خطا را تشخیص دهید $ err. \u003d " "; // آن را به یک متغیر بنویسید ) $ err. \u003d "
    ". $ msg."
    "; // جدول را ببندید تنظیم نشده است ($ _SESSION ["ERRMSG"])؛ // حذف جلسه } ?> فرم ورود
    نام کاربری
    کلمه عبور
    ورود به سیستم

    سپس یک اسکریپت می نویسیم تا وارد سیستم شویم. بیایید آنرا "log.php" بنامیم. این تابع برای پاک کردن داده های ورودی از تزریق SQL است که می تواند اسکریپت شما را خراب کند. دوم ، داده فرم را دریافت می کند و اعتبار آن را تأیید می کند. اگر ورودی صحیح باشد ، اسکریپت کاربر را به صفحه کاربران مجاز ارسال می کند ، در غیر این صورت ، خطایی را ایجاد کرده و کاربر را به صفحه ورود ارسال می کند.

    کد PHP

    // شروع جلسه برای ضبط تابع ثابت ($ str) (// پاک کردن زمینه های $ str \u003d برش ($ str) ؛ اگر (get_magic_quotes_gpc ())) ($ str \u003d نوارپشتها ($ $)؛) // آرایه برای ذخیره خطاها $ errflag \u003d نادرست؛ // خطای پرچم $ نام کاربری \u003d ثابت ($ _ POST ["نام کاربری"])؛ //نام کاربری $ password \u003d Fix ($ _ POST ["پسورد"])؛ // رمزعبور) // رمز عبور را بررسی کنید if ($ password \u003d\u003d "") ($ errmsg \u003d "رمز عبور از دست رفته است" ؛ // خطا $ errflag \u003d true؛ // در صورت بروز خطا پرچم را بالا می برد) // در صورت تنظیم پرچم خطا ، به فرم ثبت نام برگردانید // خطاهای ورود به سیستم session_write_close ()؛ // جلسه نزدیک // تغییر مسیر خروج () ) // پرس و جو از پایگاه داده $ qry \u003d "SELECT * FROM" users` WHERE `Username` \u003d" $ username "AND` Password` \u003d" ". md5 (پسورد $)" "" "؛ $ result \u003d mysql_query ($ qry)؛ // بررسی کنید که آیا درخواست موفقیت آمیز بود (اگر داده ای در مورد آن وجود دارد) if (mysql_num_rows ($ result) \u003d\u003d 1) (در حالی که ($ row \u003d mysql_fetch_assoc ($ result)) ($ _SESSION ["UID"] \u003d $ row ["UID"]؛ // UID را از پایگاه داده دریافت کرده و در جلسه قرار دهید $ _SESSION ["USERNAME"] \u003d $ نام کاربری؛ // تنظیم می کند اگر نام کاربری در جلسه مطابقت داشته باشد session_write_close ()؛ // جلسه نزدیک header ("مکان: end.php")؛ // تغییر مسیر )) other ($ _SESSION ["ERRMSG"] \u003d "نام کاربری یا گذرواژه نامعتبر"؛ \u200b\u200b// خطا session_write_close ()؛ // جلسه نزدیک هدر ("مکان: login.php")؛ // تغییر مسیر خروج () )؟\u003e

    بیایید یک صفحه ثبت نام ایجاد کنیم ، آن را "Register.php" بنامیم. این شبیه به صفحه ورود است ، فقط چند فیلد دیگر دارد و به جای پیوند ثبت نام ، پیوندی به login.php در صورتی که کاربر قبلاً دارای یک حساب کاربری باشد.

    کد PHP

    0) { // در صورت وجود خطاهای جلسه $ err \u003d "

    "؛ // شروع پیش نمایش جدول ($ _SESSION [" ERRMSG "] به عنوان $ msg) (" // هر خطایی را تنظیم می کند $ err. \u003d " "; // آنها را به یک متغیر بنویسید ) $ err. \u003d "
    ". $ msg."
    "؛ // پایان تنظیم جدول ($ _SESSION [" ERRMSG "])؛ // جلسه را خراب کنید } ?> فرم ثبت نام
    نام کاربری
    پست الکترونیک
    کلمه عبور
    تکرار رمز عبور
    من یک حساب دارم

    حالا بیایید یک اسکریپت ثبت نام را در پرونده "reg.php" ایجاد کنیم. این برنامه شامل "sql.php" برای اتصال به پایگاه داده است. برای پاک کردن قسمت ورودی از همان کارکرد مشابه در اسکریپت ورود استفاده می کند. متغیرها برای خطاهای احتمالی تنظیم شده اند. بعدی عملکردی برای ایجاد شناسه منحصر به فرد است که قبلاً ارائه نشده است. سپس داده ها از فرم ثبت نام گرفته و اعتبار می یابند. بررسی می کند که آدرس ایمیل در قالب صحیح است و دوباره رمز ورود به درستی وارد شده است. سپس اسکریپت بررسی می کند که آیا کاربر با همین نام در بانک اطلاعاتی وجود دارد یا خیر ، در صورت بروز خطا گزارش می دهد. سرانجام ، کد کاربر را به پایگاه داده اضافه می کند.

    کد PHP

    // شروع جلسه برای ضبط تابع ثابت ($ str) (// زمینه های روشن $ str \u003dtrim ($ str) ؛ اگر (get_magic_quotes_gpc ())) ($ str \u003d نوارهای تبلیغاتی ($ $) ؛) mysql_real_escape_string را برگردانید($ $)؛ ) $ errmsg \u003d آرایه ()؛ // آرایه برای ذخیره خطاها $ errflag \u003d نادرست؛ // flag flag UID \u003d "12323543534523453451465685454"؛ // ID منحصر به فرد $ نام کاربری \u003d ثابت ($ _ POST ["نام کاربری"])؛ //نام کاربری $ email \u003d $ _POST ["ایمیل"]؛ // Email $ password \u003d Fix ($ _ POST ["پسورد"])؛ // پسورد $ rpassword \u003d ثابت ($ _ POST ["rpassword"])؛ // تکرار رمز عبور // بررسی نام کاربری if ($ username \u003d\u003d "") ($ errmsg \u003d "نام کاربری از دست رفته"؛ // خطا $ errflag \u003d true؛ // خطا پرچم را بالا می برد ) // ایمیل را بررسی کنید اگر (! eregi ("^ [_ a-z0-9 -] + (\\. [_ a-z0-9 -] +) * @ + (\\. +) * (\\. (2،3 )) $ "، $ email)) (// باید با قالب مطابقت داشته باشد: [ایمیل محافظت شده] $ errmsg \u003d "ایمیل نامعتبر"؛ // خطا $ errflag \u003d true؛ // خطا پرچم را بالا می برد } // رمز عبور را بررسی کنید if ($ password \u003d\u003d "") ($ errmsg \u003d "گذرواژه از دست رفته"؛ // خطا $ errflag \u003d true؛ // خطا پرچم را بالا می برد } // بررسی تکرار رمز عبور if ($ rpassword \u003d\u003d "") ($ errmsg \u003d "رمز عبوری تکرار نشد"؛ // خطا $ errflag \u003d true؛ // خطا پرچم را بالا می برد } // بررسی کنید که آیا رمزعبور معتبر است یا خیر if (strcmp (رمز عبور $ ، کلمه کلیدی $!)! \u003d 0) ($ errmsg \u003d "کلمه عبور مطابقت ندارد"؛ // خطا $ errflag \u003d true؛ // خطا پرچم را بالا می برد } // بررسی کنید که آیا نام کاربری رایگان است if ($ username! \u003d "") ($ qry \u003d "SELECT * FROM" users` WHERE `Username` \u003d" $ username ""؛ // query MySQL $ result \u003d mysql_query ($ qry)؛ if (result $) (اگر (mysql_num_rows (نتیجه $)\u003e 0) ( // اگر نام از قبل استفاده شده است $ errmsg \u003d "نام کاربری قبلاً در حال استفاده است"؛ // پیغام خطا $ errflag \u003d درست؛ // خطا پرچم را بالا می برد ) mysql_free_result (نتیجه $)؛ )) // در صورت عدم تأیید داده ها ، دوباره به فرم ثبت نام هدایت می شود if ($ errflag) ($ _SESSION ["ERRMSG"] \u003d $ errmsg؛ // پیغام خطا session_write_close ()؛ // جلسه نزدیک header ("مکان: Register.php")؛ // تغییر مسیر خروج () ) // اضافه کردن داده به پایگاه داده $ qry \u003d "INSERT INTO` userauth`.`users` ("UID" ، "نام کاربری" ، "ایمیل" ، "رمزعبور") VALUES ("$ UID" ، "نام کاربری $" ، "$ email" ، "". md5 (رمز عبور $) "") "؛ $ result \u003d mysql_query ($ qry)؛ // بررسی کنید که آیا درخواست افزود موفقیت آمیز بوده است یا خیر اگر (نتیجه $) (تکرار "از شما برای ثبت نام متشکریم". $ نام کاربری ". لطفاً وارد شوید اینجا"؛ derket () ؛) other (ببندید (" خطا ، لطفا بعداً با ما تماس بگیرید ")؛)؟\u003e

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

    کد PHP

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

    کد PHP

    یکی از شرایط موجود در کد بالا موضوع سؤال در است.

    کد زیر برای کاربران مجاز باید در صفحه درج شود ، به عنوان مثال "عضو.php" نامیده می شود ، اما شما را می توان هر آنچه دوست دارید بنامید.

    کد PHP

    شما مجاز به دسترسی به این صفحه هستید. خروج ( )

    احراز هویت کاربر آماده است!

    زنگ

    کسانی هستند که این خبر را قبل از شما می خوانند.
    برای دریافت آخرین مقالات مشترک شوید.
    پست الکترونیک
    نام
    نام خانوادگی
    چگونه می خواهید The Bell را بخوانید
    بدون اسپم