رفتن به مطلب

ساخت یک سیستم احراز هویت


پست های پیشنهاد شده

طرز کار سیستم احراز هویت

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

کدی که چک می‌کنه کاربر احراز هویت شده یا نه رو باید تو یک فایل ضمیمه (auth.inc) قرار بدید. در اینصورت براحتی می‌تونید با قرار دادن دستور زیر در بالای هر اسکریپتی، از صفحه وب خودتون در برابر کاربران نا آشنا محافظت کنید.

include "auth.inc"

شما می‌توانید با استفاده از یک متغیر، نام کاربری کاربر وارد شده رو ذخیره کنید. اگر این متغیر حاوی یک نام کاربری باشد، معلوم می‌شود که کاربر وارد شده است. خاج شدن کاربر هم بسادگی با حذف این متغیر انجام می‌شود. تا زمانی که هیچکس دیگری از حوزه میزبانی سایت شما استفاده نمی‌کند و نمی‌تواند نشستی ایجاد کند که باعث تداخل شود، سایت شما از امنیت کافی برخوردار خواهد بود. بنابراین فایل auth.inc می‌تواند واقعا به سادگی آنچه در زیر می‌بینید باشد:


session_start();
if (!isset ($_SESSION["auth_username"])) {
echo "شما بايد وارد شويد تا اين برگه را ببينيد." ;
exit;
}

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

ایجاد فرآیند login

فرم login نیازمند دو فیلد username و password و یک دکمه submit است. پس از آنکه این عناصر در فرم login گذاشته شده اند، خودتون می‌تونید استایل دلخواهتون رو به فرم بدین. فعلا با جدول بندی به فرم استایل میدیدم.

<form action="login.php" method="post">
<table border=0>
<tr>
<td>نام کاربری:</td>
<td><input type="text" size=10 name="username"></td>
</tr>
<tr>
<td>کلمه عبور:</td>
<td><input type="password" size=10 name="password"></td>
</tr>
</table>
<input type=submit value="ورود">
</form>

فیلد کلمه عبور

فیلد نوع password دقیقا مثل فیلد نوع text کار می‌کند، با این تفاوت که هنگام تایپ کردن کارکتر‌ها آنها را مخفی می‌کند. تنها محدودیتی که فیلد کلمه عبور دارد این است که نمی‌توان با خاصیت value برای آن مقدار پیش فرض تعیین کرد.

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


<?php
session_start();
$passwords = array("chris" => "letmein", "damon" => "thisisme", "shelley" => "mypassword", "vanessa" => "opensource");
if (!$_post["username"] or !$_post["password"]) {
echo "شما باید نام کاربری و کلمه ی عبور خود را وارد کنید." ;
exit ;
}
if ($_post ["password"]== $passwords[$post["username"]]){
echo "ورود با موفقیت"
$_session["auth_username"] = $_post["username"];<br />
}
else {
echo "ورود ناموفق";
}
?>

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

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

  • امتیاز 12
لینک به ارسال

البته این روش به راحتی قابل دور زدن است .

بله! این مطلب فقط برای آموزش هست.

  • امتیاز 1
لینک به ارسال
  • 10 ماه بعد...

البته این روش به راحتی قابل دور زدن است .

چرا؟ چه مشکلی داره؟ چه کنیم که نشه دور زد؟

منم از همین راه برای احراز هویت استفاده می کنم:


public function isAdmin()
{
$myDb = new dbModel;
session_start();
$userAgent = $myDb->hashsalt($_SESSION['userAgent']);
$userIp = $myDb->hashsalt($_SESSION['userIp']);
if (!isset($_SESSION['username']) and empty($_SESSION['username']) || $userIp != $_SERVER['REMOTE_ADDR'] || $userAgent != $_SERVER['HTTP_USER_AGENT'])
{
session_destroy();
header("Location: index.php?op=user");
exit();
}

الان برای افزایش امنیت همین کد چیکار کنم؟

لینک به ارسال

الان برای افزایش امنیت همین کد چیکار کنم؟

مثلا یه مورد اینکه سشن رو در پایگاه یا فایل ذخیره کنیم .

  • امتیاز 1
لینک به ارسال

مثلا یه مورد اینکه سشن رو در پایگاه یا فایل ذخیره کنیم .

اون که آره!

ولی من سرور مجازی گرفتم که این مشکلو نداشته باشم!

لینک به ارسال

استفاده از session در کل توصیه نمیشه

یک روش اینه که هنگام لاگین کد تولید شده تصادفی را برای شناسایی کاربر استفاده کنید

و کد را در رکورد کاربر در دیتابیس ذخیره کنید + فیلدی برای حداکثر زمان لاگین

  • امتیاز 3
لینک به ارسال

استفاده از session در کل توصیه نمیشه

یک روش اینه که هنگام لاگین کد تولید شده تصادفی را برای شناسایی کاربر استفاده کنید

و کد را در رکورد کاربر در دیتابیس ذخیره کنید + فیلدی برای حداکثر زمان لاگین

ممنون!

این کارم کردم، این راه حل برای جلوگیری از حمله XSRF هست دیگه؟ نه؟!!

و کارای دیگه: بعد از لوگین session_id، ریجنریت میشه، کلیدهای سشن به صورت کد شده ذخیره میشن، اصلا نام کاربری در سشن نیست فقط id کاربر هست. هر بار هم آی پی و user agent کاربر چک میشه. و همونطور که گفتم سرور هم مجازی هست. اینا کفایت می کنه یا بازم باید کار دیگه ای بکنم؟!! اگر هست راهنمایی کنید لطفا.

ویرایش شده توسط Anisi
لینک به ارسال
  • 7 سال بعد...

لطفا برای ارسال دیدگاه وارد شوید

شما بعد از اینکه وارد حساب کاربری خود شدید می توانید دیدگاهی ارسال کنید



ورود به حساب کاربری
×
×
  • اضافه کردن...