احسان رضایی

یک توسعه دهنده

فهرستی از نکات امنیتی در PHP

در PHP , / تاریخ ارسال 08-08-1397 / 0 نظر / آخرین ویرایش 22-12-1402

php-security-checklist

- از php 7 یا نسخه های بالاتر استفاده کنید.

یا به عبارت دیگه همیشه از آخرین نسخه php استفاده کنید. کاملا مشخصه که در نسخه های جدیدتر، موارد امنیتی اضافه یا اصلاح و ویژگی های قدیمی و غیر قابل اطمینان دور ریخته میشن.

- تمام داده ها رو فیلتر و اعتبار سنجی کنید.

صرف نظر از اینکه داده ها از کجا اومدن و به کجا خواهند رفت!(داده های ورودی و خروجی منظورمه) یاید فیلترها و اعتبار سنجی های مختلف روی اونها اعمال بشه. اگر از فریمورک های موجود استفاده میکنید ابزار های خوبی رو در این زمینه براتون فراهم کردن. اگر هم استفاده نمیکنید که پیشنهاد میکنم استفاده کنید!

- استفاده از Whitelist به جای Blacklist.

به بیان ساده Blacklist یعنی فیلتر کردن موارد غیر قابل قبول! که به مراتب تعداد این موارد خیلی بیشتر از قابل قبول هاست. اصلا ممکنه نتونید همه رو توی این لیست جا بدین و چیزهایی از قلم بیوفتن. پس هرگز سعی نکنید لیست از مواردی داشته باشید که برای app شما غیر قابل قبول هست(Blacklist) و به جای اون Whitelist بسازید.

- strict typing

اگر از عملگر == برای مقایسه استفاده میکنید مراقب باشید که PHP به علت تبدیل عجیب و غریبی که انجام میده ممکنه اسکریپت شما رو آسیب پذیر کنه. مثلا عدد 1 برابر هست با رشته 1 و خود 1 یعنی true! و... .(Type Hinting)

 - از الگوریتم های امنیتی/رمزنگاری من درآوردی خودت استفاده نکن!

تاکید میکنم، انجامش ندین! حتی اگر شما یک متخصص امنیت هستید. این موضوع یکی از علت های رایج خطاهای امنیتی به حساب میاد. چون زمان کمی برای بررسی نیاز داره. در عوض از کتابخانه های عمومی، مطمئن و آزمایش شده برای کارتون استفاده کنید.

- از اسکنر های امنیتی برای شناسایی حفره های امنیتی کدتون استفاده کنید.

- کلمه عبور خودتون رو با استفاده از توابع هش قدرتمند و مطمئن ذخیره کنید.

اطمینان حاصل کنید همیشه رمز عبور و یا اطلاعات حساس با استفاده از توابع هش قوی مثل bcrypt رمزنگاری شدن. هرگز از توابع ضعیفی مثل MD5 یا SHA1 استفاده نکنید.

Libsodium.

در php 7.2 یا نسخه های بالاتر کتابخانه رمزنگاری پیشرفته ای به نام Libsodium اضافه شده که پیشنهاد میکنم ازش استفاده کنید.

- برای کاربران سطوح دسترسی مشخصی تعریف کنید.

برا این کار میتونید از ACL یا RBAC استفاده کنید که قبلا داخل وبلاگ در موردش توضیح دادم.

- dependency های پروژه تون رو بروز نگه دارید.

اغلب پروژه های ما شامل وابستگی/dependency های خارجی هست. مثل ماژول ها و کتابخانه هایی که داخل گیت هاب وجود دارن. این بسیار مهمه که شما وابستگی های پروژه تون رو بروز نگه دارین. برای این کار میتونید از Composer به عنوان مدیریت وابستگی های پروژه استفاده کنید.

- از framework ها استفاده کنید.

framework ها با داشتن یک جامعه ی آماری بالا از توسعه دهندگان تونستن نواقص امنیتی خودشون رو پیدا و برطرف کنن. استفاده از اونها به شما برای کاهش خطرات امنیتی کمک میکنه.

- ویژگی و کتابخانه هایی که مدت زیادی هست ازشون استفاده نمیشه رو  از بین ببرید یا جایگزین کنید.

- هرگز خطاها رو در محیط عملیاتی نمایش ندین.

اگرچه نمایش خطاها در هنگام و محیط توسعه مفید هستن اما این کار در یک محیط عملیاتی خطرناکه و باعث سواستفاده میشه.

  - هنگام آپلود فایل پسوند های مجاز رو مشخص کنید.

آپلود فایل های غیر مجاز مثل یک فایل اجرایی داخل سرور باعث میشه شما در معرض خطر قرار بگیرید.

- منقضی کردن session

بعد از تغییراتی مثل تغییر رمز عبور یا خطاهای امنیتی لازم هست که session کاربر رو منقضی کنید.

- هرگز اطلاعات حساس رو در session ذخیره نکنید.

- اطلاعات حساس رو Cache نکنید.

- از Parameterized Query ها استفاده کنید.

برای جلوگیری از SQL injection، هرگز query خودتون رو با داده های خارجی(مثلا یک متغییر که با متد POST اون رو از کاربر دریافت کردین) به طور مستقیم الحاق نکید. و به جای اون از query های پارامتریک استفاده کنید. میتونید در این مورد از PDO کمک بگیرید.

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

- از ORM استفاده کنید.

در ادامه ی مورد قبلی باید بگم تا جای ممکن از ORM ها استفاده کنید. چون توسط بسیاری از توسعه دهندگان مورد بررسی و آزمایش قرار گرفته.

مطالعه بیشتر...

پیشنهاد

کتاب‌ها

کتاب الگوهای طراحی به بیان ساده(design patterns / دیزاین پترن)

در مهندسی نرم افزار، design patterns(الگوهای طراحی) راه حل‌های قابل استفاده برای مشکلاتی هستند که معمولاً در طراحی نرم‌افزار اتفاق می افتند.

طرح های از پیش ساخته شده‌ای که می‌توانید برای حل مشکلات آن‌ها را سفارشی کنید. شما نمی‌توانید یک الگو را با جستجو در stackoverflow پیدا و در برنامه خود کپی کنید. الگو ها یک قطعه کد خاص نیستند، مفاهیم کلی برای حل مشکلات خاص هستند. شما باید با درک این مفاهیم آن‌ها را در برنامه خود پیاده‌سازی کنید.

کتاب refactoring / ریفکتورینگ

Refactoring مجموعه‌ای از تکنیک‌هاست که به منظور اصلاح و بهبود کدهای قبلی بدون تغییر در عملکرد و رفتارشان جهت خوانایی، کارامدی و قابلیت نگهداری بیشتر انجام می‌شود.

در کتاب Refactoring اثر Martin Fowler نوشته شده: refactoring تکنیک مرتب/منظم سازی برای تجدید ساختار کد موجود است. تغییر ساختار داخلی کد بدون تغییر رفتار خارجی آن.

refactoring یک سرمایه‌گذاری و راه حلی برای مقابله با کد کثیف و بدهی فنی است که باعث کاهش هزینه‌های توسعه نرم‌افزار در آینده خواهد شد.

ارسال نظر