امنیت در فرم ورود (session و cookie)

سلام دوستان,
یکی از مسائل مهم در php تامین امنیت اونه مخصوصا در صفحاتی که دارای مجوز سطح دسترسی می باشد! امروز به مسئله Login و امنیت اون می پردازیم!
شما توی یه فرم ورود نام کاربریو کلمه عبورو چک می کنید و اگه درست بود به اون Session میدید, کاری به مرحله چک کردن نداریم و فرض می کنیم که کلمه عبور درست بوده و حالا باید به یه کاربر تایید شده Session بدیم!
PHP:
<?php
……
if(true){
$time=time();
$hash1=md5($time);

 $ip=$_SERVER["REMOTE_ADDR"] ;
$hash2=md5($hash1.$ip);
 setcookie(‘secret’,$hash1, time()+3600);
 $_SESSION['user'] = $userid;
$_SESSION['secret'] = $hash2;
 header(‘Location: admin.php’);
}
خوب تو مرحله اول با استفاده از تابع time یه مقداری (زمان فعلی) رومیسازیم و اونو تبدیل به هش md5 می کنیم!اسمش هم گذاشتیم hash1 که مقدارش تا آخر و زمان خروج کاربر ثابت می مونه,!
با استفاده از $ip=$_SERVER["REMOTE_ADDR"] ; یه متغیر تعریف می کنیم که حاوی IP کاربر هست! و حالا دومین هش خودمونو درست می کنیم به اسم hash2 که شامل هش مقدار قبلی(hash1) و IP کاربره!
با استفاده از setcookie(‘secret’,$hash1, time()+3600); یک کوکی در مرورگر کاربر می سازیم و مقدار hash1 را در نام کاربری secretذخیره میکنیم !
$_SESSION['user'] = $userid; یک سشن دلخواه برای شناسایی کاربر است, معمولا نام کاربری یا آی دی کاربر در این سشن تعریف می شود .
و اما $_SESSION['secret'] = $hash2; مقدار hash2 را در یک session به نام secret قرار دادیم, و در مرحله آخرهم انتقال به صفحه مدیر, حالا باید تو صفحه مدیریت ورودی هامونو چک کنیم:

admin.php

PHP:
……..

 if(!isset($_SESSION['secret']))
{
header(“location: logout.php”);
exit();
}else{
$hash1=$_COOKIE["secret"];
$ip=$_SERVER["REMOTE_ADDR"] ;
$hash2=$_SESSION['secret'];

 $hash2Check=md5($hash1.$ip);
 if($hash2Check != $hash2)
{
header(“location: logout.php”);
exit();
}
 ……
خوب تو مرحله اول چک می کنیم اصلا session داریم یا نه! ممکنه یکی همینطوری آدرس صفحه رو وارد کرده باشه , if(!isset($_SESSION['secret']))
اگه شرط برقرار نبود یعنی session secret وجود نداشت کاربر با احترام به صفحه دیگه منتقل میشه
icon_biggrin.gif

ولی اگه session وجود داشت پس حتما یکی Login کرده ,من خودم قبلنا تا همین جا اکتفا می کردم و کاربر به صورت کامل وارد میشد(البته تو صفحه قبلش هم IP و .. نمیگرفتم) ملاک من فقط وجود session بود و حتی مقدارش هم مهم نبود,البته session ها تا حدودی امن هم هستند چون روی هاست ساخته می شوند و مثل کوکی بر روی سیستم کاربر نیستند که قابل تغییر باشند!
اما اگه یکی به هاست شما دسترسی داشته باشه چی؟ تو هاست های اشتراکی که سطح امنیت پایین تره معمولا این روش زیاد امن نبود پس به ادامه دادن مرحله چک کردن می پردازیم!
حالا اگه Session وجود داشت فایل کوکی هم فراخوانی می کنیم و مقدارو میگیریم:
PHP:
    $hash1=$_COOKIE["secret"];
حالا hash1برابر مقدار کوکی هست,
خوب طبق کد های بالا تو صفحه قبل hash2 ما برابر بود با hash1+IP , پس دوباره از کاربر ip میگیریم و با hash1 دوباره هش می کنیم و تو یه متغیر به اسم hash2Check ثبت می کنیم :
PHP:
$ip=$_SERVER["REMOTE_ADDR"] ;
$hash2Check=md5($hash1.$ip);
خوب اگه اطلاعات ما درست باشه وکسی قصد زرنگ بازی در آوردن نداشته باشه که فکر کنه به راحتی می تونه با یه جعل ساده کوکی یا Session وارد بشه , متغیر hash2Check باید برابر باشه با hash2 !
تو این شرایط هکر اگه به هاست شما هم دسترسی داشته باشه باز به کوکی دسترسی نداره و یا بلعکس ! حتی اگه یه درصد هم احتمال بدیم هم سشن و هم کوکی رو داره با IP می خواد چی کار کنه!؟ IP شما توی اطلاعات هش کد شده واگه IP شما نباشه هیچ وقت hash2Check برابر با hash2 نمیشه! خلاصه کوچکترین تغییر یعنی عدم برابری این دو تا پس در آخر این دوتا رو چک می کنیم!
PHP:
if($hash2Check != $hash2)
و اگر برابر نبود دوباره کاربر با احترام به صفحه خروج هدایت می کنیم ,
با تشکر



منبع: امنیت در فرم ورود (session و cookie) | PHP تیــــــک
 

جدیدترین ارسال ها

بالا