- کانفیگ hardening شده هسته Linux برای محیط production x64:
(قبل از کامپایل هسته Linux بهمین شکل پارامترهارو داخل فایل .config
موجود در سورس لینوکس تون اعمال کنید)
۱- اینکه Exception ها، استثنا هستن! فقط باید از اونها برای مواجه با مشکلات غیر قابل پیش بینی استفاده کنید.
۲- هرگز از Exception برای کنترل جریان/flow نرم افزار استفاده نکنید. اینکار باعث میشه که نتونید مسیر اجرای کد رو دنبال کنید و پرفورمنس نرم افزار هم کاهش پیدا میکنه. (مثل دستور GoTo که در برخی زبانها وجود داره)
۳- هرگز شی Exception رو بعنوان مقدار و خروجی return
نکنید.
۴- Exception فقط باید حاوی اطلاعات رخداد/رویداد باشد و نباید حاوی پارامترها(یا اطلاعات اضافی) باشه که روی نحوه انجام و منطق داخل بلوک 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 درست کنید تا در مواقع لزوم بتونید فعالیت های اپلیکیشن رو مانیتور و خطازدایی کنید.