Vahid

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

8 پست در این موضوع قرار دارد

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

سیستم احراز هویت از دو قسمت تشکیل شده که در این آموزش قصد داریم هر دو آنها رو بسازیم. برای شروع به یک پردازشگر 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

به اشتراک گذاری این پست


لینک به پست

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

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

1

به اشتراک گذاری این پست


لینک به پست

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

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

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


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();
}

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

0

به اشتراک گذاری این پست


لینک به پست

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

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

1

به اشتراک گذاری این پست


لینک به پست

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

اون که آره!

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

0

به اشتراک گذاری این پست


لینک به پست

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

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

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

3

به اشتراک گذاری این پست


لینک به پست

ارسال شده در (ویرایش شده)

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

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

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

ممنون!

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

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

ویرایش شده در توسط Anisi
0

به اشتراک گذاری این پست


لینک به پست

برای ارسال نظر یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید نظر ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در انجمن ما ثبت نام کنید. عضویت خیلی ساده است !


ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید


ورود به حساب کاربری

  • مطالب مشابه

    • توسط noorian
      سلام دوستان
      من درحال طراحی یک افزونه هستم ، و افزونه با فایل استایل با پسوند css سازگار نیست (style.css) پس مجبور شدم فایل استایل رو با پسوند php ایجاد کرده و در فایل اصلی افزونه فراخوانی کنم (include style.php)
       
      اما وقتی افزونه رو نصب میکنم ارور زیر رو میده :
      این افزونه 2405 حرف از خروجی غیرمنتظره در طول فعال‌سازی تولید کرد. اگر پیام اخطار “headers already sent” ، مشکلات مربوط به خوراک‌های پیوند یا مسائل دیگر را دریافت کردید، این افزونه را غیرفعال یا حذف کنید.
      چطوری این مشکل رو رفع کنم؟

    • توسط Hamid_92
      با سلام خسته نباشید من قبلا به یک برنامه نویس طراحی وبسایت رو سپردم و ایشونم من رو راهنمایی کرد که پوسه و هاست و دامنه رو خودم بخرم بهش بدم نصب کنه حالا مشکلی پیش اومده در پوسته فارسی دیجی رادو من و نتونستم حلش کنم میخواستم ببینم چرا سورس کد رو روی سایت در قسمت مقالات سایتم نشون داده میشه!!!
       
      تصویر پوسته ی دارای خطا
      هر دو لینک یکی است!
      qqqqq_Copy.bmp
    • توسط jistili1
      سلام دوستان.
      ببینید من یک فرم دارم که فقط دو input داره.یک اینپوت متن و یک اینپوت سابمیت.توی اینپوت متن ، کاربر کد imdb یک فیلم رو میده.بعد فرم من با ajax ارسال میشه.فرض بگیریم مقادیر برای صفحه check.php ارسال بشه.حالا من توی صفحه check.php همچین کدی رو دارم:
      <?php if(isset($_POST["btn"])) { echo file_get_contents("http://mydiba.club/".$_POST["link"]."/"); ?> <script src="jquery-3.4.1.js"></script> <script> $(document).ready(function(){ $(".-dl .Block_dl").each(function(){ var href=$(this).find(".dublboxa:first-of-type").attr("href"); $.ajax({ url:"check2.php", method:"POST", data:"link="+href }); }); }); </script> <?php } ?> اگه به کد دقت کنید ، وقتی کاربر کد imdb یک فیلم رو وارد کرد ، در صفحه check کل محتویات اون فیلم که در یکی از سایت های دانلود فیلم هست echo میشه.بعد در این قسمت یک ajax دیگه هم داریم که خودش توی یک صفحه check هست.کار این قطعه کد ajax که در جی کوئری نوشته شده اینه که تمامی لینک های دانلود اون فیلم رو از سایت دانلود فیلم بگیره و ببره به یک صفحه check دیگر که در اینجا اسمش check2.php هست.خودتون میتونید کد رو ببینید.حالا اینکه توی صفحه check2.php چی هست دیگه مهم نیست.خلاصشو بگم : من اینکارو کردم ولی همونطور که فکرشو میکردم انجام نشد.شما چه راه حلی برای این کار دارید؟در واقع الان با دو تا ajax تو در تو روبرو هستیم.
      یک قسمت از کد من اشکال داره یا در کل غیر استاندارد نوشتم؟اگه میشه یه راه حل بگید که اینکار رو بتونم انجام بدم.دقت کنید که اون قسمت از کد جی کوئری که از متد each استفاده کردم ، برای اینه که به ازای هر لینکی که در صفحه اون فیلم در سایت دانلود وجود دارد ، یک بار این ajax که خودش توی صفحه check یک ajax دیگست رو انجام بده.
      خیلییی خیلییی ممنون میشم اگه کمکم کنید.
      ضمنا از curl هم نمیخوام استفاده کنم
    • توسط mortaza
      لازم دارم کل کلمات به متن رو استخراج کنم و بعد بررسی کنم که ایا این کلمات توی دیتابیس من موجود هستن یا ن و الی آخر
      اما توی مرحله استخراج لغات گیر کردم (لغات انگلیسی هستن) خب من اول اومدم کد زیر رو امتحان کردم
      preg_match_all("~([\w]+)~", $text,$words); خیلی خوب کار کرد تا مشکلی که داشت این بود که لغاتی مثل can’t را دو لغت حساب میکرد (به این صورت: لغت اول: can لغت دوم: t) 
      من اومدم کد رو شکل زیر تغییر دادم:
      preg_match_all("~([\w\’]+)~", $text,$words); اما مشکلی که داشت بعضی کلمات که بلافاصله بعدشون نقطه یا کاما بود رو اشتباه نشون میداد مثلا به جای minds یکی از عضو های array 
      minds� هست چندین تا لغت دیگه هم به همین شکل یه کاراکتر � اضافی به تهشون اضافه شده
      چه کار کنیم که این مشکل پیش نیاد؟ اصلا دلیل اتفاق افتادن این پدیده چیه؟
       
      نمونه ای از متن مد نظرم:
      Procrastination comes in many disguises. We might resolve to tackle a task, but find endless reasons to defer it. We might prioritize things we can readily tick off our to-do list—answering emails, say—while leaving the big, complex stuff untouched for another day. We can look and feel busy, while artfully avoiding the tasks that really matter. And when we look at those rolling, long-untouched items at the bottom of our to-do list, we can’t help but feel a little disappointed in ourselves.
      The problem is our brains are programmed to procrastinate. In general, we all tend to struggle with tasks that promise future upside in return for efforts we take now. That’s because it’s easier for our brains to process concrete rather than abstract things, and the immediate hassle is very tangible compared with those unknowable, uncertain future benefits. So the short-term effort easily dominates the long-term upside in our minds—an example of something that behavioral scientists call present bias.
      How can you become less myopic about your elusive tasks? It’s all about rebalancing the cost-benefit analysis: make the benefits of action feel bigger, and the costs of action feel smaller. The reward for doing a pestering task needs to feel larger than the immediate pain of tackling it.
      To make the benefits of action feel bigger and more real:
      Visualize how great it will be to get it done. Researchers have discovered that people are more likely to save for their future retirement if they’re shown digitally aged photographs of themselves. Why? Because it makes their future self feel more real—making the future benefits of saving also feel more weighty. When we apply a lo-fi version of this technique to any task we’ve been avoiding, by taking a moment to paint ourselves a vivid mental picture of the benefits of getting it done, it can sometimes be just enough to get us unstuck. So if there’s a call you’re avoiding or an email you’re putting off, give your brain a helping hand by imagining the virtuous sense of satisfaction you’ll have once it’s done—and perhaps also the look of relief on someone’s face as they get from you what they needed.
      Pre-commit, publicly. Telling people that we’re going to get something done can powerfully amplify the appeal of actually taking action, because our brain’s reward system is so highly responsive to our social standing. Research has found that it matters greatly to us whether we’re respected by others—even by strangers. Most of us don’t want to look foolish or lazy to other people. So by daring to say “I’ll send you the report by the end of the day” we add social benefits to following through on our promise—which can be just enough to nudge us to bite the bullet.
       
       
    • توسط estedadrap
      سلام
      من میخوام از زمینه دلخواه استفاده کنم تو یه قسمت از کد php اما هرکاری میکنم اررور ; یا , میده
       
      echo do_shortcode(' <div class="buttondl"> <a href="#buy_album" class="popup_link button medium buy_album">Download</a> <div id="buy_album" class="popup"><div class="def-block widget"> اینجا زمینه دلخواه نمایش داده بشه بصورت لینک </div></div></div> '); <a href="<?php $dl = get_post_meta($post->ID, 'dl', true); ?>"></a> میخوام زمینه دلخواه بالا رو داخل کد php قرار بدم