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)
- ۱.دشمن خود را بشناسید:
سیستمهایی که بر پایه ی PHP کار می کنند ، ممکن است با حملات مختلفی روبرو شوند. در اینجا به برخی از این حملات اشاره می کنیم:
- XXS – حملات تزریق کد یکی از موارد آسیب پذیری برنامه های تحت وب بر پایه ی PHP است که مهاجم از طریق آن می تواند اطلاعات کاربران را سرقت کند. شما می توانید با استفاده از پیکربندی Apache و فرمانهای ایمن تر PHP ( اعتبارسنجی اطلاعات همه ی کاربران ) از این حملات پیشگیری کنید.
- تزریق SQL – این مورد ، آسیبی به لایه ی database برنامه های PHP است. وقتی ورودی کاربر به درستی فیلتر و اعتبارسنجی نشود ، برنامه هر نوع فرمان SQL را اجرا خواهد کرد . شما می توانید با پیکربندی Apache و نوشتن کدهای امنیتی ( اعتبار سنجی و escaping ورودی کاربران ) از حملات تزریق SQL پیشگیری کنید. یکی از کارهای رایج در PHPاین است که قبل از ارسال پرس و جوی SQL پارامترهایی را که از عملکردهایی تحت عنوان mysql_real_escape_string() استفاده می کنند ، escape کنید.
کلاهبرداری
- آپلود فایل _ در این حالت بازدید کننده ی سایت شما اجازه دارد که فایلهایی را روی سرور مجازی شما آپلود کند. این امر می تواند منجر به بروز مشکلات امنیتی مانند حذف فایلهای شما ، حذف database ، دسترسی به اطلاعات دقیق کاربران شما و … شود. شما می توانید با استفاده از PHP و کدهای امنیتی ( اعتبارسنجی ورودی کاربران و برقراری امکان آپلود تنها برای فایلهای تصویری png یا gif )از این امر پیشگیری کنید.
- ضمیمیه کردن فایلlocal و remote _ مهاجم می تواند فایلهایی را از یک سرور دیگر باز کرده و هر نوع کد PHPرا اجرا کند. در این حالت مهاجم می تواند فایلی را آپلود کند ، حذف کند و یا فایلهای مخفی را بر روی سرور شما نصب کند. شما می توانید با پیکربندی PHP ، اجرای فایلهای remote را غیرفعال کنید.
- eval()_ ارزیابی یک زنجیره از کدهای PHP ، این حالت اغلب برای این استفاده می شود که مهاجم ، کدها و ابزارش را در داخل خود سرور شما مخفی کند. شما با پیکربندی PHP می توانید eval() را غیر فعال کنید.
- f)Sea-surf Attack _ (Cross-site request forgery – CSRF) _ این حمله کاربر قانونی سیستم را وامی دارد که در آن سیستم فرمانهای ناخواسته را اجرا کند. اگر این حمله به ضورت موفق انجام شود ، می تواند اطلاعات کاربر مذکور و همچنین عملیاتی را که به عنوان یک کاربر معمولی و عادی انجام می دهد ، به خطر بیندازد. و اگر این کاربر ، ادمین سیستم باشد ، کل برنامه به خطر خواهد افتاد.
اقدامات امنیتی
- ۲٫ماژولهای موجود در 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
- ۳.افشای اطلاعات 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 نصب کنید. اقدامات امنیتی