- کانفیگ hardening شده هسته Linux برای محیط production x64:
(قبل از کامپایل هسته Linux بهمین شکل پارامترهارو داخل فایل .config
موجود در سورس لینوکس تون اعمال کنید)
- کانفیگ hardening شده هسته Linux برای محیط production x64:
(قبل از کامپایل هسته Linux بهمین شکل پارامترهارو داخل فایل .config
موجود در سورس لینوکس تون اعمال کنید)
۱- اینکه exception ها، استثنا هستن! فقط باید از اونها برای مواجه با مشکلات غیر قابل پیش بینی استفاده کنید.
۲- هرگز از استثنائها برای کنترل جریان/flow نرم افزار استفاده نکنید. اینکار باعث میشه که نتونید مسیر اجرای کد رو دنبال کنید و پرفورمنس نرم افزار هم کاهش پیدا میکنه. (مثل دستور GoTo که در برخی زبانها وجود داره)
۳- هرگز شی exception رو بعنوان مقدار و خروجی return
نکنید.
۴- استثنائها فقط باید حاوی اطلاعات رخداد/رویداد باشد و نباید حاوی پارامترها(یا اطلاعات اضافی) باشه که روی نحوه انجام و منطق داخل بلوک catch
تاثیر بذاره.
۵- هرگز exception های زیرساختی/داخلی مثل SystemException
, OutOfMemoryException
, StackOverflowException
, ComException
, ExecutionEngineException
, NullReferenceException
, IndexOutOfRangeException
رو پرتاب نکنید.
۶- برای حالت debug نرم افزار exception پرتاب نکنید.
۷- داخل متد toString()
کلاس هاتون exception پرتاب نکنید. اینکار عمل debugging رو سخت می کنه. (از این متد برای debug کردن استفاده میشه)
۸- داخل توابع مقایسه ای(true/false) و equal هرگز exception پرتاب نکنید.
۹- هرگز StackOverflowException
و OutOfMemoryException
رو catch نکنید. اینها غیرقابل کنترل و هندل شدن هستن.
۱۰- همیشه exception های سطح پایین و general رو به exception های ریز تر و خاص تر wrap کنید. مثل:
NotFoundException
-> FileNotFoundException
/URLNotFoundException
۱۱- همیشه عملیات پاکسازی/Cleanup رو در بلوک finally
قراربدید و نه در بلوک
. بلوک catchfinally
همیشه اجرا میشه اما بلوک catch
فقط هنگام رخداد exception اجرا میشه.
۱۲- فقط باید زمانی exception رو catch
کنید که میتونید بخوبی مشکل رو handle و recovery کنید. درغیراینصورت بهتره exception رو catch
نکنید. (چون درواقع صرفا مخفیش کردید)
۱۳- بهتره که هنگام timeout شدن یک عملیات، TimeoutException پرتاب کنید نه اینکه توسط if/else اونرو handle کنید.
۱۴- در بلوک finally
هرگز exception پرتاب نکنید.
۱۵- صرفا Log و rethrow کردن یک exception در بلوک catch
بمعنای handle کردنش نیست.
۱۶- هرگز exception مادر/عمومی مثل Exception
رو throw نکنید.
۱۷- برای wrap کردن exception همیشه از کلاس مادر Exception
یا RuntimeException
ارث بری کنید.
۱۸- بهتره از exception های predefined استفاده کنید تا اینکه اونهارو خودتون مجدد بسازید.
۱۹- بهتره در بلوک catch
از if/else
استفاده نکنید تا از ایجاد branch های تودرتو جلوگیری بشه.
۲۰- همیشه پیامهای exception رو در فایلی log کنید.
۲۱- بجای throw ex
از throw
استفاده کنید تا پیامهای stacktrace قبلی و کنونی موجود در ex حفظ بشن.
catch(Exception ex) { throw; }
1- حتی الامکان دایرکتیوهای using
رو بداخل namespace
منتقل کنید و در خارج از محدوده namespace رها نکنید.
StyleCop: SA1200: UsingDirectivesMustBePlacedWithinNamespace
namespace ConsoleApp1 { using System; using System.Collections.Generic; using System.Text; class Program { private static void Main(string[] args) { } } }
نکته: درصورتیکه فقط یک namespace
در فایل موردنظر موجود باشه.
2- همیشه reference های بلااستفاده رو از پروژه حذف کنید.
نکته: البته هنگام کامپایل برنامه، همه reference های استفاده نشده حذف میشن، ولی خب همیشه محیط کدنویسی رو تمیز و خلوت نگه دارید.
3- همیشه دایرکتیوهای using
بلااستفاده(خاکستری رنگ) رو از کلاسها حذف کنید.
using System.Drawing; using System.Resources; // <----- using System.Reflection; // <----- using System.Runtime.InteropServices; // <----- using System; using System.Windows.Forms;
4- جهت بازگشت چندین مقدار از یک متد میتونید از کلمه کلیدی ref
یا out
یا پرانتز (type1, type2, typeN) یا حتی Tuple
استفاده کنید:
public Tuple <int, string, string> GetStudent() { int studentId = 11; string firstName = "Alex"; string lastName = "Koertson"; return Tuple.Create(studentId, firstName, lastName); }
نکته: Tuple
از نوع reference type هستش و حداکثر ظرفیت 8 عنصر رو داره. همچنین از دات نت نسخه 4 و جدیدتر در دسترسه.
1- برای بدست اوردن میزان حافظه مصرف شده باید از دستور memory_get_usage(FALSE)
استفاده کنید و برای میزان حافظه رزرو شده باید از دستور memory_get_usage(TRUE)
استفاده کنید.
اما این نکته در مستندات سایت PHP.net برعکس توضیح داده شده:
int memory_get_usage ([ bool $real_usage = FALSE ] )
Returns the amount of memory, in bytes, that's currently being allocated to your PHP script.
2- زمانی از دستور strcmp
استفاده کنید که قراره مقدار رشته ها شمارش(کمتر/بیشتر) بشن، درغیراینصورت استفاده از اپراتور ===
برای برابر بودن/نبودن رشته ها بهترین گزینست.
3- آیا میدونید به 4 روش مختلف میتونید تصاویر رو در مرورگر نمایش/output بدید؟
header('Content-Type: image/jpg'); $image = imagecreatefromjpeg('yourfilename.jpg'); header('Content-Length: ' . filesize('yourfilename.jpg')); imagejpeg($image); imagedestroy($image);
و
header('Content-Type: image/jpg'); header('Content-Length: ' . filesize('yourfilename.jpg')); readfile('yourfilename.jpg');
و
header('Content-Type: image/jpg'); header('Content-Length: ' . filesize('yourfilename.jpg')); echo file_get_contents('yourfilename.jpg');
و
header('Content-Type: image/jpg'); header('Content-Length: ' . filesize('yourfilename.jpg')); header('X-Sendfile: ' . 'yourfilename.jpg'); exit;
4- اگر از PHP CLI در محیط text UI سیستم عامل استفاده می کنید و مشکلات output و نمایشی دارید، بهتره از دستور passthru
استفاده کنید.
5- نکته جزیی: فراموش نکنید که تابع json_decode
فقط اعضای public
شی موردنظر رو تبدیل میکنه، و نه private
/ protected
.
بدون استفاده از عبارت SET NAMES utf8 در دیتابیس: اگر انکودینگ فایل موردنظر UTF8 باشه، تگ meta صفحه UTF8 باشه، charset دیتابیس هم utf8_persian_ci باشه خروجیش صحیحه و میشه این:
آ ب پ ت ث ج چ ح خ د ض ر ز ش
اگر انکودینگ فایل موردنظر UTF8 باشه، تگ meta صفحه UTF8 "نباشه"، charset دیتابیس utf8_persian_ci باشه/نباشه خروجیش میشه این:
Ø¢ ب Ù¾ ت Ø« ج Ú† Ø Ø® د ض ر ز Ø´
اگر انکودینگ فایل موردنظر UTF8 "نباشه"، تگ meta صفحه UTF8 باشه، charset دیتابیس utf8_persian_ci باشه/نباشه خروجیش میشه این:
� � � � � � � � � � � � � �
اگر انکودینگ فایل موردنظر UTF8 "نباشه"، تگ meta صفحه UTF8 "نباشه"، charset دیتابیس utf8_persian_ci باشه/نباشه خروجیش میشه این:
Â È Ê Ë Ì Í Î Ï Ö Ñ Ò Ô اگر انکودینگ فایل موردنظر UTF8 باشه، تگ meta صفحه UTF8 باشه، اما charset دیتابیس utf8_persian_ci "نباشه" خروجیش صحیحه و میشه این:
آ ب پ ت ث ج چ ح خ د ض ر ز ش
می بینید که حتی بدون استفاده از عبارت SET NAMES utf8 باز هم میشه "خروجی" صحیح رو گرفت.
با استفاده از عبارت SET NAMES utf8 در دیتابیس: اگر SET NAMES UTF8 باشه، انکودینگ فایل موردنظر UTF8 باشه، تگ meta صفحه UTF8 باشه، charset دیتابیس utf8_persian_ci باشه خروجیش صحیحه و میشه این:
آ ب پ ت ث ج چ ح خ د ض ر ز ش
اگر SET NAMES UTF8 باشه، انکودینگ فایل موردنظر UTF8 باشه، تگ meta صفحه UTF8 "نباشه"، charset دیتابیس utf8_persian_ci باشه خروجیش میشه این:
Ø¢ ب Ù¾ ت Ø« ج Ú† Ø Ø® د ض ر ز Ø´
اگر SET NAMES UTF8 باشه، charset دیتابیس utf8_persian_ci "نباشه"، و همه چیز دیگر UTF8 باشن خروجیش میشه این:
? ? ? ? ? ? ? ? ? ? ? ? ? ?
اگر SET NAMES UTF8 باشه، انکودینگ فایل موردنظر UTF8 "نباشه"، تگ meta صفحه UTF8 باشه، charset دیتابیس utf8_persian_ci باشه خروجیش میشه این:
" " اما برای نمایش درست کلمات در خود دیتابیس لازمه که از set_charset و SET NAMES UTF8 استفاده کنید.
مقالات مرتبط:
نکاتی برای افزایش امنیت وبسایت
1- حتاالمکان از کتابخانه های template engine برای کدنویسی لایه View/UI وب اپلیکیشن استفاده کنید و نه کدنویسی inline/mixed.
2- برای کاهش مصرف پهنای باند و افزایش سرعت سایت، همیشه فایلهای CSS, JavaScript, HTML رو minify و lint کنید:
CSS:
https://github.com/purifycss/purifycss
https://cssnano.co/guides/getting-started
https://github.com/ben-eb/cssnano-cli
https://github.com/css/csso-cli
https://github.com/uncss/uncss
JS:
https://github.com/nolanlawson/optimize-js
3- بطور منظم و ماهیانه پهنای باند وبسایت/سرور رو چک کنید.
4- یک سیستم اسکنر پیاده کنید که نوع دسترسی و زمان تغییر فایلها و دایرکتوری های کل سایت رو اسکن و به شما گزارش کنه.
5- از استفاده بیش از حد کوکی و ذخیره اطلاعات حساس/نمایشی در داخلشون خودداری کنید.
مقالات مرتبط:
نکات و اصول مهم در طراحی وبسایت
نکاتی برای افزایش امنیت وبسایت
#2 - نکاتی برای افزایش امنیت وبسایت
1- از صفت alt
در تگهای img
و از صفت title
در تگهای link
استفاده کنید. صفت alt
بیانگر خلاصه ای از محتوای تصویر موردنظر هستش.
2- فراموش نکنید که محل کنونی آدرسهای Font در فایلهای CSS از همان مسیر Relative فایل CSS شروع می شوند.
3- Link های صفحات را چک کنید و از سالم بودنشان مطمئن بشید.
4- شکل ظاهری صفحات جداگانه را با شکل ظاهری صفحات اصلی یکنواخت کنید.
5- به عملا و دیکطه لقاط دغط کنید!
مقالات مرتبط:
#2 - نکاتی برای افزایش امنیت وبسایت
1- مکانیزم و شیوه کار پروتوکل HTTP رو کامل فرا بگیرید.
2- همیشه کتابخانه ها و فریم ورکهای استفاده شده در اپلیکیشن رو بروز نگه دارید!
3- جهت جلوگیری از click-jacking مقدار هدر X-Frame-Options
رو DENY
قرار بدید:
Apache httpd.conf: Header always append X-Frame-Options DENY Apache .htaccess: Header append X-FRAME-OPTIONS "DENY" Nginx: add_header X-Frame-Options "DENY"; PHP: header('X-Frame-Options: DENY');
4- بصورت هفتگی یا ماهیانه کل سایت رو توسط نرم افزارها و سایتهای اسکنر امنیتی چک کنید:
https://observatory.mozilla.org
https://virustotal.com
https://immuniweb.com/websec
https://detectify.com
http://amn.bayan.ir
https://ssllabs.com/ssltest/index.html
http://isithacked.com
https://app.upguard.com/webscan
https://app.webinspector.com/online_scan
https://suip.biz/?act=sqlmap
https://pentest-tools.com/home
https://sitecheck.sucuri.net
https://quttera.com
https://siteguarding.com
https://transparencyreport.google.com/safe-browsing/search
5- داده های ورودی توسط کاربر را بدقت بررسی، برش و فیلترسازی کنید!
6- برای اپلیکیشن، قابلیت debug mode درست کنید تا در مواقع لزوم بتونید فعالیت های اپلیکیشن رو مانیتور و خطازدایی کنید.
مقایسه پرفورمنس(startup, rendering, event handling):
Windows FLTK > wxWidgets > GTK > Qt Linux FLTK > GTK > (wxWidgets / Qt)
نکته: در اینجا منظور از GTK نسخه GTKmm هستش که wrapper/مخصوص ++C هستش.
نکته 2: عناصر کتابخانه wxWidgets صددرصد native هستن. اما عناصر کتابخانه FLTK و Qt و GTK فقط "شبیه" به native هستن. که برای این شبیه سازی از CSS و API های theming سیستم استفاده می کنن.
این توضیحات رو هم در نظر بگیرید:
- کتابخانه FLTK از نظر استایل بهترین گزینه برای لینوکس با محیط EDE هستش. از نظر فضای دیسک، بسیار کم حجم هستش. پرفورمنس بالاتری نسبت به بقیه کتابخانه ها داره. استفاده ازش آسون هست. از بعضی دیگر زبانهای برنامه نویسی هم پشتیبانی میکنه. در ویندوز برروی WinAPI، در لینوکس برروی X Window و در مک بر روی Quartz سوار هست. FLTK بعضی از widget های مدرن مثل Treeview رو نداره. بعضی از widget ها حالت RTL (راست به چپ) رو ندارن.
- کتابخانه wxWidgets از نظر استایل بهترین گزینه برای ویندوز و مک و لینوکس هستش. از نظر فضای دیسک، حجیم هستش. یادگیری و استفاده ازش کمی سخته. UI designer هم داره. از خیلی زبانهای برنامه نویسی پشتیبانی میکنه. در لینوکس بر روی کتابخانه GTK قرار داره و در پشت پرده از API های GTK استفاده میکنه. wxWidgets فقط کتابخانه GUI نیست، یک فریم ورک محسوب میشه.
- کتابخانه GTK از نظر استایل بهترین گزینه برای لینوکس با محیط Cinnamon, GNOME, XFCE یا Mate هستش. یادگیری و استفاده ازش آسونه. UI designer هم داره. از خیلی زبانهای برنامه نویسی پشتیبانی میکنه.
- کتابخانه Qt از نظر استایل بهترین گزینه برای لینوکس با محیط KDE, TDE یا LXQt هستش. از نظر فضای دیسک، حجیم هستش. یادگیری و استفاده ازش بواسطه Qt Creator آسونه. UI designer هم داره. از خیلی زبانهای برنامه نویسی پشتیبانی میکنه. امکانات غیر استاندارد هم داره(meta-object). طیف گسترده تری از platform ها رو در بر گرفته. Qt فقط کتابخانه GUI نیست، یک فریم ورک هستش. برای پروژه های غیر opensource باید مجوز داشته باشید. از مدل برنامه نویسی reactive پشتیبانی می کنه. (به کمک شتابدهنده گرافیکی میشه بار سنگین رندر رو از روی پردازنده برداشت، بنابراین باعث افزایش پرفورمنس میشه)