PDA

View Full Version : عدم اجرای سیشن !



reza303
سه شنبه 13 اسفند 1392, 17:33 عصر
سلام
داخل فرم لوگین میخوام وقتی کاربر لوگین کرد به همراه سیشن مجاز بودن ورودش سیشن نام خانوادگیش هم ارسال بشه به صفحه و در صفحه پنل نمایش داده بشه .
از روش pdo استفاده کردم :

$sql="SELECT COUNT(*) FROM `test` WHERE `username`= ? and `password`= ? and `email`= ? ";
$result = $connect->prepare($sql);
$result->bindValue('1',$_POST['username']);
$result->bindValue('2',$_POST['password']);
$result->bindValue('3',$_POST['email']);
$result->execute();
$num=$result->fetchColumn();
if($num==1)
{
$_SESSION['name'] = $num['username'];
$_SESSION['adminlogin'] = true;
$security->Redirect("index");

و اومدم با کد زیر داخل صفحه کاربری فراخانیش کردم :
<?php echo $_SESSION["name"]; ?>

ولی به من 1 رو نشون میده !
نمی دونم مشکل از کجاس لطفا راهنمایی کنید .

***BiDaK***
سه شنبه 13 اسفند 1392, 18:00 عصر
داخل sql شما COUNT گذاشتید اون رو بردارید و * بذارید و با rowCount() تعداد رو چک کنید در pdo.
برای همین 1 بر میگردونه.

reza303
سه شنبه 13 اسفند 1392, 18:19 عصر
داخل sql شما COUNT گذاشتید اون رو بردارید و * بذارید و با rowCount() تعداد رو چک کنید در pdo.
برای همین 1 بر میگردونه.

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

reza303
سه شنبه 13 اسفند 1392, 18:26 عصر
این طور گذاشتم :

$sql="SELECT * FROM `test` WHERE `username`= ? and `password`= ? and `email`= ? ";
$result = $connect->prepare($sql);
$result->bindValue('1',$_POST['username']);
$result->bindValue('2',$_POST['password']);
$result->bindValue('3',$_POST['email']);
$result->execute();
$num=$result->rowCount();
if($num==1)
{
$_SESSION['name'] = $num['tell'];

reza303
سه شنبه 13 اسفند 1392, 18:34 عصر
مشکل لاگین حل شد ولی الان هیچی چاپ نمی شه داخل صفحه پنل کاربری

***BiDaK***
سه شنبه 13 اسفند 1392, 18:58 عصر
$sql="SELECT * FROM `test` WHERE `username`= ? and `password`= ? and `email` = ?";


$result = $connect->prepare($sql);
$result->bindValue('1',$_POST['username']);
$result->bindValue('2',$_POST['password']);
$result->bindValue('3',$_POST['email']);
$result->execute();


if ($result->rowCount() == 1)
{
$user = $result->fetchColumn(1);
$_SESSION['username'] = $user;
$_SESSION['adminlogin'] = true;
}


////////////////////////////////////


if ($_SESSION['adminlogin'])
echo $_SESSION['username'];

شما چون از fetchColumn استفاده کردید باید ستون رو مشخص کنید.پیش فرض (0) ستون اول هست.

reza303
سه شنبه 13 اسفند 1392, 19:41 عصر
مشکل تقریبا حل شد . ( تونست یوزنیم رو چاک کنه )
اما یه مشکل جدید .
ما مثلا می گیم تلفن رو چاپ کنه ولی چاپ نمی کنه و r رو نشون میده .
از این دستور استفاده کردم :
صفحه لوگین :

if ($result->rowCount() == 1)

{

$user = $result->fetchColumn(1);

$_SESSION['nameadmin'] = $user['email'];
$_SESSION['adminlogin'] = true;

و صفحه پنل :

<?php echo $_SESSION['nameadmin']; ?>

***BiDaK***
سه شنبه 13 اسفند 1392, 20:13 عصر
در fetchColumn شما ستون رو که مشخص کردی مثلا ستون آیدی (0) و ستون نام (1) دیگه نام فیلد رو ننویسین:

$email = $result->fetchColumn(3); // email
$_SESSION['email'] = $email;

reza303
سه شنبه 13 اسفند 1392, 20:24 عصر
در fetchColumn شما ستون رو که مشخص کردی مثلا ستون آیدی (0) و ستون نام (1) دیگه نام فیلد رو ننویسین:

$email = $result->fetchColumn(3); // email
$_SESSION['email'] = $email;


واقعا عالی بود .
موقع لوگین مشکل امنیتی ایجاد نمیشه وقتی ما داریم از rowCount استفاده می کنیم ؟ یا مثلا موقع اینسرت COUNT رو برداشتیم ؟
کلا فرم لوگین به این شکلی با pdo امن هست ؟

***BiDaK***
سه شنبه 13 اسفند 1392, 21:06 عصر
یک سری نکات به ذهنم میرسه:
پسورد رو بصورت هش باید توو دیتابیس نگه داری و اینجا هم هش کنی و مقایسه بشه با مقدار دیتابیس.
error_reporting(0) میتونید بذارید تا اروری نشون نده.(در صورت وجود)
میتونید از کپچا هم استفاده کنید.
میتونید تعداد مجاز ورودی اشتباه تعیین کنید.
اگر ایمیل هم از کاربر میگیرید با preg_match چک بشه فرمتش.
میتونید در دستور sql آخرش LIMIT 1
متد prepare هم خودش رشته هارو escape میکنه با bindValue.
و ...
این سایت (http://daskhat.ir/46/security-tips-php-first) مطالب خوبی گذاشته که 3 قسمته.

reza303
سه شنبه 13 اسفند 1392, 21:29 عصر
یک سری نکات به ذهنم میرسه:
پسورد رو بصورت هش باید توو دیتابیس نگه داری و اینجا هم هش کنی و مقایسه بشه با مقدار دیتابیس.
error_reporting(0) میتونید بذارید تا اروری نشون نده.(در صورت وجود)
میتونید از کپچا هم استفاده کنید.
میتونید تعداد مجاز ورودی اشتباه تعیین کنید.
اگر ایمیل هم از کاربر میگیرید با preg_match چک بشه فرمتش.
میتونید در دستور sql آخرش LIMIT 1
متد prepare هم خودش رشته هارو escape میکنه با bindValue.
و ...
این سایت (http://daskhat.ir/46/security-tips-php-first) مطالب خوبی گذاشته که 3 قسمته.

متد پری پر نمی تونه با bindParam هم رشته ها رو esxape کنه ؟
دستور sq که فرموندین لیمیت 1 یعنی روی چی لیمیت بشه ؟

ایمیل رو چک کردم . همین طور تصویر امنیتی گذاشتم براش .
میشه یه مقاله بدین که اگر طرف چندین بار اشتباه وارد کرد صفحه لوگین برا مثلا یه ساعت براش قطع بشه .

***BiDaK***
سه شنبه 13 اسفند 1392, 22:23 عصر
بله.تفاوتش با bindValue تو اینه که اگر متغیرها بعد bindParam نوشته شده بود خطا نمیگیره و وقتی execute میشه مقادیرو جاگذاری میکنه.


$result->bindParam('1', $username);
$username = $_POST['username'];
$result->execute();

آخر دستوری که در prepare گذاشتید میتونید LIMIT 1 بذارید که در صورت وجود داشتن یک رکورد برگردونه.
میتونید یک جدول داشته باشید و یوزری که اشتباه وارد میکنه در اون جدول آیپی کاربر و زمان و تعداد اشتباه رو بگیره و چک کنید .....
این عبارتو جستجو کنید : php limiting the number of failed login attempts