نکات و اصول مهم در برنامه نویسی (1#)

Y.P.Y

Well-Known Member
نکات و اصول مهم در برنامه نویسی(1#)

نکات و اصول مهم در برنامه نویسی(1#):

1- هرگز فایل های ضمیمه شده رو با پسوند inc. ذخیره نکنید. یعنی name.class.inc رو به name.class.php تغییر بدید. و یا از .HTAccess یا HT برای تعیین سطح دسترسی inc. استفاده کنید.
با اینکار از دسترسی مستقیم و خواندن محتوای فایل توسط URL / Adress bar جلوگیری می کنید.

2- حتاًالمکان تگ های اضافی و فضا های خالی را حذف کنید و از باز و بسته کردن بیش از حد تگهای <?php ?> سرور خودداری کنید. (مخصوصاً در پروژه های سنگین)
اینکار به مقدار قابل توجهی در سرعت پردازش سورس PHP تون تاثیر میزاره.

3- کلاس را با متد __construct یا نام کلاس شروع کنید و با متد __destruct پایان دهید. و تمامی فیلد داخل کلاس رو درون متد __destrunt با دستور unset نابود کنید. اگر هم از ارث بری کلاس استفاده نمی کنید، کلاس و متد ها را با کلمه کلیدی final آغاز کنید.

4- برای Escape کردن کاراکترهای ویژه و جلوگیری از خیلی از حملات SQL میتونید از توابع addslashes یا mysql_real_escpe_string و... استفاده کنید.

5- اگر از Object cloning استفاده نمی کنید، در کلاس خود از متد پیش فرض __clone برای جلوگیری از تقلید(Clone)(شبیه سازی) کلاس استفاده کنید.

PHP:
class MyClass
{
    final public function __clone()
    {
        exit;
    }
}

6- هرگز از Cookie برای ذخیره کلمه رمز یا مقادیر نمایشی استفاده نکنید. (میدونید که قابل تغییر هستند)

7- در خط اول هر فایل PHP، بعد از خطا زدایی کامل سورس، دستور (error_reporting(0 را قرار بدید که تمامی خطا ها و هشدار ها ignore بشن تا از سو استفاده های احتمالی جلوگیری بشه. یا از
PHP:
ini_set('error_log', 'logs/error.log');
استفاده کنید.

8- حتاًامکان از پارامتر $_GET برای دریافت مقادیر(فرم/url) استفاده نکنید. پارامتر $_REQUEST یا $_POST رو جایگزینش کنید. Request شامل GET, POST, Cookie هستش. (مقادیر ورودی رو هم فیلتر کنید).
برای حذف $_COOKIE از $_REQUEST هم می تونید از عبارت زیر استفاده کنید:
PHP:
$_REQUEST = array_merge($_GET, $_POST);

10- در اول هر کلاس و توابع مشکوک به compability، حتماً بودن کلاس و تابع رو چک کنید:
PHP:
if(!extension_loaded('mysql')): exit('Extension MySQL not loaded.');
endif;
...
if(function_exists('mysql_real_escape_string')): mysql_real_escape_string(...);
else: mysql_escape_string(...);
endif;
...

11- هرگز از روش زیر برای آدرس دهی(Action) استفاده نکنید:
PHP:
<form name="frm_Test" action="<?= $_Server['PHP_Self'] ?>" method="post" target="_self">
...
</form>
چراکه قابل تغییر و دستکاری هستند. (برای حملات (XSS(Cross Side Scripting)
راه حل:
PHP:
$_PHPSelf = basename(__file__);
$_Server['PHP_Self'] = substr($_Server['PHP_Self'], 0, strpos($_Server['PHP_Self'], $_PHPSelf)) . $_PHPSelf;
یا داخل تابع htmlspecialchars قرارش بدید.
 
آخرین ویرایش:
سلام . ممنون . خیلی عالی بود . اگه توو مقاله های بعدی توضیحی هم واسه هر کدوم بدید خوب تر می شه .
14- و در آخر، بهتر و ایمن تره اگر تمامی تگ ها و بلاک ها رو کامل مشخص کنید و کامل ببندید:
حافظه هم دچار مشکل نمیشه.
مگه توو PHP هم EndIf بود ماا خبر نداشتیم ؟ :shock:
 
بوده ..
من چند مدت پیش تو یه اسکریپا دیدم و همین جوری تعجب کردم و تست کردم و دیدم درسته
یکی از قابلیت های تو php دستور شرطی هست که به شما امکان ایجاد یک شرط رو با عملگر میده ( مثل c )

PHP:
$ec = $myif?$true:$false ;
اگر شرط $myif به True ارزیابی شد متغیر $true در متغییر $ec قرار میگیره و اگه False شد متغییر $false
 

Y.P.Y

Well-Known Member
"مگه تو PHP هم EndIf بود ماا خبر نداشتیم ؟"
بله وجود داره.
 

ziXet

مدیر انجمن PHP/MYSQL
قسمت 14 به نظرم بیخود هست! همون بلاک ها کافی هستند به نظرم
 

ziXet

مدیر انجمن PHP/MYSQL
مثل اینکه شما چیزی به نام Overflow براتون آشنا نیست!

در زبانهای برنامه نویسی استاندارد(به غیر از VB و +A و شاید Delphi) وقتی شما دستوری رو می نویسید و اجرا می کنید، حافظه پایان اون دستور رو ; یا همون نقطه ویرگول می دونه و یکی از ریز دلایلی که باعث شد استاندارد معرفی بشن همینه.

عدم رعایتش باعث: کندی در پردازش، آسیب پذیری، سردرگمی در بررسی اولیه صحت دستورات، اشغال فضای حافظه(غیر قابل تخلیه)، بروز خطا(در نرم افزارهای سنگین) و از این قبیل هستش!

بد تر از این؟!
نه من منظورم ; نبود منظورم اون endif و.. بود!
; رو که من هیچ وقت جا نمی اندازم!
 
سلام . توو شماره 1 منظور از تگهای سرور چیه ؟
اگه امکان داره در مورد شماره 8 هم بیشتر توضیح بدید . ممنون
 

Y.P.Y

Well-Known Member
سلام. توو شماره 1 منظور از تگهای سرور چیه ؟
[LTR]<?php ?> <? ?> <?= ?>[/LTR]

اگه امکان داره در مورد شماره 8 هم بیشتر توضیح بدید. ممنون.
مقادیر متد GET_$، براحتی قابل Sniff و Steal هستند. همچنین ظرفیت این متد حداکثر 100 کاراکتر هستش و تمام پارامترهای URL رو هم نوار آدرس مرورگر در معرض دید میزاره.
ولی متد REQUEST_$، هیچ کدوم از این ضعف ها رو نداره و قدرت پیمایشش هم بیشتره.
اینم یه مثال ساده برای معتبر سازیش:
PHP:
$Int_Identity= (int)@preg_replace('/[^0-9]/i', '', $_REQUEST['Id']);
 

ziXet

مدیر انجمن PHP/MYSQL
[LTR]<?php ?> <? ?> <?= ?>[/LTR]


مقادیر متد GET_$، براحتی قابل Sniff و Steal هستند. همچنین ظرفیت این متد حداکثر 100 کاراکتر هستش و تمام پارامترهای URL رو هم نوار آدرس مرورگر در معرض دید میزاره.
ولی متد REQUEST_$، هیچ کدوم از این ضعف ها رو نداره و قدرت پیمایشش هم بیشتره.
اینم یه مثال ساده برای معتبر سازیش:
PHP:
$Int_Identity= (int)@preg_replace('/[^0-9]/i', '', $_REQUEST['Id']);
فکر کنم طول ماکزیمم برای GET 2048 بایت هست !
البته برای کاراکترهای مالتی بایت طول حروف کم میشه!

آقا این clone رو با یه مثال میتونی توضیح بدی؟
 

Y.P.Y

Well-Known Member
فکر کنم طول ماکزیمم برای GET 2048 بایت هست!
2048؟! :shock:
اشتباه می کنید، دقیقاً 100 بایت/کاراکتر هستش.
آقا این clone رو با یه مثال میتونی توضیح بدید؟
توضیح خاصی نمیخواد، یه تابع ساده و تعریف شدست. کلش همینه clone__.
PHP:
<? 
final class Tehran extends City 
{ 
final public function __clone() 
{ 
return(@exit('Cloning is not allowed.')); 
} 

final public function __construct() 
{ 
# ... 
} 

final public function __destruct() 
{ 
# ... 
} 
}; 
?>
 

ziXet

مدیر انجمن PHP/MYSQL
2048؟! :shock:
اشتباه می کنید، دقیقاً 100 بایت/کاراکتر هستش.

توضیح خاصی نمیخواد، یه تابع ساده و تعریف شدست. کلش همینه clone__.
PHP:
<? 
final class Tehran extends City 
{ 
final public function __clone() 
{ 
return(@exit('Cloning is not allowed.')); 
} 

final public function __construct() 
{ 
# ... 
} 

final public function __destruct() 
{ 
# ... 
} 
}; 
?>
نه مطمئنم از 100 کاراکتر بیشتر هست!
یجایی خوندم 2048 هست! میگردم پیدا میکنم.

ببین میخوام بدونم نحوه حمله از طریق clone کردن چجوریه؟
 

Y.P.Y

Well-Known Member
ببین میخوام بدونم نحوه حمله از طریق clone کردن چجوریه؟
عزیز اینجا تالار هکینگ نیست :snap:.
شما پیشگیری تونو انجام بدید، بقیشو ول کنید.

نه مطمئنم از 100 کاراکتر بیشتر هست!
یجایی خوندم 2048 هست! میگردم پیدا میکنم.

فکر کنم منظور شما طول کاراکتر در نوار آدرس هستش، درسته؟
خب این در هر مرورگر و سروری فرق میکنه. تقریباً طول کاراکتر در:
Internet Explorer= 2,048
Firefox= 100,000
Opera= 190,000
IIS= 16,384
Apache= 4,000
هستش.
 
آخرین ویرایش:

MDP

Well-Known Member
دوستان عزیز با کاربر Y.P.Y برای ادامه تاپیک همکاری کنید تا یه آموزش پر بار داشته باشیم.

از بحث و پست های بی جا خود داری کنید.

ممنون

:rose:
 

Cyletech

Member
من هم یک نکته ذکر کنم که تا حدالامکان بجای print() از echo() استفاده کنید. چون هم سریعتر عمل می کنه و هم کارش دقیق تر و واضح تر هست!
 

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

بالا