برنامه نويسي امن

sarallah

Member
آقا بيايم اينجا در مورد روشهاي برنامه نويسي امن در php صحبت كنيم
چيزهايي كه بايد تو برنامه هامون رعايت كنيم كه هك نشيم ٬ هركي هر چي بلده بگه
استارت رو بزنيد اومدم !
 

qmars

Member
اگه تحت لينوكس كار مي كني يه مرجع خوب وجود داره تو گوگل اينو بزن
Linux Secure Programming
 

123456

Member
این هکرها از رو برو نیستن.

والا همانطور که سیستمهای امنیتی روز به روز پیشرفت می کند , به همان اندازه هم علم هک و هک کردن پیشرفت می کند و نوشتن کد امن با پی اچ پی مشکلی حل نمی کند چون اگر هکر واقعا بخواهد سایتی را هک کند می تواند با هک کردن بانک اطلاعاتی از راههای مختلف کارش را بکند.
به طور مثال من از فارسی نوکه استفاده می کنم و همیشه سایتم را به روز می کنم ولی با وجود این دوبار بانک اطلاعاتیم داشت هک می شد اما چون سیستم سرور قوی بود , سریع قفل کرد و چند روز بعد با درخواست کتبی باز شد.
البته بحث راجب این مسیله می تواند مفید باشد اما فکر نکنم بتواند همه مشکل را حل کند.
 

sarallah

Member
-آقا چرا حاشيه ميريد ٬ گفتم يه تاپيك باز كنم كه هم ديگران استفاده كنند هم ما يه چيز ياد بگيريم

اميد جان مرسي لطفا بحث SQL Injection ها رو ادامه بديد
منم يه نمونه ديگرو ميگم

روش: سو استفاده از register_globals
سطح: مبتدي
زبان: PHP
بانک اطلاعاتی: ---
حد خطر: متوسط
قسمت:1

يك نوع ناامني در php زماني پيش مياد كه register_globals روي سرور فعال باشه در اين صورت شما ميتونيد بدون تعريف يك متغيير ازش استفاده كنين مثلا در اسكريپت زير اگر كاربري كه لاگين ميكنه مدير باشه بهش اجازه ديدن صفحه secret.php داده ميشه

كد صفحه لاگين :

کد:
<form method="get" action="login.php" >
<input type="text" name="user">
<input type="password" name="pass" >
<input type="submit" name="login" value="login">
</form>
درخواست اين فرم به اين شكل ارسال ميشه :
کد:
http://yoursite.com/login.php?user=admin&pass=123456
در اين صورت خروجي برنامه زير يك ميشه و مدير ميتونه به صفحه secret.php بره
کد:
<?php
if($user=="admin"){
   if($pass=="123456") $login=1;
}

if($login==1){
include("secret.php");
}
?>

خوب حالا يه هكر ميتونه از حفره اي كه تو اين اسكريپت وجود داره استفاده كنه
و در خواستي به شكل زير رو در مرورگرش تايپ كنه :
کد:
http://yoursite.com/login.php?login=1
به همين راحتي ميتونه به اطلاعات صفحه secret.php دسترسي پيدا كنه
اما راه حلش :
1- اگه امكانش براتون هست register_globals رو غير فعال كنيد و از آرايه هاي انجمني استفاده كنيد مثل $_GET
2-به تمام متغير ها مقدار پيش فرض بدهيد مثلا كد بالا را بايد به صورت زير مينوشتيد:

کد:
<?php
$login=0;
if($user=="admin"){
   if($pass=="password") $login=1;
}

if($login==1){
include("secret.php");
}
?>
منتظر نكته هاي آموزنده شما هستيم :arrow:
 

oxygenws

Active Member
روش: SQL Injection
سطح: متوسط
زبان: PHP
بانک اطلاعاتی: MySQL
حد خطر: زیاد
قسمت: 2


تزریق سیکویل به مجبور کردن یک صفحه به اجرای کد های نا مربوط و خطرناک سیکویل گفته می شه. روش کار رو با یک مثال بهتون می گم.

فرض کنید من چنین صفحه ای با PHP دارم:
کد:
<?php
// input data: $username, $password

include('db_connection.php');
$sql='select * from USERS where username="'.$username.'" and password="'.$password.'"';
$result = mysql_query($sql);
if($result){
echo 'you are Administrator';
}
else{
echo 'Wrong Username or Password';
}

همونطور که در برنامهء بالا مشاهده می کنید، این برنامه به صورت ورودی دو مقدار $username و $password رو میگیره. اگر فرض کنیم $username برابر admin باشه و $password برابر 123456 متغیر $sql برابر مقدار زیر خواهد شد:
(خوب دقت کنید)
کد:
select * from USERS where username="admin" and password="123456"

حالا فرض کنید هکر محترم ما بیاد به جای رمز عبور از مقدار زیر استفاده کنی:
کد:
$password = " OR ""="

خوب، حالا ببینیم مقدار متغیر $sql برابر چی خواهد بود:
کد:
select * from USERS where username="admin" and password="" OR ""=""

اگر کمی SQL بدونید، می فهمید که کد بالا در هر حالتی نتیجه "درست" رو بر خواهد گردوند و طرف در هر صورت وارد سیستم خواهد شد.

برای جلوگیری از این عمل برای پایگاه داده MySQL توابع پیش ساخته ای وجود دارد که عبارتند از:
کد:
mysql_real_escape_string();
mysql_escape_string();

برای اطلاعات بیشتر در مورد این دو تابع به manual سایت رسمی php در آدرس www.php.net/manual مراجعه کنید.

(سوالات در این مورد رو لطفا با 5 خط اول این پیام شروع کنید و بنویسید)

موفق باشید، امید
 

omidak

Active Member
سلام:
راهي كه PHPBB در نظر گرفته برایه مقابله با SQL Injection اینه که میاد هرچی ' هست به : /'
تبدیل میکن
یعنی:
کد:
'Select * From Users Where Username ="' . str_replace("\\'", "''", $username) . '"...'
این کار جلویه هر Injection ای رو میگیره.
اما بهترین راه استفاده از Parameter ها هست که دیگه دیگه هیچ دسترسی وجود نداره. :wink:
 

sarallah

Member

روش: سو استفاده از ورودي كاربر
سطح: مبتدي
زبان: PHP
بانک اطلاعاتی: ---
حد خطر: کم
قسمت:3


اين نا امني زماني پيش مياد كه ما ميخواييم يه ورودي براي كاربر در نظر بگيريم مثلا وبلاگهايي كه نظر كاربران رو بطور مستقيم نشون ميده
در اين حالت اگه هيچ بررسي اي روي ورودي كاربر انجام نشه هكر محترم ما ميتونه هر كد html و جاوايي رو كه دلش خواست به برنامه ما وارد كنه
براي مثال كد زير :
کد:
<form method="post" action="nazar.php" > 
<input type="text" name="name"> 
 <textarea name="nazarat" cols="60" rows="8"></textarea>
<input type="submit" name="login" value="ersal"> 
</form>

اين فرم هر چي كه كاربر وارد كنه به اسكريپت زير ميفرسته

کد:
<?php  
if ($name and $nazarat){
echo "$name neveshte :<br>$nazarat";
}else{
echo"lotfan esme va nazare khod ra benvisid";
}
 ?>
اين اسكريپت هم هر چي كه كاربر وارد كرده باشه نمايش ميده حتي كدهاي html و جاوا
براي حل اين مشكل بايد از توابع php كه براي جلوگيري از اين كار هستش استفاده كنيد توابعي مثل :
کد:
htmlspecialchars()
اگه ورودي شما فقط شامل اعداد ميشه مي تونيد با تابع زير صحتش رو چك كنيد
کد:
intval()
در نتيجه اسكريپت بالا رو اگه بشكل زير مينوشتيم مشكل حل مي شد
کد:
<?php  
if ($name and $nazarat){
$name=htmlspecialchars($name);
$nazarat=htmlspecialchars($nazarat);
echo "$name neveshte :<br>$nazarat";
}else{
echo"lotfan esme va nazare khod ra benvisid";
}
?>
با اين كار ديگه هكر محترم نميتونه هيچ كد html ي وارد كنه ..

موفق باشيد
ثارا...
 

miloo

Member
خيلي عاليه
منم برام خيلي جذاب بودو فهميدم كه معني باگ در برنامه نويسي چيه .
از sarallah خان گل و گلاب تشكر ميكنم و همينطور از oxygenws خان.
 

oxygenws

Active Member
من مورد خیلی خاص دیگه ای به ذهنم نمی رسه، اگر موردی هست بگید تا توضیح بدیم :)

در ضمن، sarallah جان، بد نبود می گفتید، خوب یکی کد html وارد کنه چی میشه!!! خوشحال می شم کمی کامل تر کنید، من سعی کردم فکر کنم که چیزی نمی دونم و مطلبتون رو خوندم... دیدم اصلا نکتهء بدی توش نبود!!! :)

ممنون، امید
 

omidak

Active Member
سلام:
خوب من هم يه نكته هايي بگم:
يك از Session ها برایه انتقال اطلاعات خیلی مهم استفاده نکنید.
از Cookie هایه با Key ها کوتاه استفاده نکنید. و همچنین اطلاعات اونها رو محدود کنید.و Expire اون ها رو طولانی مدت نذارید.

برایه ذخیره پسورد ها در Database از MD5 یا SHA استفاده کنید

در مورد SQL Injection هم که کلی بحث شد و در مورد PHP هم که sarallah خان و آقا امید گل زحمت اشو کشیدن.

یه سری نکته هم بریه .Net کارها من بگم:
برایه استفاده از Database همیشه بخش Connect به Data و برنامه رو جدا کنید.
از SQL String یا همون Text Execute استفاده نکنید و کار برنامه نویسی تحت SQL رو به دست خود Database بدید و از StoredProcedure و Parameter برایه ارسال اطلاعات استفاده کنید.

برایه خواندن از رویه Data از Data Command و DataReader استفاده کنید.
برایه ذخیره باز از DataCommand و ExecuteNonQuery استفاده کنید
برایه دریافت تک داده از ExecuteScalar استفاده کنید
برایه ارسال اطلاعات در 3مورد از Parameter ها استفاده کنید.

دیگه راه نفوزی در .Net وجود نداره. :wink:
 

oxygenws

Active Member
omidak گفت:
سلام:
راهي كه PHPBB در نظر گرفته برایه مقابله با SQL Injection اینه که میاد هرچی ' هست به : /'
تبدیل میکن
یعنی:
کد:
'Select * From Users Where Username ="' . str_replace("\\'", "''", $username) . '"...'
این کار جلویه هر Injection ای رو میگیره.
اما بهترین راه استفاده از Parameter ها هست که دیگه دیگه هیچ دسترسی وجود نداره. :wink:

امیدک جان، این کار جلوی هر تزریقی رو نمی گیره....
اون کاری که phpbb کرده به شرطی جلوی تزریق رو می گیره که کسی که کد می زنه بفهمه که چطوری داره کد می زنه!!! منظورم اینه که اون دستور به شرطی درست کار می کنه که طرف تمامی توابع mysql_query اش رو با ' درست کرده باشه!! در حالی که خود من بسته به نیازم و مکان خاص توی کد هام یا ممکنه از ' استفاده کنم یا " :)
مهم اینه که اون توابعی که من گفتم، جلوی تمامی تزریق های سیکویل رو می گیره، مهم نیست طرف نویسنده اش کی باشه :)

موفق باشید، امید
 

oxygenws

Active Member
:) خوب درسته، ولی بهتره به جای ایجاد چندین دستور از همون دستور مخصوصش استفاده کنیم :) در ضمن، شاید موارد دیگه ای هم باشه که من ندونم :)
 

omidak

Active Member
آره بهترينش همونه كه اونروز كشتيم همدگه رو :lol: :wink:

راستي اجازه است اين تاپيك اش رو عوض كنيم و بزاريم برنامه نويسيه امن. چون فقط PHP نیست. من .Net هم گفتم :wink:
 

sarallah

Member
من چرا اين قسمت رو نديدم :wink:

oxygenws گفت:
در ضمن، sarallah جان، بد نبود می گفتید، خوب یکی کد html وارد کنه چی میشه!!! خوشحال می شم کمی کامل تر کنید، من سعی کردم فکر کنم که چیزی نمی دونم و مطلبتون رو خوندم... دیدم اصلا نکتهء بدی توش نبود!!! :)

ممنون، امید
خوب
فرض كنيد شما يه وبلاگ با php نوشتيد و نظر كاربران هم به صورت مستقيم زير نوشته هاي شما نمايش داده ميشه ٬ خوب حالا اگه هيچ نظارتي روي ورودي كابر نباشه كاربر ميتونه لينكهاي ناخواسته ٬ عكسها ناخواسته و كد هاي جاوايي كه بازديدكننده ها رو اذيت كنه ٬ وارد برنامه كنه و در اين صورت اين برنامه ديگه امن نيست

(من جاوا بلد نيستم ولي فكر كنم كاراي خيلي بيشتري هم ميشه كرد )

راستي اجازه است اين تاپيك اش رو عوض كنيم و بزاريم برنامه نويسيه امن. چون فقط PHP نیست. من .Net هم گفتم
واسه من كه فرقي نميكنه دلت خواست عوض كن
 

oxygenws

Active Member
sarallah گفت:
من چرا اين قسمت رو نديدم :wink:

oxygenws گفت:
در ضمن، sarallah جان، بد نبود می گفتید، خوب یکی کد html وارد کنه چی میشه!!! خوشحال می شم کمی کامل تر کنید، من سعی کردم فکر کنم که چیزی نمی دونم و مطلبتون رو خوندم... دیدم اصلا نکتهء بدی توش نبود!!! :)

ممنون، امید
خوب
فرض كنيد شما يه وبلاگ با php نوشتيد و نظر كاربران هم به صورت مستقيم زير نوشته هاي شما نمايش داده ميشه ٬ خوب حالا اگه هيچ نظارتي روي ورودي كابر نباشه كاربر ميتونه لينكهاي ناخواسته ٬ عكسها ناخواسته و كد هاي جاوايي كه بازديدكننده ها رو اذيت كنه ٬ وارد برنامه كنه و در اين صورت اين برنامه ديگه امن نيست

(من جاوا بلد نيستم ولي فكر كنم كاراي خيلي بيشتري هم ميشه كرد )
اینو ندیده بودی، چون من بعدا اضافه کردم :) بیشتر دوست داشتم مقاله ات رو کامل کنی :)

sarallah گفت:
راستي اجازه است اين تاپيك اش رو عوض كنيم و بزاريم برنامه نويسيه امن. چون فقط PHP نیست. من .Net هم گفتم
واسه من كه فرقي نميكنه دلت خواست عوض كن
من به این دلیل که یه مطلب ساخت یافته و درست و حسابی در مورد .net ننوشتی با این قضیه مخالفم :) یه .net کار نسبتا مبتدی بیار اینجا ببین چیزی می فهمه از اشکال، خطا و توضیحی که --اینجا-- نوشتی :)

موفق باشید، امید
 

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

بالا