PDA

View Full Version : سوال: مشکل در ساخت صفحه لاگین



flat_00
چهارشنبه 10 بهمن 1397, 21:21 عصر
کد زیر یه لاگین ساده هست ولی نمیدونم چرا هر کاری میکنم SESSION رو نگه نمیداره. منظورم اینه که اگه کسی لاگین کنه وارد میشه ولی اگه دوباره بخواد وارد همون آدرس بشه دوباره میره رو صفحه لاگین و باید یوزر نیم و پسورد وارد کنه. لطفا راهنمایی کنید و بگید ایراد از کجاست.



<?php
$con=mysqli_connect('localhost','root','','mydb');


session_start();
if(isset($_GET['location'])) {
$_SESSION = [];
}


$query="select * from login where uname='".$_POST['username']."' and pass='".$_POST['password']."'";
$result=mysqli_query($con,$query);







if($_SERVER['REQUEST_METHOD'] == 'POST') {
if(mysqli_fetch_assoc($result))
$_SESSION['is_login']=$_POST['username'] = true;
} else {
header('Location: form.php');
}
?>


<a href="?location=logout">خروج</a>

ali_sed
پنج شنبه 11 بهمن 1397, 12:58 عصر
کد زیر یه لاگین ساده هست ولی نمیدونم چرا هر کاری میکنم SESSION رو نگه نمیداره. منظورم اینه که اگه کسی لاگین کنه وارد میشه ولی اگه دوباره بخواد وارد همون آدرس بشه دوباره میره رو صفحه لاگین و باید یوزر نیم و پسورد وارد کنه. لطفا راهنمایی کنید و بگید ایراد از کجاست.


بدون دیدن کدهای فایلی که کاربر را به صفحه لاگین ریدایرکت می کند نمیتوان پاسخ کامل داد. اما بطور کلی:
اول از همه اینکه مطمئن شوید که در تمامی صفحات session_start(); در ابتدای فایل درج شده باشد.
در فایل فرم ورود چک کنید اگر کاربر قبلا لاگین کرده است به صفحه دیگری ریدایرکت شود. (کاربر وارد شده نباید به صفحه ورود دسترسی داشته باشد)
در بقیه صفحات نیز چک کنید اگر کاربر لاگین نکرده است به صفحه لاگین ریدایرکت شود. (کاربر مهمان نباید به صفحاتی غیر از صفحه ورود دسترسی داشته باشد)

اما چند نکته در مورد کد نویسی و کلا بخش اعتبار سنجی که باید حتما رعایت شود.
۱. رمز را بصورت هش شده در دیتابیس ذخیره کنید.حتما از یک فیلد دوم با عنوان salt که حاوی مقداری رندوم است برای هش کردن رمز استفاده کنید. https://en.wikipedia.org/wiki/Salt_(cryptography)
۲. تنها فیلد نام کاربری (که حتما باید بصورت یونیک در دیتابیس تعریف شده باشد) را در کوئری select جستجو کنید و رمز کاربر را با کدهای پی اچ پی بررسی کنید.
۳. تمامی مقادیری که در کوئری خود می آورید (در اینجا نام کاربری و رمز) باید ابتدا در تابع mysqli_escape_string قرار گیرند تا مانع از حملات sql injection شود. (می توانید از دستور mysqli_prepare نیز استفاده کنید) (به هیچ عنوان از دستور addslashes برای این کار استفاده نکنید)
۴. جهت جلوگیری از حملات brute force حتما در فرم ورود از کپچا استفاده کنید.
۵. جهت جلوگیری از حملات csrf حتما فرم ورود باید حاوی فیلد مخفی token باشد. به طور کلی هر جایی که کاربر درخواست ایجاد، ویرایش یا حذف داده ها را به سمت سرور ارسال می کند باید از توکن استفاده کنید. توکن را میتوانید در سشن ذخیره کنید ضرورتی ندارد برای هر صفحه مقدار توکن را تغییر دهید کافیست تنها بعد از لاگین کاربر مقدار توکن را تنها یک بار تغییر دهید.
https://stackoverflow.com/questions/5207160/what-is-a-csrf-token-what-is-its-importance-and-how-does-it-work
۶. جهت جلوگیری از حملات xss لازم است تا تمامی داده‌های دریافتی از سمت کاربر که در سایت نمایش می یابند (مثل نام و نام خانوادگی کاربر)، توسط دستوراتی مانند strip_tags، htmlspecialchars و ... فیلتر شوند.

کدها تست نشده اند!


//when creating user or changing password save these two field into users table
$data['salt'] = sha1(uniqid('mb'));
$data['pass'] = md5($pass . $data['salt']);



//check $_POST['token']
//check captcha code

//authenticate user
if(empty($_POST['username']) || empty($_POST['password'])){
$errors[] = 'نام کاربری و رمز عبور خود را وارد نمایید';
}else{
$query='select * from login where uname="'.mysqli_escape_string($_POST['username']).'" limit 1';
$result=mysqli_query($con,$query);
$user = mysqli_fetch_assoc($result)

if($user && $user['pass']==md5($_POST['password'].$user['salt'])){
//user has been authenticated successfuly
//redirect user to dashboard
}else{
$errors[] = 'نام کاربری یا رمز عبور اشتباه است';
}
}