PHP是一种开源服务器端脚本语言,应用很普遍。Apache web服务器提供了这种便利:经过HTTP或HTTPS协议,访问文件和内容。配置不当的服务器端脚本语言会带来各类各样的问题。因此,使用php时要当心。如下是25个PHP安全方面的最佳实践。css
为PHP安全提示而提供的示例环境html
文件根目录(DocumentRoot):/var/www/htmlmysql
默认的Web服务器:Apache(可使用Lighttpd或Nginx来取代Apache)linux
默认的PHP配置文件:/etc/php.ininginx
默认的PHP加载模块配置目录:/etc/php.d/web
咱们的示例php安全配置文件:/etc/php.d/security.ini(须要使用文本编辑器来建立该文件)sql
操做系统:RHEL/CentOS/FedoraLinux(相关指令应该与Debian/Ubuntu等其余任何Linux发行版或者OpenBSD/FreeBSD/HP-UX等其余相似Unix的操做系统兼容)。shell
默认的php服务器TCP/UDP端口:无数据库
为本文所列的大多数操做编写代码时,假定它们将由运行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
出于演示的用途,我会使用如下操做系统:
$cat/etc/redhat-release
示例输出:
Red HatEnterprise Linux Server release 6.1 (Santiago)
第1个最佳实践:了解你的对手
基于PHP的应用程序面临不一样类型的攻击。我注意到了几种不一样类型的攻击:
XSS:跨站脚本是Web PHP应用程序中的一种安全漏洞,攻击者能够利用该漏洞来窃取用户的信息。你能够配置Apache,编写更安全的PHP脚本(验证全部的用户输入),以免XSS攻击。
SQL注入攻击:这是PHP应用程序的数据库层中的安全漏洞。用户输入不正确地过滤时,应用程序就能执行任何SQL语句。你能够配置Apache,编写安全代码(验证和转换全部的用户输入),以免SQL注入攻击。PHP中的一个常见作法是,在发送SQL查询以前,使用名为mysql_real_escape_string()的函数,转换参数。
文件上传:它让访客能够将文件放在(将文件上传到)你的服务器上。这会带来众多安全问题,好比删除你的文件、删除数据库、获取用户详细资料,不一而足。你可使用php来禁用文件上传,或编写安全代码(好比验证用户输入,只容许PNG或GIF等图像文件类型)。
添加本地和远程文件:攻击者能够从远程服务器打开文件,执行任何PHP代码。这让他们得以上传文件、删除文件和安装后门。能够配置php以禁用远程文件执行功能。
eval() :将字符串做为PHP代码来进行评估。攻击者经常利用该函数来隐藏其在服务器自己上面的代码和工具。你能够配置PHP,禁用eval()。
sea-surf攻击(跨站请求伪造,CSRF):这种攻击迫使最终用户针对目前已验证其身份的Web应用程序执行有害的操做。若是是日常的用户,得逞的CSRF攻击会危及最终用户的数据和操做。但若是被盯上的最终用户使用管理员账户,这会危及整个Web应用程序。
第2个最佳实践:查找内置的PHP模块
想查看一组编译进去的PHP模块,请输入如下命令:
# php -m
我建议你使用模块数量减小的PHP,以加强性能和安全。好比说,你能够经过删除(移除)配置文件或者改名(或移动)一个名为/etc/php.d/sqlite3.ini的文件来禁用sqlite3模块,操做以下:
#rm/etc/php.d/sqlite3.ini
或者
#mv/etc/php.d/sqlite3.ini /etc/php.d/sqlite3.disable
其余编译进去的模块只能经过从新安装精简配置的PHP来移除。能够从php.net下载php源代码,而后按如下方法编译它,支持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,并从新安装到相似Unix的操做系统上(http://www.php.net/manual/en/install.unix.php),以了解更多信息。
第3个最佳实践:限制PHP信息泄露
要限制PHP信息泄露,就要禁用expose_php。编辑/etc/php.d/secutity.ini,执行如下指令:
expose_php=Off
启用后,expose_php向外界报告PHP安装在服务器上,这包括HTTP头里面的PHP版本(如X-Powered-By: PHP/5.3.3)。PHP标识的全局惟一标识符(GUID,见示例http://www.php.net/?=PHPE9568F34-D428-11d2-A769-00AA001ACF42)也显示出来,于是将它们添加到支持PHP的网站的URL后面,就会显示相应标识。expose_php启用后,你可使用如下命令,查看PHP版本:
$curl-I http://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
...
我还建议,你应在httpd.conf中执行ServerTokens和ServerSignature命令,隐藏Apache版本及其余信息(http://www.cyberciti.biz/faq/rhel-centos-hide-httpd-version/)。
第4个最佳实践:尽可能减小可装入的PHP模块(动态加载模块)
PHP支持“动态加载模块”(Dynamic Extensions)。默认状况下,RHEL装入/etc/php.d/目录里面的全部加载模块。要启用或禁用某一个模块,只要在/etc/php.d/目录中找到配置文件、为模块名称添加注释。你还能够改名或删除模块配置文件。想得到最佳的PHP性能和安全,你应该只启用Web应用程序须要的加载模块。好比说,要禁用gd加载模块,输入如下命令:
#cd/etc/php.d/
# mv gd.{ini,disable}
# /sbin/servicehttpd restart
要启用名为gd的php模块,请输入:
# mv gd.{disable,ini}
# /sbin/service httpd restart
第5个最佳实践:将全部PHP错误记入日志
别让PHP错误信息暴露在网站的全部访客面前。编辑/etc/php.d/security.ini,执行如下指令:
display_errors=Off
确保你将全部PHP错误记入到日志文件中(http://www.cyberciti.biz/tips/php-howto-turn-on-error-log-file.html):
log_errors=On
error_log=/var/log/httpd/php_scripts_error.log
第6个最佳实践:不容许上传文件
出于安全缘由,编辑/etc/php.d/security.ini,执行如下命令:
file_uploads=Off
若是使用你应用程序的用户须要上传文件,只要设置upload_max_filesize(http://www.cyberciti.biz/faq/linux-unix-apache-increase-php-upload-limit/),便可启用该功能,该设置限制了PHP容许经过上传的文件的最大值:
file_uploads=On
用户经过PHP上传的文件最大1MB
upload_max_filesize=1M
第7个最佳实践:关闭远程代码执行
若是启用,allow_url_fopen容许PHP的文件函数——如file_get_contents()、include语句和require语句——能够从远程地方(如ftp或网站)获取数据。
allow_url_fopen选项容许PHP的文件函数——如file_get_contents()、include语句和require语句——可使用FTP或HTTP协议,从远程地方获取数据。
编程员们经常忘了这一点,将用户提供的数据传送给这些函数时,没有进行适当的输入过滤,于是给代码注入安全漏洞留下了隐患。基于PHP的Web应用程序中存在的众多代码注入安全漏洞是由启用allow_url_fopen和糟糕的输入过滤共同引发的。编辑/etc/php.d/security.ini,执行如下指令:
allow_url_fopen=Off
出于安全缘由,我还建议禁用allow_url_include:
allow_url_include=Off
第8个最佳实践:启用SQL安全模式
编辑/etc/php.d/security.ini,执行如下指令:
sql.safe_mode=On
若是启用,mysql_connect()和mysql_pconnect()就忽视传送给它们的任何变量。请注意:你可能得对本身的代码做一些更改。sql.safe_mode启用后,第三方开源应用程序(如WorkdPress)及其余应用程序可能根本运行不了。我还建议你针对全部安装的php 5.3.x关闭magic_quotes_gpc(http://php.net/manual/en/security.magicquotes.php),由于它的过滤并不有效、不是很可靠。mysql_escape_string()和自定义过滤函数能起到更好的做用(向Eric Hansen致谢,https://www.facebook.com/EricHansen.SFU):
magic_quotes_gpc=Off
第9个最佳实践:控制POST请求的大小
做为请求的一部分,客户机(浏览器或用户)须要将数据发送到Apache Web服务器时,好比上传文件或提交填好的表单时,就要用到HTTP POST请求方法。攻击者可能会企图发送过大的POST请求,大量消耗你的系统资源。你能够限制PHP将处理的POST请求的最大大小。编辑/etc/php.d/security.ini,执行如下命令:
post_max_size=1K
1K设置了php应用程序容许的POST请求数据的最大大小。该设置还影响文件上传。要上传大容量文件,这个值必须大于upload_max_filesize。我还建议你限制使用Apache Web服务器的可用方法。编辑httpd.conf,执行针对文件根目录/var/www/html的如下指令:
Order allow,deny
## 可在此添加配置的其他部分... ##
第10个最佳实践:资源控制(拒绝服务控制)
你能够设置每一个php脚本的最长执行时间,以秒为单位。另外一个建议的选项是设置每一个脚本可能用于解析请求数据的最长时间,以及脚本可能耗用的最大内存数量。编辑/etc/php.d/security.ini,执行如下命令:
设置,以秒为单位
max_execution_time = 30
max_input_time = 30
memory_limit = 40M
第11个最佳实践:为PHP安装Suhosin高级保护系统
来自Suhosin项目网页(http://www.hardened-php.net/suhosin/):
Suhosin是一款高级的保护系统,面向安装的PHP。它旨在保护服务器和用户,远离PHP应用程序和PHP核心中的已知缺陷和未知缺陷。Suhosin分两个独立部分,能够单独使用,也能够组合使用。第一个部分是针对PHP核心的小补丁,实施了几个低级防御措施,以防范缓冲器溢出或格式字符串安全漏洞;第二个部分是功能强大的PHP加载模块,实施了其余全部的保护措施。
看看如何在Linux操做系统下安装和配置suhosin(http://www.cyberciti.biz/faq/rhel-linux-install-suhosin-php-protection/)。
第12个最佳实践:禁用危险的PHP函数
PHP有许多函数,若是使用不当,它们能够用来闯入你的服务器。你可使用disable_functions命令,在/etc/php.d/security.ini中禁用一系列函数:
disable_functions=exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
第13个最佳实践:PHP Fastcgi/CGI - cgi.force_redirect命令
PHP可与FastCGI协同工做。 Fascgi减小了Web服务器占用的内存资源,可是仍为你提供了整个PHP语言具备的速度和功能。你能够配置Apache2+PHP+FastCGI或cgi,如这里描述的那样。配置命令cgi.force_redirect能够防止任何人使用http://www.cyberciti.biz/cgi-bin/php/hackerdir/backdoor.php这样的地址,直接调用PHP。出于安全缘由,应启用cgi.force_redirect。编辑/etc/php.d/security.ini,执行如下命令:
出于安全缘由,在典型的*Apache+PHP-CGI/FastCGI*环境中,启用cgi.force_redirect
cgi.force_redirect=On
第14个最佳实践:PHP用户和用户组ID
mod_fastcgi是面向Apache Web服务器的cgi模块。它能够链接至外部的FASTCGI服务器。你要确保PHP以非根目录用户的身份来运行。若是PHP以根目录或100如下UID的身份来运行,它能够访问及/或处理系统文件。你必须使用Apache的suEXEC或mod_suPHP,以非特权用户的身份来执行PHP CGI。suEXEC功能让Apache用户们可以以有别于调用Web服务器的用户ID的用户ID来运行CGI程序。在该示例中,个人php-cgi以phpcgi用户的身份来运行,Apache以apache用户的身份来运行:
#psaux |grepphp-cgi
示例输出:
phpcgi 6012 0.0 0.4 225036 60140 ? S Nov22 0:12 /usr/bin/php-cgi
phpcgi 6054 0.0 0.5 229928 62820 ? S Nov22 0:11 /usr/bin/php-cgi
phpcgi 6055 0.1 0.4 224944 53260 ? S Nov22 0:18 /usr/bin/php-cgi
phpcgi 6085 0.0 0.4 224680 56948 ? S Nov22 0:11 /usr/bin/php-cgi
phpcgi 6103 0.0 0.4 224564 57956 ? S Nov22 0:11 /usr/bin/php-cgi
phpcgi 6815 0.4 0.5 228556 61220 ? S 00:52 0:19 /usr/bin/php-cgi
phpcgi 6821 0.3 0.5 228008 61252 ? S 00:55 0:12 /usr/bin/php-cgi
phpcgi 6823 0.3 0.4 225536 58536 ? S 00:57 0:13 /usr/bin/php-cgi
你可使用spawn-fcgi等工具,以phpcgi用户的身份(先要为系统添加phpcgi用户)来建立远程和本地FastCGI进程:
# spawn-fcgi -a 127.0.0.1 -p 9000 -u phpcgi -g phpcgi -f /usr/bin/php-cgi
如今,你能够配置Apache、Lighttpd和Nginx web服务器了,使用在127.0.0.1ip地址处端口9000上运行的php FastCGI。
第15个最佳实践:限制PHP对文件系统的访问
open_basedir命令设置了容许PHP使用fopen()和其余函数来访问哪些目录的文件。若是文件在open_basdir定义的路径外面,PHP就拒绝打开该文件。你没法使用符号连接做为变通办法。好比说,只容许访问/var/www/html目录、不容许访问/var/www、/tmp或/etc目录:
限制PHP进程访问/var/www/html/等专门指定的目录外面的文件
; Limits the PHP process from accessing files outside; of specifically designated directories suchas/var/www/html/open_basedir="/var/www/html/"; ------------------------------------; Multipledirsexample; open_basedir="/home/httpd/vhost/cyberciti.biz/html/:/home/httpd/vhost/nixcraft.com/html/:/home/httpd/vhost/theos.in/html/"; ------------------------------------
第16个最佳实践:会话路径
PHP中的会话支持包括在随后的访问中保留某些数据的一种方法。这让你可以开发更加定制的应用程序,并加大网站的吸引力。该路径在/etc/php.ini文件中定义,与某一个会话有关的全部数据都将存放在session.save_path选项指定的目录下的文件中。在RHEL/CentOS/Fedora Linux下,默认路径以下:
session.save_path="/var/lib/php/session"
设置用于上传文件时存储文件的临时目录
upload_tmp_dir="/var/lib/php/session"
确保路径是outside /var/www/html,并且没法被其余任何系统用户读取或写入:
#ls-Z /var/lib/php/
示例输出:
drwxrwx---. root apache system_u:object_r:httpd_var_run_t:s0 session
注意:ls命令的-Z选项显示了SELinux 安全上下文,好比文件模块、用户、用户组、安全上下文和文件名称。
第17个最佳实践:保持PHP、软件和操做系统版本最新
打安全补丁是维护Linux、Apache、PHP和MySQL服务器的一个重要环节。应该使用如下其中任何一个工具(若是你经过软件包管理器来安装PHP),尽快检查全部的PHP安全更新版本,并尽快打上:
#yumupdate
或
#apt-getupdate && apt-get upgrade
你能够配置红帽/CentOS/Fedora Linux,以便经过电子邮件发送yum软件包更新通知。另外一个选项是经过cron job(计划任务)打上全部的安全更新版。在Debian/Ubuntu Linux下,可使用apticron来发送安全通知。
注意:常常访问php.net(http://php.net/),寻找源代码安装的最新版本。
第18个最佳实践:限制文件和目录访问
确保你以Apache或www等非根用户的身份来运行Apache。全部文件和目录都应该归非根用户(或apache用户)全部,放在/var/www/html下:
#chown-R apache:apache /var/www/html/
/var/www/html/是个子目录,这是其余用户能够修改的文件根目录,由于根目录历来不在那里执行任何文件,也不会在那里建立文件。
确保在/var/www/html/下,文件权限设成了0444(只读):
#chmod-R 0444 /var/www/html/
确保在/var/www/html/下,全部目录权限设成了0445:
#find/var/www/html/ -type d -print0 |xargs-0 -I {} chmod 0445 {}
关于设置合适文件权限的补充
chown和chmod命令确保:无论在什么状况下,文件根目录或文件根目录里面的文件均可以被Web服务器用户apache写入。请注意:你须要设置对你网站的开发模型最合理的权限,因此能够根据自身须要,随意调整chown和chmod命令。在这个示例中,Apache服务器以apache用户的身份来运行。这能够在你的httpd.conf文件中用User和Group命令来配置。apache用户须要对文件根目录下的全部内容享有读取访问权,可是不该该享有写入访问权。
确保httpd.conf有如下命令,实现限制性配置:
Options None
AllowOverride None
Order allow,deny
你只要在须要时才应该授予写入访问权。WordPress等一些Web应用程序及其余应用程序可能须要缓存目录。你可使用如下命令,授予写入到缓冲目录的访问权:
# chmod a+w/var/www/html/blog/wp-content/cache
### block access to all ###
#echo'deny from all' > /var/www/html/blog/wp-content/cache/.htaccess
第19个最佳实践:写保护Apache、PHP和MySQL配置文件
使用chattr命令来写保护配置文件:
# chattr +i /etc/php.ini
# chattr +i /etc/php.d/*
# chattr +i /etc/my.ini
# chattr +i /etc/httpd/conf/httpd.conf
# chattr +i /etc/chattr
命令还能够写保护/var/www/html目录中的一个php文件或多个文件:
# chattr +i /var/www/html/file1.php
# chattr +i /var/www/html/
第20个最佳实践:使用Linux安全加载模块(如SELinux)
Linux自带各类安全补丁,能够用来防御配置不当或受到危及的服务器程序。可能的话,使用SELinux及其余Linux安全加载模块,对网络及其余程序实行限制。好比说,SELinux为Linux内核和Apache Web服务器提供了众多安全策略。要列出全部的Apache SELinux保护变量,请输入:
# getsebool -a | grep httpd
示例输出:
allow_httpd_anon_write --> off
allow_httpd_mod_auth_ntlm_winbind --> off
allow_httpd_mod_auth_pam --> off
allow_httpd_sys_script_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_network_connect --> off
httpd_can_network_connect_cobbler --> off
httpd_can_network_connect_db --> off
httpd_can_network_memcache --> off
httpd_can_network_relay --> off
httpd_can_sendmail --> off
httpd_dbus_avahi --> on
httpd_enable_cgi --> on
httpd_enable_ftp_server --> off
httpd_enable_homedirs --> off
httpd_execmem --> off
httpd_read_user_content --> off
httpd_setrlimit --> off
httpd_ssi_exec --> off
httpd_tmp_exec --> off
httpd_tty_comm --> on
httpd_unified --> on
httpd_use_cifs --> off
httpd_use_gpg --> off
httpd_use_nfs --> off
要禁用Apache cgi支持,请输入:
# setsebool -P httpd_enable_cgi off
参阅红帽SELinux指南(http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Security-Enhanced_Linux/index.html),便可了解更多信息。
第21个最佳实践:安装Mod_security
ModSecurity是一个保护Web应用程序的开源入侵检测和预防引擎。你在Linux下很容易安装mod_security,安装后就能保护基于Apache和PHP的应用程序,远离XSS及其余各类攻击:
##几个实例##
#不容许打开/etc/中的文件
SecFilter /etc/
#阻止SQL注入攻击
SecFilter "delete[[:space:]]+from"
SecFilter "select.+from"
第22个最佳实践:尽量在chrootjail环境中运行Apache / PHP
将PHP及/或Apache放在chroot jail环境中能够尽可能减少潜在的入侵事件形成的破坏,由于它将Web服务器隔离到文件系统的一小部分。你可使用Apache自带的那种传统的chroot jail环境。不过建议使用FreeBSD jail、运用容器概念的XEN虚拟化、KVM虚拟化或OpenVZ虚拟化。
第23个最佳实践:使用防火墙限制出站链接
攻击者会使用wget之类的工具,将文件本地下载到你的Web服务器上。你可使用iptables阻止apache用户的出站链接。ipt_owner模块会试图比对本地建立的数据包与数据包建立者的各个特色。它只有在OUTPUT链中才有效。在这个示例中,容许vivek用户使用端口80链接外界(这适用于RHN或centos repo访问)。
# /sbin/iptables -A OUTPUT -o eth0 -m owner --uid-owner vivek -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
下面是另外一个示例,阻止apache用户的全部出站链接(通向咱们本身的smtp服务器的出站链接除外),以及垃圾邮件验证API服务:
# ..../sbin/iptables --new-chain apache_user/sbin/iptables --append OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT/sbin/iptables --append OUTPUT -m owner --uid-owner apache -j apache_user# allow apache user to connec to our smtp server/sbin/iptables --append apache_user -p tcp --syn -d 192.168.1.100 --dport 25 -j RETURN# Allow apache user to connec to api server for spam validation/sbin/iptables --append apache_user -p tcp --syn -d 66.135.58.62 --dport 80 -j RETURN/sbin/iptables --append apache_user -p tcp --syn -d 66.135.58.61 --dport 80 -j RETURN/sbin/iptables --append apache_user -p tcp --syn -d 72.233.69.89 --dport 80 -j RETURN/sbin/iptables --append apache_user -p tcp --syn -d 72.233.69.88 --dport 80 -j RETURN########################### Addmorerules here ############################ No editing below# Drop everything for apache outgoing connection
# /sbin/iptables --append apache_user -jreject
第24个最佳实践:关注日志和审查
检查apache日志文件:
#tail-f /var/log/httpd/error_log
# grep 'login.php' /var/log/httpd/error_log
#egrep-i "denied|error|warn" /var/log/httpd/error_log
检查php日志文件:
# tail -f /var/log/httpd/php_scripts_error.log
# grep "...etc/passwd" /var/log/httpd/php_scripts_error.log
日志文件让你对于服务器遭到什么攻击有所了解,并让你能够检查必要的安全级别有没有落实到位。提供了用于系统审查的auditd服务。启用该服务,就能够审查SELinux事件、验证事件、文件修改和账户修改等。我还建议使用标准的Linux系统监测工具(http://www.cyberciti.biz/tips/top-linux-monitoring-tools.html),用于监测你的Web服务器。
第25个最佳实践:按照系统或虚拟机实例来运行服务
对于安装的大型系统来讲,建议你借助不一样的服务器运行数据库、静态内容和动态内容。
图1:在不一样的服务器上运行服务
在不一样的服务器或虚拟机实例上运行不一样的网络服务。这限制了可能受到危及的其余服务的数量。好比说,若是攻击者成功地利用了Apache flow等软件的漏洞,就能访问整个服务器,包括在同一台服务器上运行的其余服务(好比MySQL和电子邮件服务等)。可是在上述例子中,按如下方式提供不一样内容:
static.lan.cyberciti.biz:使用lighttpd或nginx服务器,用于提供js/css/images等静态资产。
phpcgi1.lan.cyberciti.biz和phpcgi2.lan.cyberciti.biz:Apache web服务器,php用于生成动态内容。
mysql1.lan.cyberciti.biz:MySQL数据库服务器。
mcache1.lan.cyberciti.biz:Memcached服务器是用于MySQL的速度很是快的缓存系统。它使用libevent或epoll(Linux运行时环境),能够扩展至任何数量的打开的链接,并使用非阻塞的网络输入/输出。
LB01:放在Apache Web服务器前面的nginx Web服务器和反向代理服务器。 从互联网进入到其中一台Web服务器的全部链接均经过nginx代理服务器来传送,该代理服务器能够自己处理请求,也能够将请求所有或部分传送到主Web服务器。LB01提供了简单的负载均衡机制。
第26个最佳实践:其余工具
来自PHPIDS项目网页(https://phpids.org/):
PHPIDS(PHP入侵检测系统)是面向基于PHP的web应用程序的安全层,具备使用简单、结构良好、运行快捷、技术先进等优势。IDS没法清除、净化或过滤任何恶意输入内容,仅仅识别攻击者什么时候企图闯入你的网站,安全按照你但愿它采起的措施来采起相应措施。
你可使用PHPIDS来检测恶意用户,并记录检测出来的任何攻击,方便之后分析。请注意:我我的没有用过这款工具。
来自PhpSecInfo项目网页(http://phpsec.org/projects/phpsecinfo/index.html):
PhpSecInfo提供了与phpinfo()函数相对应的机制,可报告关于PHP环境的安全信息,并提供改进的建议。它没法取代安全开发技巧,也不进行任何一种代码或应用程序审查,倒是多层次安全方案中的一个实用工具。
图2:关于PHP应用程序的安全信息
参阅Linux安全加固要点(http://www.cyberciti.biz/tips/linux-security.html),减小系统面临的攻击途径数量。
关于PHP后门的补充
你可能碰到过PHP脚本或所谓的常见后门,好比c9九、c99madshell和r57等。后门php脚本其实就是一段隐藏的脚本,用于绕开全部的验证机制,根据须要访问你的服务器。攻击者安装它的目的是,访问你的服务器,同时又企图不被发现。误用的PHP脚本(或其余任何CGI脚本)一般容许添加钻Web浏览器中安全漏洞空子的代码。攻击者可使用这种被钻空子的安全漏洞,上传后门外壳程序,从而让攻击者可以得到许多功能,好比:
下载文件
上传文件
安装rootkit
设置垃圾邮件服务器/中继服务器
设置代理服务器,隐匿行踪
控制服务器
控制数据库服务器
窃取全部信息
删除全部信息和数据库
打开TCP/UDP端口及更多端口
要点:该如何找出PHP后门?
可使用Unix/Linux grep命令,搜索c99或r57外壳:
# grep -iR 'c99' /var/www/html/
# grep -iR 'r57' /var/www/html/
# find /var/www/html/ -name \*.php -type f -print0 | xargs -0 grep c99
# grep -RPn "(passthru|shell_exec|system|base64_decode|fopen|fclose|eval)" /var/www/html/