اقدامات امنیتی مناسب در PHP

PHP یک زبان برنامه نویسی Open-source برای سرور هاست که به صورت گسترده مورد استفاده قرار می گیرد. سرورهای Apache/Nginx/Lighttpd برای دستیابی به فایلها و محتوای وب از پروتکل های HTTP یا HTTPS استفاده می کنند. استفاده از یک زبان برنامه نویسی نامناسب می تواند سبب بروز مشکلات مختلف شود ، بنابراین باید با احتیاط از PHP استفاده کرد. به همین دلیل نوین هاست تلاش می کند تا لیستی از بهترین اقدامات ممکن برای استفاده ی ایمن از PHP را در اختیار ادمینهای محترم بگذارد. اقدامات امنیتی

SYS Admin

نمونه ای از تنظیمات امنیتی PHP

  • DocumentRoot: /var/www/html
  • Default Web server: Apache

(می توانید به جای Apache از Lighttpd یا Ngin استفاده کنید. )

  • Default PHP configuration file: /etc/php.ini or /etc/php/7.0/fpm/php.ini
  • Default PHP extensions config directory: /etc/php.d/ OR /etc/php/7.0/fpm/conf.d/
  • نمونه ی فایل پیکربندی امنیتی ما:     /etc/php.d/security.ini   یا /etc/php/7.0/fpm/conf.d/99-security.conf ( لازم است این فایل را با استفاده از ویرایشگر متن ایجاد کنید )
  • سیستم عامل : RHEL / CentOS / Fedora Linux ( دستورات نوشته شده باید با هر نوع دیگر Linux مانند Debian / Ubuntu یا سیستم های Unix مانند OpenBSD/FreeBSD/HP-UX).   نیز کار کند.
  • Default PHP server TCP/UDP ports: none

نکته: بیشتر اقدامات ذکر شده بر این فرض هستند که کاربر اصلی سیستم از پوسته ی bash یا دیگر پوسته های جدید استفاده می کند:         $ php –v

نمونه ی خروجی :

PHP 5.3.3 (cli) (built: Oct 24 2011 08:35:41)

Copyright (c) 1997-2010 The PHP Group

Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

یا

PHP 7.0.22-0ubuntu0.16.04.1 (cli) ( NTS )

Copyright (c) 1997-2017 The PHP Group

Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies

   with Zend OPcache v7.0.22-0ubuntu0.16.04.1, Copyright (c) 1999-2017, by Zend Technologies

برای نشان دادن هدف از سیستم عامل زیر استفاده می کنم:

$ cat /etc/redhat-release

نمونه ی خروجی:

Red Hat Enterprise Linux Server release 6.1 (Santiago)

  1. ۱.دشمن خود را بشناسید:

سیستمهایی که بر پایه ی PHP کار می کنند ، ممکن است با حملات مختلفی روبرو شوند. در اینجا به برخی از این حملات اشاره می کنیم:

  1. XXS – حملات تزریق کد یکی از موارد آسیب پذیری برنامه های تحت وب بر پایه ی PHP است که مهاجم از طریق آن می تواند اطلاعات کاربران را سرقت کند. شما می توانید با استفاده از پیکربندی Apache و فرمانهای ایمن تر PHP ( اعتبارسنجی اطلاعات همه ی کاربران ) از این حملات پیشگیری کنید.
  2. تزریق SQL – این مورد ، آسیبی به لایه ی database برنامه های PHP است. وقتی ورودی کاربر به درستی فیلتر و اعتبارسنجی نشود ، برنامه هر نوع فرمان SQL را اجرا خواهد کرد . شما می توانید با پیکربندی Apache و نوشتن کدهای امنیتی ( اعتبار سنجی و escaping ورودی کاربران ) از حملات تزریق SQL پیشگیری کنید. یکی از کارهای رایج در PHPاین است که قبل از ارسال پرس و جوی SQL پارامترهایی را که از عملکردهایی تحت عنوان mysql_real_escape_string() استفاده می کنند ، escape کنید.

کلاهبرداری

  1. آپلود فایل _ در این حالت بازدید کننده ی سایت شما اجازه دارد که فایلهایی را روی سرور مجازی شما آپلود کند. این امر می تواند منجر به بروز مشکلات امنیتی مانند حذف فایلهای شما ، حذف database ، دسترسی به اطلاعات دقیق کاربران شما و … شود. شما می توانید با استفاده از PHP و کدهای امنیتی ( اعتبارسنجی ورودی کاربران و برقراری امکان آپلود تنها برای فایلهای تصویری png یا gif )از این امر پیشگیری کنید.
  2. ضمیمیه کردن فایلlocal و remote _ مهاجم می تواند فایلهایی را از یک سرور دیگر باز کرده و هر نوع کد PHPرا اجرا کند. در این حالت مهاجم می تواند فایلی را آپلود کند ، حذف کند و یا فایلهای مخفی را بر روی سرور شما نصب کند. شما می توانید با پیکربندی PHP ، اجرای فایلهای remote را غیرفعال کنید.
  3. eval()_ ارزیابی یک زنجیره از کدهای PHP ، این حالت اغلب برای این استفاده می شود که مهاجم ، کدها و ابزارش را در داخل خود سرور شما مخفی کند. شما با پیکربندی PHP می توانید eval() را غیر فعال کنید.
  4. f)Sea-surf Attack _ (Cross-site request forgery – CSRF) _ این حمله کاربر قانونی سیستم را وامی دارد که در آن سیستم فرمانهای ناخواسته را اجرا کند. اگر این حمله به ضورت موفق انجام شود ، می تواند اطلاعات کاربر مذکور و همچنین عملیاتی را که به عنوان یک کاربر معمولی و عادی انجام می دهد ، به خطر بیندازد. و اگر این کاربر ، ادمین سیستم باشد ، کل برنامه به خطر خواهد افتاد.

اقدامات امنیتی

  1. ۲٫ماژولهای موجود در PHPرا بیابید:

برای مشاهده ی انواع ماژولهای موجود در PHP دستور زیر را اجرا کنید: اقدامات امنیتی

# php –m

نمونه ی خروجی :

[PHP Modules]

apc

bcmath

bz2

calendar

Core

ctype

curl

date

dom

ereg

exif

fileinfo

filter

ftp

gd

gettext

gmp

hash

iconv

imap

json

libxml

mbstring

memcache

mysql

mysqli

openssl

pcntl

pcre

PDO

pdo_mysql

pdo_sqlite

Phar

readline

Reflection

session

shmop

SimpleXML

sockets

SPL

sqlite3

standard

suhosin

tokenizer

wddx

xml

xmlreader

xmlrpc

xmlwriter

xsl

zip

zlib

[Zend Modules]

Suhosin

توصیه می کنم برای امنیت و عملکرد بهتر از PHP با ماژولهای کمتر استفاده کنید. مثلاً می توانید ماژول Sqlite3 را با استفاده از دستور deleting (removing) configuration file , حذف کنید و یا مانند روش زیر نام آن را با استفاده از renaming (moving) a file به /etc/php.d/sqlite 3.ini تغییر دهید:

# rm /etc/php.d/sqlite3.ini

یا

# mv /etc/php.d/sqlite3.ini /etc/php.d/sqlite3.disable

سایر ماژولهای موجود در PHP را فقط با نصب دوباره ی PHP با پیکربندی کوچک شده ، حذف کرد. می توانید کدهای اصلی PHP را از PHP.net دانلود کنید و آنها را به روش زیر با GD, fastcgi و با پشتیبانی MySQL یکی کنید:

./configure –with-libdir=lib64 –with-gd –with-mysql –prefix=/usr –exec-prefix=/usr \

–bindir=/usr/bin –sbindir=/usr/sbin –sysconfdir=/etc –datadir=/usr/share \

–includedir=/usr/include –libexecdir=/usr/libexec –localstatedir=/var \

–sharedstatedir=/usr/com –mandir=/usr/share/man –infodir=/usr/share/info \

–cache-file=../config.cache –with-config-file-path=/etc \

–with-config-file-scan-dir=/etc/php.d –enable-fastcgi \

–enable-force-cgi-redirect

  1. ۳.افشای اطلاعات PHP را محدود کنید.

برای محدود کردن افشای اطلاعات PHP ، expose_php. را غیرفعال کنید ، /etc/php.d/secutity.ini را ویرایش کنید و دستور زیر را وارد کنید:

expose_php=Off

زمانی که expose_php فعال باشد ، به تمام جهان اعلام می کند که PHP نصب شده بر روی سرور نسخه ای از PHP با سربرگ HTTP است (e.g., X-Powered-By: PHP/5.3.3) . شناسه های منحصر به فرد لوگوی PHP هم آشکار می شوند و بنابراین ، الحاق این شناسه ها به URL خاص PHP ،سایت را قادر به نمایش لوگوی مناسب می کند. زمانی که expose_php   فعال است ، می توانید با استفاده از دستور زیر ، نسخه ی PHP را مشاهده کنید:

$ curl -I https://www.cyberciti.biz/index.php

نمونه ی خروجی:

HTTP/1.1 200 OK

X-Powered-By: PHP/5.3.3

Content-type: text/html; charset=UTF-8

Vary: Accept-Encoding, Cookie

X-Vary-Options: Accept-Encoding;list-contains=gzip,Cookie;string-contains=wikiToken;string-contains=wikiLoggedOut;string-contains=wiki_session

Last-Modified: Thu, 03 Nov 2011 22:32:55 GMT

همچنین توصیه می کنم که برای مخفی کردن ورژن Apache و سایر اطلاعات، دستورالعملهای ServerTokens و Server Signature را در قالب httpd.conf نصب کنید. اقدامات امنیتی

نظر

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