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

Y.P.Y

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

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

هرگز از SQLite برای نرم افزارهای سنگین استفاده نکنید.
شاید SQLite نقات قوت زیادی داشته باشه (از جمله مستقل بودن)، ولی در رابطه با نرم افزارهای سبک. در نرم افزارهای سنگین.
اولیش: عدم نیاز به پردازش سرور! در ظاهر یه نقطه قوت هست، ولی نداشتن پردازش سرور، مجموعه ای از مشکلات بزرگ و خطرناکی رو بهمراه داره: مثل قفل فایل، مسایل همزمانی، مشکلات حافظه، نداشتن کش Query، مشکلات باینری، مشکلات سرریز(Overflow) شدن داده های سنگین و مشکلات مقیاسی هنگام برخورد با توده عظیمی از اطلاعات.
دومیش: باینری نا امن! SQLite اطلاعات باینری رو نمیتونه Handle کنه. برای Insert کردن داده از نوع باینری، ابتدا باید آنرا Encode کنید. بهمین شکل باید تا آخر، پس از یک Select، داده رو هی Encode/Decode کنید.
سومیش: همه جداول رو قفل می کنه! اکثر پایگاه های داده جداول انفرادی(یا حتی سطر ها) رو در حین انجام عملیات قفل می کنند، اما SQLite همه پایگاه داده رو در حین عملیات قفل میکنه. که این Read/Write همزمان رو بسیار کند میکنه. و مشکلات عمده و بزرگ دیگه ای از این قبیل رو بهمراش میاره.
پس هرگز از SQLite برای نرم افزار های سنگین (با داده های سنگین) استفاده نکنید.

13- اگر به قاعده های توابع موجود در بسته PCRE مسلط نیستید یا به صحت قواعدتون شک دارید برای فیلتر کردن ورودیها/خروجیها استفاده نکنید. اینها توابعی بسیار دقیق در عین حال خیلی حساس هستند. از توابع خود بسته Standard استفاده کنید (اگر نیازی به قواعد ندارید). بهینه تر هم هست!
طبیعتاً سرعت برخی توابعی که در بسته Standard هستش از توابع موجود در بسته PCRE خیلی بیشتره.

14- اگر چند تابع دارید که در یک زمینه فعالیت می کنن همه رو در یک کلاس قرار بدید. (کپسوله سازی کنید)

15- الفبای کد نویسی ایستا :)
بین (صحیح):
کد:
<input name="inpTxt_Username" type="text" value="" maxlength="15" size="15" id="inpTxt_Username">
و (غلط):
کد:
<input type="text" name="inpTxt_Username" id="inpTxt_Username">
کمی تفاوت و جای سو استفاده هست.
حتی بین پارامترهای CSS (غلط):
کد:
overflow: hidden; width: 250px; height: auto;
و (صحیح):
کد:
width: 250px; height: auto; overflow: hidden;
همچنین بین (صحیح):
PHP:
$_REQUEST['frm_Test'], $_REQUEST['btn_Test']...
و (غلط):
PHP:
$_GET['frm_Test'], $_GET['btn_Test']...
پس در نوشتن اینها (حتی اگر خودکار insert می شوند) دقت کنید.

16- در کلاسها/اشیا، متدها رو بصورت Protected/Public/Private به جای Var تعریف کنید. نوع Var که معادل Public در PHP 5 هستش منسوخ شده و دسترسی تعیین نشده ای برای محافظت فیلدهای داخلی داره.

17- برای دستیابی به فیلدها و متد های کلاس والد از ::Self و ::parent بجای ::ClassName استفاده کنید. چراکه پشمایش کلی/سراسری انجام میده و در نتیحه برابره با کاهش سرعت پردازش.

18- ورودی و خروجی پارامترهای URL رو چک و فیلتر کنید. مطمعن شوید که مثلاً
کد:
/index.php?Module=News&Action=Show&Identity=1&Valid=True
در اینجا Module از نوع حروف(Alphabetic) به طول 255 کاراکتر، و Action هم از نوع حروف(Alphabetic) با طول 255 کاراکتر و Identity از نوع عدد(Integer) با طول 10، و Valid از نوع Boolean هستش. این نکته ساده رو اغلب رعایت نمی کنن و بارها بارها آسیب های جدی در نرم افزار هایشون بصورت مکرر پیش میاد. lol

19- پیشنهاد می کنم دسترسی فایلها تون رو به ReadOnly تنظیم کنید، حتی index.html ها در پوشه های خالی.

20- اگر از short_open_tag مثل <؟ ؟> استفاده می کنید از فعال(On) بودن این option در راس فایلهای نرم افزارتون مطمعن بشید: ini_set('short_open_tag', 'on'); البته این option در تعداد بیشماری از server ها، بصورت Off هستش!

21- حتاامکان از بسته PEAR::Db استفاده نکنید.
این بسته 2 مزیت داره و 2 عیب. چون PEAR::Db با PHP بکار گرفته میشه:
1- لایه ای که در PHP نوشته می شود از توابع داخلی خود PHP کند تر هست. مخصوصاً اگر بدون کش opcode اجرا بشه.
2- لایه اضافی کد، پیچیدگی و احتمال خطا را افزایش میده و در نتیجه آسیب پذیر میشه.
من، برای خودم هیچ کدوم از بسته های PEAR رو قبول ندارم. مخصوصاً بسته های Filtration ,Validation ,Db.
 
آخرین ویرایش:
طبق نکته 10 آیا باید واسه Include کردن فایلها هم از تابع file_exists استفاده کرد یا نیاز نیست ؟ ممنون :rose:
 
8
- حتاًامکان از دستور get_$ برای دریافت مقادیر استفاده نکنید. و به جاش از دستور request_$ استفاده کنید(مقدارش رو هم فیلتر کنید).
ببینید من ازاین دستور برای ارسال به صفحه دیگه استفاده میکنم
PHP:
 <a href='comment.php?cmd=1&id=$row[id]'>$row[filename]</a>
و دز صفحه comment.php هم از این
PHP:
 select * from uploadfile where id=$_GET[id]
بنابراین وقتی به صفحه comment میره توی مرور گر آدرس رو اینجوری مینویسه و من فکر کنم که خطرناکه
شما گفتین که از request_$ استفاده کنین من این کار رو کردم ولی ارور میده و اطلاعات رو نشون نمیده و اینکه چطور می شه مقدارش رو فیلتر کرد؟
و سوال بعد این که این کدی که من نوشتم مشکل امنیتی داره یا نه؟ چرا
 
آخرین ویرایش:
در صفحه comment.php هم که دستورتون کلاً مشکل داره! یعنی شما با
id=$_GET[id]​
هر رشته ای رو وارد نرم افزار می کنید!!
سلام و ممنون از جوابتون
من نفهمیدم که راه حل درست این کار چیه
ضمنا منظور شما از Target رو هم نفهمیدم
 

Dark-M4N

Member
اینم من اضافه کنم برای جلوگیری از حملات Xss که الان روی اکثر سیستم های ساب دامین دهی مشاهده میشه

از تگ
strip_tags

استفاده کنید

حداقل برای جاوا ها مفیده!

- برای Escape کردن کاراکترهای ویژه و جلوگیری از خیلی از حملات SQL از دستورات زیر استفاده کنید:

دور اینم خط بکشید :دی

این تابع به راحتی بایپس میشه

خود mysql_real_escape_string
که هیچ ولی میتونید از addslashes و num_rows استفاده کنید

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

amirepsilon

Active Member
شاید منظورش نحوه توضیح هست

ولی انصافا کارت تمیزه
اگه خودت هم تمام اینها رو رعایت میکنی معرکست !
ممنون

میشه ممراجع بیشتری از این دست برنامه نویسی با دقت معرفی کنی ؟

در ضمن این چیه ؟

این طوری از steal و sniff کردن مقادیرشون هم جلوگیری میشه(تا حد زیادی).
 
آخرین ویرایش:

amirepsilon

Active Member
ممنون
میشه بگی این فاینال کارش چیه ؟
و پابلیک با پرایویت چه فرقی میکنه ؟
 

k2-4u

Well-Known Member
اگه اینطوری باشه ؟

14- و در آخر، بهتر و ایمن تره اگر تمامی تگ ها و بلاک ها رو کامل مشخص کنید و کامل ببندید:
حافظه هم دچار مشکل نمیشه.
.

حالا اگه اینطوری ببندیم مشکل داره ( با بلاک)
PHP:
if()
{
...
};

while()
{
.....
};
 
آخرین ویرایش:

Allahparast

Member
Endif
در پی اچ پی 3 مثل اینکه بوده چون تو توسعه 5 بازم هست عجیبه ممنون که یادآوری کردی :rose:
 

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

بالا