با توجه به قولي كه به دوستان داده بودم بخش جديد برنامه رو دارم آماده و تكميل مي كنم ،فعلا فايلي شامل تغييرات زير رو اتچ مي كنم كه توضيحاتش رو فردا مينويسم.
- فيـلتر گذاري روي كليه ورودي هاي كاربر جهت جلوگيري از حملات SQL INJECTION و ...
- اعتبار سنجي سشن ها باتوجه به آي پي و مشخصات مرورگر كاربر
- ارسال ايميل به مدير در هنگام عضوي جديد
مباحثي كه در آينده دنبال خواهيم كرد : (البته همه مباحث مربوطه به سيستم لوگين /عضويت نيست اما در كنار هم بودن اين عناصر ميتونه جذابيت خاصي به برنامه بده )
- جلوگيري از ارسال مكرر فرم توسط ربات ها با كد امنيتي
- ارسال sms يا yahoo pm در هنگام عضويت به كاربر
- ارسال كد فعال سازي عضويت به ايميل يا sms يا yahoo مسنجر كاربر
- شناسايي خود كار كشور كاربر و تغيير خودكار زبان براي كاربر
- قابليت شارژ آنلاين اعتبار كاربر از طريق درگاه زرين پال
- قابليت ويرايش پروفايل
- اختصاص يك دفترچه يادداشت شخصي به هر كاربر
- استفاده از قالب هاي html بدون دخالت php
- استفاده آموزشي از ajax
- و مباحثي كه طرفدار داشته باشند.
در مورد SQL INJECTION :
در آخرين فايلي كه براي دانلود گذاشتم :
فايل config.php رو ببينيد :
تابع safe:کد PHP:
function safe( $value ){
$value = trim( $value );
$value = mysql_real_escape_string( $value );
$value = htmlspecialchars($value);
$value = strip_tags($value);
$value = str_replace(array("<",">","'","ی","&","ۜ"),array("<",">","'","ي","&","ي"),$value);
return $value;
}
function autosafe(&$value,$key){
$value = safe($value);
return $value;
}
array_walk($_POST,'autosafe');
array_walk($_GET,'autosafe');
array_walk($_COOKIE,'autosafe');
array_walk($_SESSION,'autosafe');
ابتدا مقدار ورودي رو trim مي كنيم يعني فضاهاي خالي اول و آخرش رو حذف مي كنيم
mysql_real_escape_string : يك تابع فوق العاده سودمند براي حذف كاراكتر هاي ناخواسته و آماده سازي رشته ورودي براي استفاده در يك كوئري به صورت سالم . مثلا كاراكترهاي \x00, \n, \r, \, ', " and \x1a فيلتر ميشوند.
PHP: mysql_real_escape_string - Manual
htmlspecialchars
تبديل كاراكترهاي html :
مثال :PHP: htmlspecialchars - Manual
* '&' (ampersand) becomes '&'
* '"' (double quote) becomes '"' when ENT_NOQUOTES is not set.
* ''' (single quote) becomes ''' only when ENT_QUOTES is set.
* '<' (less than) becomes '<'
* '>' (greater than) becomes '>'
strip_tags :
حذف تگ ها ، مثلا تگ اسكريپت و ...
PHP: strip_tags - Manual
تابع autosafe :
تابعي دست نويس براي اجراي خودكار تابع safe روي متغير هاي ورودي . اگر از نحوه كاركرد اين تابع و تابع بعدي يعني array_walk اطلاع نداريد توصيه ميكنم "آرايه ها در php" رو كه قبلا در همين انجمن نوشتم مطالعه كنيد.
-
جلوگيري و مقابله با جعل سشن :
يك راه كاملا ساده !کد PHP:
$client = md5($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'].$_SERVER['SERVER_NAME']);
$_SESSION['client'] = $client;
در كد بالا من تركيبي از آي پي كاربر ، مشخصات مرورگر كاربر و آدرس سايت رو در يك رشته تركيب و md5 كردم و داخل يك سشن ريختم
حالا در صفحات لوگين بايد چك كنم :
با اينكار حتي اگه سشن يك يوزر جعل و د.زديده بشه باز هم هويتش جعل نميشه.کد PHP:
$client = md5($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'].$_SERVER['SERVER_NAME']);
if($client != $_SESSION['client'])
die("Dear User ! Your Login session expired,please re login");
سعي كردم خلاصه بگم و بيشتر توابع رو php.ini ارجاع مي دم به دو دليل : 1. شلوغ نشدن غير ضروري تاپيك 2. درك سايت فوق العاده مفيد php.net
منتظر ادامه آموزش ها باشيد
ممنون از آموزش های خوبتون ، اگر تونستید آموزش زیر رو هم قرار بدید ، من خیلی خیلی خیلی لارم دارم ، چند سری هم خدمتتون عرض کردم
من میخوام کاری کنم که وقتی مثلا کاربر : user1 یوزنیم و پسوورد خودش رو وارد کرد به صورت اتوماتیک به صفحه ای که من از قبل تایین می کنم بره
مثلا کاربر use1 صفحه html1 و ببینه
مثلا کاربر use2 صفحه html5 و ببینه
مثلا کاربر use21 صفحه html8 و ببینه
خواهش مي كنم
در حال ساده :
در صفحه profile.php تغيير دادم
کد PHP:
<?php
//session start function : بايد قبل از هر خروجي اي و فقط يك بار در كد فراخواني شود.
session_start();
if(!isset($_SESSION['username']) OR !isset($_SESSION['client']))
die('Please Login/register');
$client = md5($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'].$_SERVER['SERVER_NAME']);
if($client != $_SESSION['client'])
die("Dear User ! Your Login session expired,please re login");
echo "<h1> Your personal Profile </h1>";
echo "welcome, ".$_SESSION['username'];
$username = $_SESSION['username'];
$query = "SELECT * FROM `user` WHERE `user`='$username' LIMIT 1";
$mysql_q = mysql_query($query) or die(mysql_error());
if(mysql_num_rows($mysql_q) <= 0)
die('Invalid login session!');
if($username == 'user1')
{
HEADER("LOCATION : test1.html");die();
}
if($username == 'user2')
{
HEADER("LOCATION : test2.html");die();
}
?>
من اون فایل پیوست member-area.zip رو دانلود کردم ، موقعی که کاربر ثبت نام میکنه ، و فایل میخواد با فایل signup.php ارتباط برقرار کنه ارور زیر رو میده :
Parse error: parse error, expecting `')'' in C:\Program Files\EasyPHP 3.0\www\sc\config.php on line 7
مشکل از چیه ؟
این هم ساختار فایل :
کد PHP:
<?php
$config = array(
'AdminEmail'=>'Yourmail@you.com',
'SendMailonreg'=>true,
'MailRegSubject'=>'New Member',
'MailRegBody'=>'New Member Registered !',
'headers' => 'From: Yourmail@you.com' . "\r\n" .'Reply-To: Yourmail@you.com' . "\r\n" .'X-Mailer: PHP/' . phpversion();
);
//db connection
$server = 'localhost';
$username = 'root';
$password = 'mysql';
$database = 'mysql';
$Connection = mysql_connect( $server , $username , $password ) or die(mysql_error());
mysql_select_db( $database , $Connection ) or die(mysql_error());
//data filtering
function safe( $value ){
$value = trim( $value );
$value = mysql_real_escape_string( $value );
$value = htmlspecialchars($value);
$value = strip_tags($value);
$value = str_replace(array("<",">","'","ی","&","ۜ"),array("<",">","'","ي","&","ي"),$value);
return $value;
}
function autosafe(&$value,$key){
$value = safe($value);
return $value;
}
array_walk($_POST,'autosafe');
array_walk($_GET,'autosafe');
array_walk($_COOKIE,'autosafe');
array_walk($_SESSION,'autosafe');
?>
سمي كالن بعد از تابع phpversion() اضافه هستش واسه همين ارور parse ميده
من احتمال دادم مشکل بخاطره کد زیر باشه :
جسارت کردم و اون کد رو حذف کردم ، بعد از حذف کد ثبت نام انجام میگیره اما باز هم با این پیغام :کد PHP:
$config = array(
'AdminEmail'=>'Yourmail@you.com',
'SendMailonreg'=>true,
'MailRegSubject'=>'New Member',
'MailRegBody'=>'New Member Registered !',
'headers' => 'From: Yourmail@you.com' . "\r\n" .'Reply-To: Yourmail@you.com' . "\r\n" .'X-Mailer: PHP/' . phpversion();
);
Warning: array_walk() [function.array-walk]: The argument should be an array in C:\Program Files\EasyPHP 3.0\www\sc\config.php on line 26
Registeration was successfull! now login!
Notice: Undefined variable: info in C:\Program Files\EasyPHP 3.0\www\sc\signup.php on line 15
---------- Post added at 01:00 PM ---------- Previous post was at 12:58 PM ----------
ممنون ، اون رو هم حذف کردم اما باز این ارور رو داد :
Notice: Use of undefined constant phpversion - assumed 'phpversion' in C:\Program Files\EasyPHP 3.0\www\sc\config.php on line 8
Warning: array_walk() [function.array-walk]: The argument should be an array in C:\Program Files\EasyPHP 3.0\www\sc\config.php on line 32
Registeration was successfull! now login!
Notice: Undefined variable: info in C:\Program Files\EasyPHP 3.0\www\sc\signup.php on line 15
اينو تست كنيد :
کد PHP:
<?php
$config = array(
'AdminEmail'=>'Yourmail@you.com',
'SendMailonreg'=>true,
'MailRegSubject'=>'New Member',
'MailRegBody'=>'New Member Registered !',
'headers' => 'From: Yourmail@you.com' . "\r\n" .'Reply-To: Yourmail@you.com' . "\r\n" .'X-Mailer: PHP/' . @phpversion(),
);
//db connection
$server = 'localhost';
$username = 'root';
$password = 'mysql';
$database = 'mysql';
$Connection = mysql_connect( $server , $username , $password ) or die(mysql_error());
mysql_select_db( $database , $Connection ) or die(mysql_error());
//data filtering
function safe( $value ){
$value = trim( $value );
$value = mysql_real_escape_string( $value );
$value = htmlspecialchars($value);
$value = strip_tags($value);
$value = str_replace(array("<",">","'","ي","&","?"),array("<",">","'","ي","&","ي"),$value);
return $value;
}
function autosafe(&$value,$key){
$value = safe($value);
return $value;
}
if(is_array($_POST))
array_walk($_POST,'autosafe');
if(is_array($_GET))
array_walk($_GET,'autosafe');
if(is_array($_COOKIE))
array_walk($_COOKIE,'autosafe');
if(is_array($_SESSION))
array_walk($_SESSION,'autosafe');
?>
در حال حاضر 1 کاربر در حال مشاهده این موضوع است. (0 کاربران و 1 مهمان ها)