با تشکر فروان
ولی آموزش 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');
?>
اگر session_start زده باشيد نبايد اين خطا رو بده
بهرحال :
کد PHP:
if(isset($_SESSION))
if(is_array($_SESSION))
array_walk($_SESSION,'autosafe');
خيلي جالب و اموزنده بود
به جاي 2 خط زير :
کد PHP:
if(is_array($_SESSION))
array_walk($_SESSION,'autosafe');
Rezash عزیز ، ممنون میرم تست کنم :)
راجع به امن کردن این اسکریپت کی توضیح میدی ؟؟؟
آقا ادامش چی شد ؟
سلام
پيوست جديد :
تغييرات :
- جلوگيري از ثبت نام هاي كاربري تكرار (فايل signup.php)
- ايجاد يك ليست از كرابران ثبت نام شده و صفحه بندي
* توضيحات صفحه بندي رو قبلا اينجا دادم :
http://www.webhostingtalk.ir/f148/19031/
اما بزودي كاملتر با توجه به مثال همين برنامه در همين تاپيك ميذارمش.
با تشکر از Rezash عزیز ، که این آموزش خوب و مفید کاربردی رو ایجاد کردند و ادامه میدند .
چند سوال :
رضا جان ، چه جوری میشه یه کاری کرد که فقط Admin سایت بتونه صفحه Users.php رو ببینه ؟؟؟؟ ( یعنی یوزرنیم و پسوورد بده و بتونه اون صفحه رو ببینه ؟ )
یعنی در کل دیتابیس یه کمی تخصصی تر بشه ، دو نوع اعضا باشه : 1. مدیر 2. کاربر . همچین چیزی میشه ؟
میشه کاری کرد از صفحه Users.php نام کاربران به صورت لینک باشه ؟؟؟ ( یعنی بشه کاربر رو ادیت کرد ، نام اون رو عوض کرد ، پسوورد عوض کرد و . . . )
راجع به امنیت کی صحبت می کنید .
با تشکر فراوان
---------- Post added at 06:49 PM ---------- Previous post was at 06:46 PM ----------
یه سوال خیلی خیلی خفن هم بپرسم : آیا میشه کاری کرد که آخرین تاریخ ورود کاربر رو روبه روی نام کاربریش بنویسه ؟ ( هم در صفحه User.php و هم در صفحه Login.php )
سلام
آقا قرار بود یه فایل برای ویرایش کاربران باشه؟ نیست
یعنی یه فایل باشه که بشه ویرایش روی اطلاعات باشه و ...
هدفم یادگیری آپدیت داده ها در sql هست
با تشکر
UPDATE : بروز كردنکد PHP:
$q = mysql_query("UPDATE `table_name` SET `field1`='value1',`field2` = 'test' WHERE `somefield`='sth' LIMIT 10");
table_name : نام جدول ما كه قصد آپديت داريم
field1 و field2 فيلدهايي كه قصد داريم آپديت كنيم رو با ويرگول از هم جدا مي كنيم.
WHERE : فيلدهاي منتخب از چه ركوردهايي بروز بشند ؟
اگر WHERE نذاريم تمام فيلدها ويرايش ميشند.
و ميتونيم با AND و OR مشخص كنيم مثلا ركوردي كه اسم طرف علي هست يا فاميلش تست است رو ويرايش كنيم.
LIMIT : محدود كردن اينكه حداثكر چند ركورد ويرايش بشه در اين مثال 10 رو فرض كردم مثلا ده ركوردي كه در اين شرايط صدق مي كنند بروز بشند.
برای این مثال جدول یوزرمون میشه با فایل مثال بزنید، چون از اول این بخش یوزر ها رو دنبال کردم، بهتر می شه متوجه شد
واقعا ممنوووووووون
خواهش مي كنم
در اين مثال اگر كاربر لوگين كرد باشه ميتونه با مراجعه به آدرس
script.php?name=ali
نام خودش رو بروز كنه
کد PHP:
<?php
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");
if(isset($_GET['name']))
die('please select new name ! ');
include('config.php');
$newname = $_GET['name'];
$username = $_SESSION['username'];
$query = "UPDATE `user` SET `name`='$newname' WHERE `user`='$username' LIMIT 1";
$mysql_q = mysql_query($query) or die(mysql_error());
if(mysql_num_rows($mysql_q) <= 0)
die('Unable to proccess');
echo "Profile Updated !";
?>
یکی درست کردم کار می کنه ولی وقتی where رو اضافه می کنم خطا میده، یعنی هیچ رکوری ویرایش نمی شه
ولی وقتی بدون where میزارم همه رکورد ها ویرایش میشه
ممنون میشم راهنمایی کنید
ممنونم دوست عزیز . بسیار مفید بود . باز هم ادامه بدین آموزشهایتون رو .
من این قسمت رو کاملا یاد گرفتم؛ حالا توی این اسکریپت مشکل امنیتی وجود نداره که؟؟؟؟؟ کاملا امنه من این روش رو توی اسکریپت هام به کار ببرم؟؟؟
سلام
روي مفاهيم پايه وقت گذاشتيم .
الان شروع به نوشتن متن مقاله بعدي كردم كه صرفا در مورد مسائل امنيتي در برنامه نويسي php هست كه فكر كنم تا دو روز ديگه بخش اولش تموم بشه + دو تيكه فيلم آموزشي در مورد امنيت
بعد از اينكه كمي در مورد امنيت بحث كرديم دوباره روي ساير امكانات اين آموزش مانور ميديم.
دوستاني كه در تاپيك تشكر و نظر دادند واقعا ممنونم ، ولي با اين شرايط مديريت و جدا سازي محتواي آموزشي كمي سخت و زمان بر شده ...
لطفا براي تشكر فقط از دكمه تشكر استفاده كنيد و پست نديد.
سپاس
اگر لطف کنید و با دیتابیس رو آموزش بدید یا یه پروژه عملی رو انجام بدید خیلی عالی میشه
اگر مثل تاپیک آموزش پی اچ پی بتونید کار کنید که واقعا عالیه
از زحماتتون ممنون
salam mishe yeki amadeh in cod ra bram befrese
سلام من یه login نوشتم برا سایتم و دیتابیس هم درست کردم ولی error میده
کد PHP:
<?phpsession_start();$name=$_POST['user'];$pass=$_POST['pass'];require('config/config.php');mysql_query("set names 'UTF8' ");if(empty($_POST['user']) && empty($_POST['pass'])){echo "<strong><h4><b>*** لطفا نــام کــاربــری و رمــز عـبـور خـود را وارد نــمــایــیــد *** </b><br/></h4></strong>";}else {mysql_select_db("login",$connect);$query = "SELECT * FROM `users` WHERE `username` = '".$name."' AND `password` = '".$pass."'";$result=mysql_query($query)or die(mysql_error());$num=mysql_num_rows($result);if($num > 0) { header ('location: user/user1.php'); }
else { echo " <strong><h4><b>*** نـــام کـــاربـــری یا رمــــز عــبــور اشــتــبــاه اســـت *** </b><br/></h4></strong>."; }
error این دو خط رو میده
$name=$_POST['user'];
$pass=$_POST['pass'];
من textfild هم گذاشتم و دیتابیسم هم درسته ولی نمی دونم چرا خطا میده
میشه کمکم کنید
:77:
---------- Post added at 02:30 PM ---------- Previous post was at 02:27 PM ----------
این کد آمارگیر هست از یه سایت گرفتم ولی متغییراش چیزی رو اضافه نمی کننکد PHP:
<?php $page =basename($_SERVER['PHP_SELF']); $timestampInSeconds = $_SERVER['REQUEST_TIME']; $mySqlDateTime= date("Y-m-d H:i:s", $timestampInSeconds); $sql = 'INSERT INTO count(`id`, `page`, `Date`, `IP`) VALUES (NULL, \''.$page.'\',\''.$mySqlDateTime.'\', \''.$_SERVER['REMOTE_ADDR'].'\');'; mysql_query($sql); $todayDate= date("Y-m-d", $timestampInSeconds); $yesterdayDate= date("Ymd", strtotime("-1 day")); $query='SELECT COUNT( * ) total FROM count'; $result = mysql_query($query); $row = mysql_fetch_array($result, MYSQL_NUM); $count = $row[0]+1135; $query='SELECT count(distinct IP) FROM count where date=\''.$yesterdayDate.'\''; $result = mysql_query($query); $row = mysql_fetch_array($result, MYSQL_NUM); $count_yest = $row[0]+34; $query='SELECT count(distinct IP) FROM count where Date=\''.$todayDate.'\''; $result = mysql_query($query); $row = mysql_fetch_array($result, MYSQL_NUM); $count_today = $row[0]+45;echo "<h5> بازدید امروز : $count_today نفر </h5>","<h5> بازدید دیروز : $count_yest نفر </h5>" ,"<h5> کل بازدیدها : $count نفر </h5>"; ?>
یک عدد ثابت همیشه نشون میده
میشه بگید مشکلش چیه ؟
ممنون
:77:
سلام من نام کاربری و رمز عبور صفحه 6 را دانلود کردم و اجرا
هنگام ورود اگه نام کاربری و یا رمز عبور وارد نکنم بدون خطا وارد میشه به صفحه خوش آمد گویی و حتی اگه یکیش هم خالی باشه باز وارد می شه کلا خطا نمی ده
رمز عبور پس برای چه کاری وارد می کنیم نمی دونم تازه امنیت که بماند
شاید من بد کپی می کنم آخه همه صفحات رو که تو یه پروژه می زارم اجرا می کنم پیغام می ده لوگین کنید چیزی هم قابل مشاهده نیست
به همین دلیل من از لینک به لاگین استفاده کردم اشتباهه؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟
لطفا جوابمو بدید؟؟؟؟؟؟؟؟
سلام
ابتدا از شما یک تشکر ویژه دارم برای این همه زحمتی که کشیدید و دانشتون رو بدون هی چشم داشتی در اختبار دیگران گذاشتید
منم مشکل این دوست مون رو دارم
فایل ها رو کپی کردم یک جا توی کانفیگ مشکل داشت که برطرف کردم
اما الان اگر رمز رو وارد نکنی وارد صفحه اینکس میشه و سشن رو هم میسازه
من به همون شرط ست شدن شرط خالی نبودن رو هم اضاله کردم درست شد ولی نمی دونم کارم درست بوده یا نه
ضمنا من یه سفارش دارم اگر فرصت داشتید اطلاع بدید تا باهاتون تماس بگیرم
سلام
ابتدا از شما یک تشکر ویژه دارم برای این همه زحمتی که کشیدید و دانشتون رو بدون هی چشم داشتی در اختبار دیگران گذاشتید
منم مشکل این دوست مون رو دارم
فایل ها رو کپی کردم یک جا توی کانفیگ مشکل داشت که برطرف کردم
اما الان اگر رمز رو وارد نکنی وارد صفحه اینکس میشه و سشن رو هم میسازه
من به همون شرط ست شدن شرط خالی نبودن رو هم اضاله کردم درست شد ولی نمی دونم کارم درست بوده یا نه
ضمنا من یه سفارش دارم اگر فرصت داشتید اطلاع بدید تا باهاتون تماس بگیرم
سلام
من پروژه این ترم سایت باید تحویل می دادم
من شرط خالی بودن رو امتحان کردم همون شرطی که در کد های عضویت وجود داره ولی هر جای کدم که می زارم
درست می شه یعنی خالی باشه دیگه خطا میده
ولی رمز عبور و نام کاربری و چک نمی کنه
اگه می شه کد لاگینتون رو برام بزارین
تورو خدا زودتر جواب بدین من باید فردا سایتم ایمیل کنم(:|
ممنون
سلام
مشکل login رو حل کردم. فایل پیوست رو دانلود کنید. :53:فایل پیوست 7319
سلام خیلی ممنون لطف کردین
یه درخواست کوچولوی دیگه هم دارم همه آموزش های تصویری خودتون رو کدهاش رو هم برای دانلود برای ما پیوست کنید
چون ما می تونیم کد درست رو از شما بگیریم و در برنامه امتحان کنیم و نیازی به تایپ دوباره کدها به صورت دستی نیست
وقت کمتری صرف می شه می تونیم مطالب بیشتری از سایت خوبتون یاد بگیریم
توضیح دادن شما به صورت کد و توضیح کد تصویری خیلی عالی تره
بازم ممنون