قبل از هر چیز پوزش از دیر شدن.
خوب حالا که دیتابیس و جدول کاربران و صفحه و فرآیند ورود آنها ردیف شده، ادامه ماجرا:
طراحی صفحات کابران وارد شده
البته امیدوارم همه امکانات و صفحات و گزارشگیری های مختص کاربران عضو را در یک صفحه مثلاً user.asp طراحی کرده باشید که آن صفحه مثلاً با کویری استرینگ های مختلف اعمال مختلف مورد نظر را اجرا کند، مثلا user.asp?page=1 یا user.asp?page=2 و .... ولی اگر برای هر عملی یک صفحه جدا طراحی کرده باشید همه این کار ها که گفته خواهد شد را باید اول همه این صفحات انجام دهید. (به راحتی با Include)
در طراحی این صفحات قبل شروع کد خود صفحه که اعمالی خاص مانند گزارشگیری و ... را انجام می دهد، حداقل 3 کار و یا فرآیند را بایستی در نظر داشته باشید و برایش کد بنویسید که به ترتیب از این قرار می باشد:
1- جلوگیری از کش شدن و ذخیره در هیستوری مرورگر.
مسلماً صفحاتی که مخصوص اعضای وارد شده یک سایت می باشند و یا حاوی مطالب خصوصی می باشند (مثل داخل ایمیل یاهو و ...) و یا حاوی مطالبی که کاربر می تواند آن ها را ویرایش و سپس صفحه را فرا بخواند، باشد، نبایستی کش شود و در هیستوری قرار گیرد. اگر صفحه کش شود، هر تغییر و ویرایشی که در صفحه ایجاد می شود با فراخوانی مجدد صفحه دوباره مطالب قبلی نمایش داده می شود و همچنین اگر صفحه در هیستوری ذخیره شود (البته مطالب صفحه مد نظر است)، حتی اگر کاربر از سایت به درستی هم خارج شده باشد (ساین اوت یا لوگ اوت)، و حتی پس از قطع اتصال اینترنت و حتی تا چند روز آینده توسط خود آن نفر یا هر نفر دیگری که پشت آن رایانه بنشیند آن صفحه قابل مشاهده می باشد که این فاجعه است.
این چند خط زیر را اگر همین گونه در بالای هر صفحه ای قرار دهید این کار را برای شما می کند:
کد:
<%
Response.Expires=-1
Response.ExpiresAbsolute=Now()-2
Response.AddHeader"pragma","no-cache"
Response.AddHeader"cache-control","private"
Response.CacheControl="No-Store"
%>
نکته: پیشنهاد می شود اگر حتی صفحه اول سایتتان بسیار پویا و با تغییرات روزانه بروز می شود، از این کد در بالای آن صفحه هم استفاده کنید. تا اگر کاربری مدام به سایت شما سر می زند و کش مرورگرش هم فعال باشد نیاز به رفرش کردن به همراه خالی کردن کش (Ctrl+F5) نداشته باشد.
2- بررسی اعتبار کاربر.
در این مرحله بایستی اعتبار کاربری که این صفحه را فراخوانی کرده را بسنجیم. می خواهیم ببینیم این شخص همان کاربری است که آمده و یوزرنیم و پسورد را درست وارد کرده؟ یا این شخص دیگری است که مثلاً مستقیماً آمده و آدرس این صفحه را در نوار آدرس نوشته؟
برای این کار بایستی ببینیم آیا قبلاً (تا 20 دقیقه پیش که زمان پیش فرض موجودیت سکشن هاست) ما در صفحه ورود به سایت برای این کاربر سکشن ایجاد کرده ایم یا نه؟ (توجه شود که سکشن که برای هر بازدید کننده منحصزر به فرد است را تنها برای افرادی که یوزرنیم و پسورد را درست وارد می کردند می ساختیم.)
اگر برای این فرد سکشن adminID ای ساخته شده باشد که بیشتر از 0 باشد (چون با خروج یا ساین اوت یا لوگ اوت کاربر سکشن adminID اش را برابر False یا 0 یا 1- قرار می دهیم) و همچنین سکشن adminIP ای نیز ساخته شده باشد و این سکشن که برابر IP شخص در صفحه ورود قرار داده شده بود اکنون IP قبلی برابر IP کنونی اش باشد، وی معتبر می باشد ولی اگر هر کدام از این شرایط بر قرار نبود بایستی کاربر را به صفحه ورود بفرستیم و به او این پیغام را بدهیم که "شما بایستی از این صفحه وارد سایت شوید."
نکته: هر کاربر معتبری نیز اگر وارد سایت شود و 20 دقیقه هیچ فعالیت و درخواستی از سایت نکند و پس از آن دوباره بخواهد صفحه ای را فرا خوانی کند با این پیغام روربرو خواهد شد و درستش هم همین است.
نکته: اگر دلیل خاصی ندارید این 20 دقیقه را کم و زیاد نکنید. اگر خیلی کم کنید مثلاً 10 دقیقه و کاربر ها که صفحات متعددی از وب باز می کنند پس از 10 دقیقه مطالب را بخواند و دوباره فعالیت کند بایستی دوباره وارد شود که اعصابش به هم می ریزد و همچنین اگر این مقدار را زیاد کنید مثلاً 60 دقیقه، هم از لحاظ امنیتی امکان خطر هست و هم اگر کاربر فراوانی داشته باشید بار فراوانی به سرور وارد و منابعش محدود می شود. سایت های مهمی چون ایمیل یاهو هم گمانم همین حدود را رعایت می کنند.
نمونه کد بررسی اعتبار کاربر:
کد:
If Session("adminID")=False Or Session("adminID")<=0 Or Session("adminIP")=False Or Session("adminIP")<>Request.ServerVariables("REMOTE_ADDR") Then
Response.Redirect("login.asp?msg=nouserpass")
End If
نکته: اگر سکشنی ساخته نشده باشد مقدار آن False است و اگر شده باشد (از انواع غیر بولین) مقدارش True می شود.
3- بررسی سطح دسترسی کاربر.
حال که صفحه، کش و هیستوری نمی شود و مطمینیم کاربر وارد شده همان کاربری است که این یوزرنیم و پسورد را می دانسته (کاربر معتبر)، حال وقت آن است که بینیم آیا این کاربر مجوز دسترسی و مشاهده این صفحه را دارد یا نه؟
برای این کار بایستی از قبل برای قطعه کدی که این صفحه را قرار است نمایش دهد و همچنین هر قطعه کد مشابه یا هر صفحه مجزا، یک ID منحصر به فرد در نظر گیریم و در کدنویسی لحاظ کنیم.
چون روش یک در تعیین سطوح دسترسی را انتخاب کرده بودید حال بایستی فیلد سطوح دسترسی (fld_pageID) از رکورد کاربر جاری (ID این کاربر جاری در سکشن adminID او ذخیره است) از جدول کاربران را از دیتابیس بخوانیم. سپس ببینیم آیا ID این صفحه یا کدی که می خواهیم برای او نمایش دهیم در این فیلد ذکر شده است یا نه؟
اگر شده یعنی کاربر مجاز به دسترسی به این صفحه است و صفحه را نمایش می دهیم و اگر نه به او این پیام را نمایش می دهیم که: "شما به این صفحه دسترسی ندارید." (البته با لحنی مودبانه!)
نکته: معمولاً در این موارد بایستی منوی صفحات یا به قول شما گزارشگیری ها را مطابق صفحاتی که کاربر به آن دسترسی دارد برای او نمایش دهیم و اصلاً لینک صفحه یا کدی که او به آن دسترسی ندارد را نبایستی نمایش داد. اگر این کار را هم کردیم دلیلی ندارد که سطح دسترسی او را نسنجیم چون ممکن است کاربری وارد شود و آدرس صفحاتی که دسترسی ندارد را حدس بزند و آن ها را فراخوانی کند.
خروج از سایت
لازم است در صفحاتی که کاربران وارد شده اند لینکی برای خروج از بخش خصوصی یا Sign Out یا Log Out وجود داشته باشد که با خیال راحت در انتهای کارش بر آن کلیک کند و کامپیوتر را به دست فرد دیگری بدهد. اگر این قابلیت ایجاد نشده باشد. کاربر وارد شده، در بخش خصوصی می ماند تا 20 دقیقه بعد از آخرین فعالیتش که اگر رها کند و برود و دیگری کامپیوتر را در دست گیرد می تواند وارد بخش های خصوصی او شود. و البته ساخت این قابلیت (خروج از سایت) مزیت های دیگری نیز دارد.
برای این کار با کلیک بر روی کلمه خروج می توانید این خطوط کد زیر را اجرا کنید. با این کار سکشن هایش به اصطلاح خالی (False) می شوند و دیگر با او مانند فرد غریبه رفتار می شود. سپس به او این پیغام را نشان می دهید که: "شما با موفقیت از سایت خارج شده اید."
کد:
Session("adminID")=False
Session("adminIP")=False
Response.Redirect("login.asp?msg=exit")
امیدوارم کد ها را درست نوشته باشم. البته برای این کار راه های دیگری هم هست که این یکی از راه هاست که خودم نیز از آن بهره می برم.