php را امن امن کنید

برای امن کردن php به جز رعایت برنامه نویسی امن، باید فایل php.ini رو هم تنظیم کنیم. من تو این مقاله مهمترین تظیمات رو بهتون توضیح میدم، برای مطالعه بیشتر درباره این تنظیمات میتویند به سایت خوب phpsec و سایت مرجع OWASP هم مراجعه کنید.

توضیحات:

در تمامی تنظیمات که مقدار بولین قبول میکنن مقادیر On,Yes,True,0 با هم برابر هستند و مقادیر ۱,Off,No,False نیز همینطور و بودن یا نبودن کوتیشن یا آپستروف نیز الزامی نیستش.

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

برای نمونه اگه تیک Remember me رو تو صفحات ورود سایت ها بزنید همین cookie رو ایجاد میکنه سپس برای دفعه بعد که سایت رو باز کردید مرورگر این cookie رو به سرور میفرسته بعد سرور محتویات رو چک میکنه و میفهمه که شما هستید و شما رو خودکار login میکنه.

session یک فایل هست که یه id داره و هر بار که یک سایت رو باز میکنید یک session برای شما تو سرور ایجاد میشه و همراه با اون یک cookie هم در سیستم ای که سایت رو باز کرده ایجاد میشه که محتوی id اون session هست.

من تمام مطالب رو تو این مقاله نگفتم و حتمن این مقاله ادامه دار خواهد بود.

خوب بریم سر اصل مطلب. برای اینکه ببینید php از کدوم فایل ini استفاده میکنه دستور زیر رو بزنید

حالا باید ببینید مقدار Loaded Configuration File چی هست، البته الان چون تو محیط cli اینکارو میکنید Loaded Configuration File هم برای همین محیط هست نه آپاچی پس باید فایل مناسب رو پیدا کنید همچنین میتونید با دستور locate و یا find هم فایلهای php.ini رو پیدا کنید

(دستور locate بر مبنای پایگاه داده خودش از فایلها، جستجو رو انجام میده به همین خاطر باید با دستور updatebd پایگاه داده اون رو به روز کنیم هر چند وقت یکبار)

برای من اینجا هست

خوب شروع میکنیم:

session.use_cookies

برای ذخیره session، ار cookie هم استفاده بشه که باید مقدار ۱ داشته باشه یعنی استفاده بشه با این تغییر در برابر حملات session hijacking مقاومتر میشید.

session.use_only_cookies

فقط از cookie برای ذخیره id ی session استفاده بشه اگه مقدار این تنظیم رو برای ۱ قرار بدیم میتونیم از حملات sesson fixation و session hijacking هم در امان بمونیم.

session.cookie_httponly

 با ۱ قرار دادن این تنظیم، دسترسی جاوا اسکریپت به cookie ها رو از بین می بریم.

session.hash_function

 الگوریتم هشینگ session رو مشخص میکنید که بهتره یکی از اینا باشه: sha224, sha256, sha384, sha512.

session.save_path

مسیر ذخیره cookie ی session هست که بهتر مسیرش خارج از پوشه سایتتون باشه تا در صورت اینکه به این پوشه نفوذ شد سایتتون deface نشه یا خرابی بیشتری به بار نیاد.

session.cookie_secure

 اگه مقدارش برابر ۱ باشه cookie ها رو فقط زمانی که پروتکل ssl قعال باشه ایجاد میکنه پس اگه ssl ندارید بزارید ۰ بمونه.

session.entropy_file

برای اینکه id برای session ها ایجاد بشه باید یه سری کاراکترهای تصادفی استفاده بشه و یک منبع خوب برای این کار لازم داریم که اعداد کاملن تصادفی و غیر قابل پیش بینی باشن تو لینوکس /dev/urandom عالیه.

session.use_strict_mode

مقدارش رو برابر ۱ قرار بدید تا از ایجاد session ها بوسیله id جلوگیری بشه. همونطور که میدونید با استفاده از GET و POST هم میشه session ایجاد کرد و اون رو هم خوند، اگه id اون رو داشته باشیم مثل bestical.rocks?PHPSESSID=zxcvbnm. اگه مقدار این تنظیم رو برای ۱ قرار بدیم میتونیم از حملات sesson fixation هم در امان بمونیم.

session.name

مقدار پیش فرض برای cookie هایی هست که برای نگه داری session ها ایجاد میشن هر اسمی دوست دارید میتونید بزارید فقط PHPSESSID نباشه.

allow_url_include, allow_url_fopen

اگه مقدارش برابر ۱ باشه امکان دسترسی php به فایلهای ریموت و خارج سرور رو صادر میکنید برای مثال اگه نقطه نفوذی تو سایتتون باشه که هکر بتونه کد خطرناکی اجرا کنه،اونموقع اگه این تنطیم ۱ باشه هکر میتونه کدی اجرا کنه که با دریافت یک فایل دیگه از یه سرور دیگه کاملن کنترل سرورتون رو در دست بگیره. بهتره که ۰ باشه البته.

expose_php

نمایش نسخه php در پاسخ درخواست ها، وقتی با مرورگر صفحه رو ببینید تو هدر پاسخ،  پس مقدارش رو ۰ بزارید.

open_basedir

اگه مقداری داشته باشه تمامی عملیات مربوط به دسترسی php به فایلها مثل fopen,include,file_get_contents تنها محدود به همین دایرکتوری هایی میشه که اینجا تنظیم شده و میتونید با ‘:’ دایرکتوری ها رو از هم جدا کنید، همچنین از طریق Apache هم میشه به این صورت که کد زیر رو باید تو virtual host وارد کنید

حتمن از php_admin_value استفاده کنید نه php_value چون در این صورت دیگه امکان override شدنش تو یه فایل htaccess دیگه از بین میره.

یادتون باشه که این محدودیت فقط در سطح فایل هست نه سوکت یعنی mysql که از سوکت استفاده میکنه میتونه با دستور LOAD DATA INFILE به همه فایها دسترسی داشته باشه که تو این پست دوستمون اشتباه متوجه شدن این مورد رو و فکر کرده که این تنظیم مشکل داره. البته شما میتونید با محدود کردن دسترسی کاربر mysql این مشکل رو هم تا حدود زیادی رفع کنید.

post_max_size

حداکثر حجمی که در هر بار ارسال اطلاعات از طریق POST به وسیله فرم مجاز هست.بهتره خیلی بالا نزارید تا دچار حملات DOS یا DDOS نشید.

upload_max_filesize

نهایت حجم مجاز هر فایل برای اینکه آپلود بشه، یادتون باشه تو هر فرم هر چند تا فایل داشته باشید اگه در این مقدار ضرب کنید هرچقدر شد یکمی بهش اضافه کنید (مثلن ۱ مگابایت به خاطر اینکه هدر فایلها هم تو post حساب میشه) و اون عدد رو مقدار post_max_size قرار بدید. بهتره نهایت حجم مجاز برای هر فایل برای آپلود شدن رو خیلی بالا نزارید تا دچار حملات DOS یا DDOS نشید.

memory_limit

مقدار حافظه مصرفی مجاز برای هر کد. این مقدار رو هم از مقدار post_max_size بیشتر بزارید تا مشکلی پیش نیاد.بهتره خیلی بالا نزارید تا دچار حملات DOS یا DDOS نشید.

disable_functions

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

البته ممکن هست بعضی از این توابع تو سایتتون در حال استفاده باشه که در اینصورت باید از این لیست برشون دارید. توصیه میشه برای این تنظیم اینها رو وارد کنید که اینجا هم توضیح داده

یه سری تنظیمات دیگه هم هستند ولی به صورت پیشفرض یا مقدارشون امن انتخاب شده یا کلن منسوخ شدن مثل موارد زیر که همشون باید ۰ باشه.

کتابخونه  iniscan  هم به صورت اتوماتیک این بررسی ها رو انجام میده، با کد زیر میتونید اون رو نصب کنید

بعد به پوشه vendor/bin برید و دستور زیر رو بزنید و یادتون باشه آدرس php.ini خودتون رو وارد کنید اینجا:

بعد از ایجاد تغییرات دستور زیر رو بزنید تا تغییرات اعمال بشن

امیدوارم همیشه امن امن باشید!!!

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *