phpآموزشامنیتبرنامه نویسی

10 راهکار برای بهبود امنیت PHP

10 راهکار برای بهبود امنیت PHP

پس از آغاز به کار PHP در سال 1994، طولی نکشید که این زبان به الگوی تعامل پایگاه داده تبدیل شد و چارچوبی را ایجاد کرد که در آن کاربران قادر به توسعه برنامه های وب پویا از طریق یک سرور باشند. PHP یک زبان برنامه نویسی سمت سرور است که می تواند برای ایجاد صفحات وب استاتیک به معنای پویایی تر باشد به این معنا که بتواند عملیات منطقی را در باطن سرور انجام دهد و براساس آن نتایج را برگرداند. امروز میخواهیم 10 نکته رو با هم مرور کنیم که امنیت PHP ما را بیشتر می کند و برای هر برنامه نویس لازم است که این نکات را رعایت کنند:

  1. امنیت جلسات PHP
  2. غیر فعال کردن خطاهای صفحه نمایش
  3. محدود کردن آپلودها
  4. غیرفعال کردن عملکردهای حساس در PHP
  5. غیرفعال کردن perm_url_fopen
  6. غیرفعال کردن Magic_quotes
  7. غیرفعال کردن Register_globals
  8. غیرفعال کردن use_trans_sid
  9. استفاده از فایل صحیح php.ini
  10. تجزیه و تحلیل PHP با استفاده از “PhpSecInfo”
امنیت PHP
امنیت PHP

1. امنیت جلسات PHP

همه وب سایت های پویا همیشه دارای نوعی اطلاعات حساس هستند که برای اطمینان داشتن از عدم سوء استفاده به دلیل مسائل مرتبط با جلسه، باید دارای وصله شوند.

برای حفظ امنیت جلسه چند کار وجود دارد:

  • هنگام تأیید اعتبار کاربران یا انجام عملیات حساس، از SSL استفاده کنید.
  • هر زمان که سطح امنیتی تغییر می کند، شناسه جلسه را بازسازی کنید (مانند ورود به سیستم).
  • وقت جلسه را بعد از یک بازه ثابت اختصاص دهید.
  • ثبت نام ها را محدود کنید.
  • جزئیات تأیید اعتبار را در سرور ذخیره کنید(یعنی جزئیاتی مانند نام کاربری را در کوکی ارسال نکنید).
  • [$ _SERVER [“HTTP_USER_AGENT” را بررسی کنید.
  • دسترسی به جلسات را روی سیستم خاموش کنید یا از هندلینگ جلسه سفارشی استفاده کنید.
  • برای انجام عملیات حساس به سیستم وارد شوید.

علاوه بر این، فقط دو حمله مهم جلسه وجود دارد:

الف) حملات تثبیت جلسه

با استفاده از session_regenerate_id () می توان از این کار جلوگیری کرد.

ب) حملات ربودن جلسه

با استفاده از گواهینامه های SSL می توان از این حملات جلوگیری کرد.

علاوه بر این، دو گزینه مهم دیگر پیکربندی برای تغییر wrt به SESSION عبارتند از:

  • session.cookie_httponly باید روی 1 تنظیم شود.
    • این به مرورگر کاربر می گوید که کوکی را در دسترس Javascript قرار ندهد تا حمله XSS را محدود کند.
  • session.cookie_secure باید روی 1 تنظیم شود.
    • این به مرورگر کاربر می گوید کوکی را به هیچ وجه ارسال نکنید مگر اینکه HTTPS باشد.

2. غیرفعال کردن خطاهای صفحه نمایش

دو روش برای مشاهده خطاهای PHP وجود دارد. شما می توانید خطاها را مستقیماً در وب سایت خود نمایش دهید (قابل مشاهده از هر مرورگر وب) که بسیار خطرناک است یا ثبت خطا در یک پرونده مشخص (قابل مشاهده در یک فایل متنی).

در این مقاله نحوه خاموش کردن display_errors را با ویرایش فایل PHP.ini خواهیم آموخت. همچنین چگونگی تنظیم گزارش خطا، پیکربندی خطاهای ورود به سیستم و استفاده از عملکرد ini_set () برای کمک به عیب یابی خطاهای PHP را یاد میگیریم.

ابتدا پرونده php.ini را باز کنید و گزینه های زیر را تنظیم کنید:

display_errors = Off
log_errors = On

همچنین در پرونده های httpd.conf یا .htaccess Apache، با تنظیمات زیر میتوانید تمامی خطاهای PHP را غیرفعال کنید:

php_flag display_errors Off
php_flag log_errors On

توجه: Display_errors باید غیرفعال شود و تمام پیام های خطا باید با استفاده از بخشنامه log_errors به ​​پرونده های سیستم ارسال شوند ، بنابراین این دستورالعمل باید روشن شود.

علاوه بر این ، اگر از هاست مبتنی بر CPANEL استفاده می کنید ، می توانید با پیمایش گزینه پیکربندی PHP ، همانطور که در شکل زیر مشاهده می کنید ، تمام خطاهای صفحه نمایش را از خود CPANEL بگردانید:

PHP error 1024x577 - 10 راهکار برای بهبود امنیت PHP

3. محدود کردن بارگذاری پرونده ها

اگر شما از فرمت های مختلف فایل ها برای بارگزاری استفاده نمیکنید، بهتر است که آنها را غیر فعال کنید. هکرها می توانند با بارگذاری اسکریپت های مخرب پی اچ پی به راحتی از عملکرد بارگذاری پرونده سوء استفاده کنند و به سرعت به برنامه وب شما نفوذ کنند.

برای غیرفعال کردن این قابلیت، پرونده php.ini را ویرایش کنید و مطابق شکل زیر ، دستورالعمل file_uploads را تنظیم کنید:

file_uploads = off

همچنین اگر از کنترل بارگذاری فایل استفاده می کنید، اطمینان حاصل کنید که باید فهرست دایرکتوری موقت پیش فرض مورد استفاده برای بارگذاری پرونده را تغییر دهید که با ویرایش همان پرونده به راحتی قابل تغییر است:

upload_tmp_dir = /var/php_tmp

همچنین با تنظیم کنترل زیر می توانید اندازه پرونده هایی را که می توانید بارگیری کنید محدود کنید:

upload_max_filesize = 10M

برای اطمینان از عملکرد صحیح آپلودهای پرونده، دستورالعمل post_max_size باید کمی بزرگتر از upload_max_filesize باشد. به عنوان مثال ، تنظیمات زیر نحوه تنظیم حد بارگذاری پرونده را به 10 مگابایت نشان می دهد:

upload_max_filesize = 10M
post_max_size = 16M

پس از تغییر پرونده php.ini، اطمینان حاصل کنید که باید با تایپ دستور ” service apache2 restart ” سرویس دهنده Apache خود را مجدداً راه اندازی کنید.

4- غیرفعال کردن عملکردهای حساس در PHP

همانطور که میدانید توابع زبان php زیاد است که در صورت عدم تنظیم صحیح، می توان از آنها برای هک کردن سرور استفاده کرد. چند کارکرد خطرناک عبارتند از: exec () ، passthru () ، shell_exec () و غیره که با ویرایش پرونده php.ini با دستور غیرفعال کردن آسان می توانید به راحتی غیرفعال کنید.

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

برای انجام این کار ، فایل php.ini را با هر ویرایشگر متن مانند Notepad ++ ، Vim (در صورت لینوکسی بودن سیستم عاملتون) باز کنید و لیست جدید را به شرح زیر تنظیم کنید:

disable_functions = exec, passthru, shell_exec, system, proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_source

بعد از ذخیره php.ini، سرور Apache را با نوشتن service apache2 restart (اگر سرور لینوکسی است) مجدداً راه اندازی کنید.

5. غیرفعال کردن perm_url_fopen

این بخشنامه به توابع فایل PHP اجازه می دهد تا داده ها را از مکان هایی مانند FTP یا HTTP بازیابی کنید.

اگر یک مهاجم بتواند آرگومان های مربوط به آن عملکردها را دستکاری کند، می تواند از URL تحت عنوان خود به عنوان آرگومان استفاده کند و اسکریپت های از راه دور خود را که به اصطلاح Remote پرونده از راه دور (RFI) استفاده می شود ، اجرا کند. این بخشنامه اجازه می دهد تا توابع include() و require() شود و به بارگیری و اجرای کد از URL های از راه دور که سایت شما را در معرض خطر قرار می دهد نیاز دارد.

برای غیرفعال کردن این بخشنامه ، عملکرد زیر را با ویرایش پرونده php.ini مطابق شکل زیر خاموش کنید.

allow_url_fopen = Off

با عملکرد file_get_contents($_POST[‘url’]);، هکر می تواند به راحتی به جای URL مسیری را طی کند و به پرونده های سرور شما دسترسی داشته باشد.

همین تنظیم را می توانید در پرونده httpd.conf Apache نیز اعمال کنید:

php_admin_flag allow_url_fopen Off

تعداد زیادی از آسیب پذیری های تزریق کد گزارش شده در برنامه های وب PHP به دلیل فعال کردن allow_url_fopen و فیلتر ورودی بد به وجود می ایند. شما همیشه باید این بخشنامه را به دلایل امنیتی غیرفعال کنید.

6. غیرفعال کردن Magic_quotes

این بخشنامه فقط در سطح سیستم غیرفعال می شود. گزینه Magic_quotes_gpc برای محافظت از سرورها در برابر حملات تزریق SQL معرفی شده است. این برنامه به طور موثری addslashes() را بر روی تمام اطلاعات دریافت شده از طریق GET ، POST یا COOKIE اجرا می کند.

به عنوان مثال ، اگر یک کاربر “hello kaliboys” را در فرم HTML تایپ کند، PHP بصورت خودکار از نقل قول ها فرار می کند و مقدار را به عنوان “hello yeahhub” ذخیره می کند.

برای غیرفعال کردن این گزینه:

magic_quotes_gpc = Off

همین تنظیم را می توانید در پرونده httpd.conf یا .htaccess Apache نیز اعمال کنید:

php_flag magic_quotes_gpc Off

در صورت بروز خطای 500 سرور داخلی ، باید تنظیمات فوق را در ابتدای فایل php قرار دهید:

ini_set (‘magic_quotes_gpc’, 1);

برای تأیید فعال بودن این تنظیمات ، یک فایل تست PHP ایجاد کنید که کد زیر را در همان دایرکتوری که فایل .htaccess در آن قرار دارد، ایجاد کنید:

<?php phpinfo(); ?>

7. غیرفعال کردن Register_globals

دستورالعمل Register_globals به طور پیش فرض غیرفعال است. شما باید از پیامدهای امنیتی در فعال کردن بخشنامه Register_globals آگاه باشید.

توجه: این ویژگی از PHP 5.3.0 و PHP 5.4.0 حذف شده است.

Register_globals یک تنظیمات PHP داخلی است که عناصر آرایه $ _REQUEST را به عنوان متغیر ثبت می کند. اگر مقدار را از طریق فرم، POST یا GET ارسال کنید ، مقدار آن ورودی به طور خودکار از طریق متغیر موجود در اسکریپت PHP ، به نام نام ورودی وارد می شود.

برای غیرفعال کردن این دستورالعمل ، پرونده php.ini را ویرایش کنید و دستورالعمل زیر را برای خاموش کردن آن تنظیم کنید.

register_globals = Off

برای وب سرور Apache ، از دستورالعمل php_flag در یک پرونده .htaccess استفاده کنید تا ثبت جهانی در یک دایرکتوری را غیرفعال کنید.

php_flag register_globals Off

اگر از PHP به عنوان ماژول آپاچی استفاده می کنید، می توانید دستورالعمل زیر را در پرونده htaccess (یا httpd.conf) قرار دهید، که محدود به پرونده یا پرونده های مورد نظر شماست:

<FilesMatch “^foo\.php$”>
php_flag register_globals Off
</FilesMatch>

8. غیرفعال کردن use_trans_sid

زمانی که use_trans_sid روش است، php شناسه جلسه را از طریق URL منتقل می کند. این باعث می شود برنامه در مقابل حملات ربودن جلسه آسیب پذیر شود.

ربودن جلسه اساساً نوعی سرقت هویت است که در آن هکر با سرقت شناسه جلسه خود ، یک کاربر قانونی را جعل می کند. هنگامی که نشانه جلسه در یک کوکی منتقل می شود و درخواست در یک کانال امن انجام می شود (یعنی از SSL استفاده می کند) ، رمز آن امن است.

در واقعیت ، این باعث می شود تا آن دسته از کاربران که از جلسات خود توسط هر کسی که ممکن است ربوده شود ، آسیب پذیر باشند:

  • URL را روی شانه کاربر مشاهده کنید
  • URL توسط کاربر ارسال می شود
  • URL را از سابقه مرورگر بازیابی کنید

می توانید به راحتی با ویرایش پرونده php.ini یا پرونده .htaccess به شرح زیر این گزینه را غیرفعال کنید:

با پرونده php.ini

session.use_trans_sid = ‘off’

با پرونده .htaccess

php_flag session.use_trans_sid off

9. از فایل صحیح php.ini استفاده کنید

تنظیم یک فایل php.ini یک فرایند نسبتاً ساده است. به طور خلاصه ، فایل php.ini به شما امکان می دهد تنظیمات روی سرور را به طور خاص برای حساب خود تنظیم کنید.

در زمان واقعی ، می توانید کارهای زیادی با پرونده php.ini انجام دهید مانند افزایش حداکثر اندازه بارگذاری پرونده یا افزایش حد مجاز حافظه و غیره.

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

سریعترین راه برای پیدا کردن مسیر در php.ini استفاده از دستور ” locate” است ، اما همانطور که گفتیم ، معمولاً چندین پرونده php.ini درون یک سرور وجود دارد ، و بنابراین این گزینه فقط ارزش یادآوری مسیر را دارد.

مسیر مطلق فایل php.ini برای سرور لینوکس:

/etc/php5/apache2/php.ini

راه دیگر برای یافتن پرونده php.ini استفاده از تابع PHPInfo() برای تعیین محل خواندن پیکربندی php.ini خواهد بود.

علاوه بر این ، می توانید از ویژگی grep نیز برای یافتن پرونده php.ini استفاده کنید ، همانطور که در دستور زیر نشان داده شده است:

Command: php -i |grep php.ini

هر PHP دارای دو مجموعه php.ini است: php.ini-production  و php.ini-development. در مورد توابع زیر برای هر دو مجموعه php.ini دقت کنید:

  • short_open_tag
  • disable_functions
  • memory_limit
  • session.gc_probability
  • display_startup_errors
  • track_errors
  • error_reporting

10. تجزیه و تحلیل PHP با استفاده از “PhpSecInfo”

PhpSecInfo معادل عملکرد phpinfo () را ارائه می دهد که اطلاعات امنیتی را درباره محیط PHP گزارش می دهد و پیشنهادهایی را برای بهبود ارائه می دهد. این جایگزینی برای تکنیک های توسعه ایمن نیست و هیچ نوع ممیزی از کد یا برنامه را انجام نمی دهد ، اما می تواند یک ابزار مفید در یک رویکرد امنیتی چند لایه باشد.

یوسف وفایی

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

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

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


دکمه بازگشت به بالا