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

Y.P.Y

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

نکات و اصول مهم در برنامه نویسی(3#):
اگر این مقاله براتون مفید و موثر واقع شد، مقالات قبلیم در رابطه با همین موضوع رو می تونید در "نکات و اصول مهم در برنامه نویسی(1#)" و "نکات و اصول مهم در برنامه نویسی(2#)" دنبال کنید.

1- حملات DOS/DDOS
ساده ترین و عامیانه ترین عواملی که باعث میشن: پهنای باند پایین، پیکربندی نامناسب سرور وب و استفاده از نرم افزار های سنگین(نیوک ها، تالار/انجمن ها...) برای کارهای سبک و غیر استاندارد در فضاهای کوچیک هستش.
راه حل ها(در مورد همه زبانهای تحت وب صدق میکنه): پهنای باند حداقل 500 مگابایت، محدود کردن حجم هر بسته(HTTP post) نسبت به پهنای باند، محدود کردن حجم هر درخواست(Body request) نسبت به پهنای باند، محدود کردن حجم Upload فایل نسبت به پهنای باند، استفاده از فشرده سازی محتوا(Output)/Cache، محدود کردن زمان Excute نرم افزار(مثلاً 60 ثانیه)، بهینه سازی/استاندارد سازی محتوای Client-side، انتقال ندادن خطاهای HTTP به صفحات اصلی(در غیر این صورت یک Referer خطرناک هم خواهید داشت)، استفاده از فرمت های مناسب(JPG, JPEG, JPE...) تصاویر، Handing کردن Repetition/Duplication ها، محدود کردن ترافیک خارجی با استفاده از IP range و...
محدود کردن ترافیک با استفاده از IP range: در وبسایتهای داخلی، طبیعتاً نیازی به ترافیک کشورهای خارجی نیست(اعم از Spam/Bad bots/Visitor...)، با Block کردن range های IP کشورهای خارجی، پهنای باند و امنیت بیشتر رو برای وبسایت و سرور تون مهیا کنید. مثل روسیه، کشورهای عربی، افغانستان، ترکیه و...

2- پروتکل WAP
25% برنامه نویسان با این پروتکل آشنایی ندارند، 50% آشنایی دارند ولی اهمیتی نمیدن، 25% آشنا هستن و اهمیت میدن... این پروتکل همون قدر مفید و قدرتمند هستش/همون قدر هم خطرناک.
فقط چند پیشنهاد: یا کلاً اجازه ورود رو بهش ندید(ارزشش رو داره) یا تماماً Header رو پاکسازی کنید، یا فقط دسترسی Browse بهش بدید.

3- برای جلوگیری از ورود کاراکترهای مخرب UTF/Unicode به جداول Latin، از Option زیر برای ساختن جدول استفاده کنید(در مورد همه Database ها صدق میکنه): [LTR]default charset= 'utf8' collate= 'utf8_general_ci';[/LTR]

4- از قرار دادن فضا های خالی بی مورد و Comment های بیجا و نامناسب خودداری کنید. اینها تقریباً 10% از حجم کل نرم افزارتون رو اشغال می کنند(Web programming می کنید نه Desktop programming).

5- حتالمکان توابع رو در کلاس بصورت static تعریف کنید، چراکه سرعت پردازش/Compile رو بسیار بسیار افزایش میده. همچنین بدون ساخت شی قابل دسترسی هست(مخصوصاً توابع طولانی و سنگین).

6- به هیچ وجه از دستور print در برنامه های تحت وب استفاده نکنید(هزاران بار گفته شده). دلیلتون برای استفاده چیه؟!

7- در هنگام نصب جداول از بودن یا نبودن جدول مطلع بشید تا هنگام نصب/پیکربندی با خطا مواجه نشین. راه ساده: [LTR]drop table if exists `xxxxx`;
create table if not exists `xxxxx`;[/LTR]

8- برای Database تون Password تعیین کنید. اغلب Database ها بصورت پیش فرض Password هایی برای مدیر دارند، که خرابکار با بدست آوردن Username براحتی وارد Database خواهد شد و...

9- تنضیمات پیشنهادی برای PHP:
asp_tags رو Off قرار بدید.
implicit_flush رو On قرار بدید.
expose_php رو Off قرار بدید.
max_execution_time رو 30 قرار بدید.
max_input_time رو 30 قرار بدید.
default_socket_timeout رو 30 قرار بدید.
register_globals رو Off قرار بدید(هزاران بار گفته شده).
session.auto_start رو 0 قرار بدید.
default_mimetype رو text/html قرار بدید(سرعت بیشتر).
display_errors رو 1 قرار بدید.
بهتره log_errors رو On قرار بدید.
بهتره DATABASE.allow_persistent رو Off قرار بدید.
بهتره DATABASE.max_persistent رو 1 قرار بدید.
حتاامکان DATABASE.default_user و DATABASE.default_password رو خالی بزارید.
حتاامکان session.hash_function رو 1 قرار بدید(SHA1).
session.hash_bits_per_character رو 5 قرار بدید.
mbstring.func_overload رو 0 قرار بدید(http://bugs.php.net/bug.php?id=30766).
توابع apache_child_terminate, apache_getenv, apache_reset_timeout, apache_setenv, unregister_tick_function, rpc, exec, system, passthru, shell_exec, proc_open, pcntl_exec رو در disable_functions قرار بدید.
در حالت معمولی دلیلی ندارید که safe_mode رو On قرار بدید.
و...

10- یک فایل htaccess (برای وب سرور های آپاچی و امثلالش) یا ht(برای nginx و امثالش) درست کنید(برای نرم افزارتون) و تنظیمات(اختیاری) زیر رو درونش قرار بدید(در حالت عادی):
کد:
<Limit PUT DELETE>
	Order Allow,Deny
	Deny from all
</Limit>

<LimitExcept POST GET HEAD OPTIONS>
	Order Allow,Deny
	Deny From All
</LimitExcept>

ServerSignature Off

#LimitRequestBody 1024

#LimitXMLRequestBody 1024

AddType application/x-httpd-php .php .php3 .php4 .php5 .php6 .html .xml .phphtml .phpxml .ph .px .shtml
AddType application/x-httpd-php-source .ps
AddType text/x-component .htc

AddHandler application/x-httpd-php .php .php3 .php4 .php5 .php6 .html .xml .phphtml .phpxml .ph .px .shtml

<IfModule dir_module>
	DirectoryIndex index.php index.php3 index.php4 index.php5 index.php6 index.html index.xml index.phphtml index.phpxml index.ph index.px index.shtml
</IfModule>

Options +Indexes -Includes +ExecCGI -MultiViews
#Options None

#DefaultLanguage en

AddCharset UTF-8 .utf8

#AddDefaultCharset utf-8

Header Unset ETag

Header set X-UA-Compatible "IE=EmulateIE7"
Header set X-UA-Compatible "IE=EmulateIE8"

# Anti-ClickJacking(Ms Internet Explorer 8)
Header append X-FRAME-OPTIONS "DENY"

#SetEnvIfNoCase Referer "^http://www.doman/" locally_linked= 1
#SetEnvIfNoCase Referer "^http://www.domain$" locally_linked= 1
#SetEnvIfNoCase Referer "^http://domain/" locally_linked= 1
#SetEnvIfNoCase Referer "^http://domain$" locally_linked= 1
#SetEnvIfNoCase Referer "^$" locally_linked= 1

#<FilesMatch "\.(gif|png|jpe?g)$">
	#Order Allow,Deny
	#Allow from env=locally_linked
#</FilesMatch>

FileETag none

# Apache 2.x.x
#SSLOptions +StdEnvVars +ExportCertData

<IfModule mod_security.c>
	SecFilterEngine Off
</IfModule>

<IfModule security2_module>
	SecRuleEngine Off
</IfModule>

#RedirectMatch 403 /(tmp/cache|/logs|\.svn)(/|$)

<Files ~ "\.(pkg-info|manifest|.ht)$>
	Order Allow,Deny
	Allow from localhost
	Allow from 127.0.0.1
	Deny From All
</Files>

<FilesMatch "\.(htaccess|session|htpasswd|passwd)$">
	Order Allow,Deny
	Allow from localhost
	Allow from 127.0.0.1
	Deny from all
</FilesMatch>
<IfModule mod_deflate>
	AddOutputFilterByType DEFLATE application/x-javascript text/css text/html
</IfModule>
(این فایل رو در پوشه(Folder) اصلی نرم افزار قرار بدید.)

11- محتویات تمام فایلهای Index.html یا Index.php یا Index.* در پوشه های خالی رو پاک کنید و فایل رو خالی از هر چیزی کنید...
حداقل اگر 10 پوشه داشته باشید در هر 5 پوشه دیگر و... و در هر فایل Index حداقل 50 کیلوبایت اطلاعات، ببینید چه حجم زیادی از نرم افزار رو میگیرن! که این حتی پهنای باندتون رو هم مصرف میکنه.(Web programming میکنید نه Desktop programming)

12- پیشنهاد: اگر نرم افزارتون قابلیت Multi language/چند زبانه رو داره، هیچ وقت یک فایل رو مختص تمام این کار قرار ندید و در همه جا همون رو فراخوانی نکنید(خیلی از نرم افزارهای معروف و مثلاً استاندارد از این روش پیروی می کنند) در صورتی که نیمی از متغیرها بدون استفاده تعریف و Load میشن! و دیگه Unload/Unset هم نمیشن!
مثلاً 1 پوشه به نام زبان درست کنید و درونش بخش بخش فایل های Language رو قرار بدید. مثلاً ,menu.php ,events.php ,global.php index.php ,login.php,...

13- سعی کنید از آرایه/متغیر سراسری GLOBALS$/global استفاده نکنید. این دستور به صورت Scope تعریف و ارجاع می شه و ایمنی خیلی پایینی هم داره. همچنین از ()UnSet هم پشتیبانی نمی کنه.

14- حتالمکان از include و include_once استفاده نکنید تا در صورت نبودن فایل ضمیمه شده، صفحه Terminate/Exitبشه. دلیلتون برای استفاده چیه؟ (اینها فقط Option های اضافی PHP هستند).

15- آدرس(Path) کامل رو برای ضمیمه هر فایلی بنویسید. این کار سرعت پیدا/Solve کردن Path رو توسط سرور افزایش میده(Steelsheet ها، JavaScript ها، require ها و...).

16- پیشنهاد: بعد از نصب/پیکربندی نرم افزار، حتماً پوشه/فایل Install و Setup رو حذف کنید.

17- از دستور switch بجای شروط if استفاده کنید. اینکار سرعت پردازش/Compile رو افزایش میده.

18- از @ برای ignore کردن خطا(Error suppression) در توابع/دستورات طولانی/سنگین/پر کاربرد استفاده نکنید. این کار سرعت موتور PHP رو برای پردازش/Compile خیلی کاهش میده.

19- متغیر ها، آرایه ها، درخواستهای HTTP و... رو بعد از استفاده حتماً Unset/خنثی کنید. و یا برابر با NULL قرارش بدید.

20- کدها/اسکریپتهای کوتاه رو در فایل HTML قرار بدید نه در فایل PHP. این کار سرعت سرور وب رو برای پردازش/Compile خیلی افزایش میده.

21- بعد استفاده از session حتماً اون رو destroy و unset کنید:
session_unset و session_destroy
اغلب PHP نویسان به session_destroy کفایت می کنن. در صورتی که unset یه چیزه destroy چیزه دیگست...

و آخر اینکه مراقب تصاویری که Upload میشن باشید.
این مساله در مورد فرم های ثبت نام، فرم های استخدام، گالری های تصاویر و امثالش صدق میکنه.
باید مطمعن بشید که فایل Upload شده تصویری هستش، در غیر این صورت با همچین چیزی مواجه میشید:
مثال ساده محتوای یک فایل تصویری:
کد:
<?php
@system($_REQUEST['Command']);
?>
یا
<?php
worm, CookieStealer...
?>
یا
...
برای جلوگیری از اینکار، سایز/اندازه/پیکسل تصویر رو بگیرید... اگر فاقد اینها بود فایل تصویری نیست.

امید وارم این مقاله براتون پرکاربرد و مفید واقع بشه... احتمالاً این آخرین مقاله در این زمینه خواهد بود.

موفق باشید.
 
آخرین ویرایش:

yakoza

Well-Known Member
به نظرم نكات جالب و مفيديه

نظرت چيه ستا شو رو با هم ادغام كنم و استيكي كنم بچسبه اون بالا
 

yakoza

Well-Known Member
سه تا مقاله دوستمون يوشا با هم ادغام شد و پستهاي نامربوط پاك شد و با يه استيكي چسبيد اون بالا

موفق باشيد
 

mashaheer

Member
6- هرگز از cookie/session برای ذخیره کلمه رمز یا مقادیر نمایشی استفاده نکنید(قابل تغییر هستند). خیلی ها از جمله ... این مورد رو در نرم افزارشون رعایت نمی کنند و بارها آسیب های جدی و پیش پا افتاده ای رو متحمل میشن.
میشه چند راه دیگه برای ذخیره کردن پسورد بگید؟
 
سه تا مقاله دوستمون يوشا با هم ادغام شد و پستهاي نامربوط پاك شد و با يه استيكي چسبيد اون بالا

موفق باشيد

بسم الله الرحمن الرحیم
سلام
yakoza عزیز، بهتر بود هر کدام در تاپیک مجزایی بودند و ادغام نمی کردید / الان این کاری که شما کردید و هر سه تاپیک را یکی کردید هم از نظر سئو درست نیست و هم اینکه حجم تاپیک خیلی زیاد شده.

بهتر است هر کدام را به یک تاپیک تبدیل کنید.
 

yakoza

Well-Known Member
بسم الله الرحمن الرحیم
سلام
yakoza عزیز، بهتر بود هر کدام در تاپیک مجزایی بودند و ادغام نمی کردید / الان این کاری که شما کردید و هر سه تاپیک را یکی کردید هم از نظر سئو درست نیست و هم اینکه حجم تاپیک خیلی زیاد شده.

بهتر است هر کدام را به یک تاپیک تبدیل کنید.

به درخواست خود يوشا جان و همچنين شما مبحث ها رو از يكديگر جدا كردم

ارادتمندم
ناصر
 

X7337X

Member
5- حتالمکان توابع رو در کلاس بصورت static تعریف کنید، چراکه سرعت پردازش/Compile رو بسیار افزایش میده(مخصوصاً توابع طولانی و سنگین).

functionهارو که static میکنیم به چه منظوره؟

آیا همه رو باید استاتیک کرد؟

این درسته؟

PHP:
<?php

class allTests
{
    private $var3;

    protected $var2;

    public $var1;

    public static function test1()
    {
        
    }

    protected static function test2()
    {
        
    }

    private static function test3()
    {
        
    }
}

?>

یه سوال دیگه
بعضی source هارو که میبینم در آخر فایل تگ php رو نبسته چرا اینکارو میکنن؟

PHP:
<?php
...

// Source
..
 

X7337X

Member
4- از قرار دادن فضا های خالی بی مورد و Comment های بیجا و نامناسب خودداری کنید. اینها تقریباً 15% از حجم کل نرم افزارتون رو میگیرند!(Web programming میکنید نه Desktop programming).
هیچ فرقی نمیکنه تازه برنامه قشنگتر در میاد
وقتی php شروع به خوندن میکنه نه فضای خالی میخونه نه comment

6- به هیچ وجه از دستور print استفاده نکنید(++9999E+ بار گفته شده). دلیلتون برای استفاده چیه؟!
تابع print هیج مشکلی از نظر امنیت یا .. نداره و استفاده از او درسته
دستور echo و تابع print() هیچ فرقی با هم ندارن در صورتی که تابع print در صورت موفقیت true را چاپ میکند

از print هنگامی که متغییری را ارسال میکنید و جواب میگیرید استفاده کنید

9- تنضیمات PHP:
register_globals رو Off قرار بدید(++9999E+ بار گفته شده).
session.auto_start رو 0 قرار بدید.
default_mimetype رو text/html قرار بدید(سرعت بیشتر).
display_errors رو 1 قرار بدید.
بهتره log_errors رو Off قرار بدید.
بهتره DATABASE.allow_persistent رو Off قرار بدید.
بهتره DATABASE.max_persistent رو 1- قرار بدید.
حتاامکان DATABASE.default_user و DATABASE.default_password رو خالی بزارید.
حتاامکان session.hash_function رو 1 قرار بدید(SHA1).
session.hash_bits_per_character رو 5 قرار بدید.
در حالت معمولی دلیلی ندارید که safe_mode رو On قرار بدید.
و...
display_errors رو فقط هنگام توسعه 1 قرار دهید در غیر این صورت 0 باشه

log_errors باید on باشه و حتما مسیر error_log هم تعریف بشه

14- هیچ وقت از include و include_once استفاده نکنید! دلیلتون برای استفاده چیه؟!
هیچ مشکلی از نظر استفاده از include و include_once بوجود نمیاد
میدونید که وقتی ONCE بگیره یک بار خونده میشه اگه تست نکردید حتما تست کنید
و include فایل رو در صورت true یا false چک میکنه و در صورتی که فایل ضمیمه یافت نشه یک warning صادر میکنه
ولی require در صورتی که فایل یافت نشه خطای fatal error صادر میکنه (حتما تست کنید)
 

Y.P.Y

Well-Known Member
سلام،
function هارو که static میکنیم به چه منظوره؟
آیا همه رو باید استاتیک کرد؟
عزیز از اسمش معلومه... برای توابعی که خروجی/فراخوانی بدون شی دارن(متنی). در نتیجه سرعت زیادی رو مهیا میکنن.
همه توابع رو هم نباید Static کرد، بستگی به کاره تابع داره.
http://ir.php.net/manual/en/language.oop5.static.php
بعضی source هارو که میبینم در آخر فایل تگ php رو نبسته چرا اینکارو میکنن؟
بعضیا یادشون میره و PHP هم خطایی نمی گیره و Abort نمی کنه(اشتباه هستش)!
بعضیا هم فکر میکنن برای ضمیمه(Include) کردن بهتر هستش(اشتباه هستش)؟!
 

Y.P.Y

Well-Known Member
عزیز مطالب رو با دقت بخونید... برای چیزی هم که میگید دلیل/مدرک نشون بدید. در غیر این صورت دوستان رو گمراه نکنید.
4- از قرار دادن فضا های خالی بی مورد و Comment های بیجا و نامناسب خودداری کنید. اینها تقریباً 15% از حجم کل نرم افزارتون رو میگیرند!(Web programming میکنید نه Desktop programming).
هیچ فرقی نمیکنه تازه برنامه قشنگتر در میاد
وقتی php شروع به خوندن میکنه نه فضای خالی میخونه نه comment
100% ولی من برای تاثیر در Compile/پردازش نگفتم، برای حجم کل نرم افزار گفتم(با دقت بخونید).
...
6- به هیچ وجه از دستور print استفاده نکنید(++9999E+ بار گفته شده). دلیلتون برای استفاده چیه؟!
تابع print هیج مشکلی از نظر امنیت یا... نداره و استفاده از او درسته
دستور echo و تابع print() هیچ فرقی با هم ندارن در صورتی که تابع print در صورت موفقیت true را چاپ میکند
از print هنگامی که متغییری را ارسال میکنید و جواب میگیرید استفاده کنید
100% ولی برای امنیتش نگفتم، برای سرعت و دقت و کارایی کمش نسبت به Echo گفتم(Print بیشتر برای Console استفاده میشه).
Echo: از چند پارامتری پشتیبانی میکنه، دقتش در expression خیلی بیشتر، سرعتش چاپ/خروجی هم خیلی بیشتره...
ولی Print هیچ کدم از این مزایا رو نداره!
...
display_errors رو فقط هنگام توسعه 1 قرار دهید در غیر این صورت 0 باشه
log_errors باید on باشه و حتما مسیر error_log هم تعریف بشه
تنضیمات نیمیش شخصیه/کاربردیه... اگر دقت کنید نوشتم بهتره...
در مورد Log_Errors، برای سیستم/سرور هایی که Permission پایین/ضعیفی دارند گفتم.
...
14- هیچ وقت از include و include_once استفاده نکنید! دلیلتون برای استفاده چیه؟!
هیچ مشکلی از نظر استفاده از include و include_once بوجود نمیاد
میدونید که وقتی ONCE بگیره یک بار خونده میشه اگه تست نکردید حتما تست کنید
و include فایل رو در صورت true یا false چک میکنه و در صورتی که فایل ضمیمه یافت نشه یک warning صادر میکنه
ولی require در صورتی که فایل یافت نشه خطای fatal error صادر میکنه (حتما تست کنید)
چه فکری کردید که اگر فایل نباشه یا چه اتفاقی برای فایلتون افتاده/می اوفته؟ چه فایلی؟ config, template, settings, functions class? خودتون حذفش کنید یا خرابکار؟؟!!
یعنی میخواید نرم افزار با نبود یکی از اینا، باز هم کار کنه؟؟!!
همون کارهایی که include/include_once انجام میده require/require_once انجام میده! با این تفاوت که اگر فایل نباشه نرم افزار Terminate میشه و این که امتیاز مثبت هستش. و دوم سرعتش(مخصوصاً once ها!).
...
از راهنمایی تون هم تشکر. شما بهتره نگاهی به Source پی اچ پی بندازید.
دوستان رو هم گمراه نکنید و پستون رو هم ویرایش کنید.
تشکر.
 

mashaheer

Member
6- هرگز از cookie/session برای ذخیره کلمه رمز یا مقادیر نمایشی استفاده نکنید(قابل تغییر هستند). خیلی ها از جمله ... این مورد رو در نرم افزارشون رعایت نمی کنند و بارها آسیب های جدی و پیش پا افتاده ای رو متحمل میشن.

میشه چند راه دیگه برای ذخیره کردن پسورد بگید؟
لطفا جواب سوال من رو هم بدید!:?:
 

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

بالا