با تشکر فروان
ولی آموزش sql_injection کامل نبود و در حد توضیح گفته شده بود
منتظر آموزش امن کردن این فرم هستیم!
+ اینکه logut این فرم درست کار نمی کنه! اگه میشه یه تستی بکنید
با تشکر
نمایش نسخه قابل چاپ
با توجه به قولي كه به دوستان داده بودم بخش جديد برنامه رو دارم آماده و تكميل مي كنم ،فعلا فايلي شامل تغييرات زير رو اتچ مي كنم كه توضيحاتش رو فردا مينويسم.
- فيـلتر گذاري روي كليه ورودي هاي كاربر جهت جلوگيري از حملات 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
منتظر ادامه آموزش ها باشيد :53:
ممنون از آموزش های خوبتون ، اگر تونستید آموزش زیر رو هم قرار بدید ، من خیلی خیلی خیلی لارم دارم ، چند سری هم خدمتتون عرض کردم :)
من میخوام کاری کنم که وقتی مثلا کاربر : 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');
?>