`
lonestone
  • 浏览: 92852 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

系统管理员必须知道的PHP安全实践

php 
阅读更多
PHP是一种开源服务器端脚本语言,应用很广泛。Apache web服务器提供了这种便利:通过HTTP或HTTPS协议,访问文件和内容。配置不当的服务器端脚本语言会带来各种各样的问题。所以,使用PHP时要小心。以下是25个PHP安全方面的最佳实践,可供系统管理员们安全地配置PHP。
为PHP安全提示而提供的示例环境

•文件根目录(DocumentRoot):/var/www/html
•默认的Web服务器:Apache(可以使用Lighttpd或Nginx来取代Apache)
•默认的PHP配置文件:/etc/php.ini
•默认的PHP加载模块配置目录:/etc/php.d/
•我们的示例php安全配置文件:/etc/php.d/security.ini(需要使用文本编辑器来创建该文件)
•操作系统:RHEL/CentOS/Fedora Linux(相关指令应该与Debian/Ubuntu等其他任何Linux发行版或者OpenBSD/FreeBSD/HP-UX等其他类似Unix的操作系统兼容)。
•默认的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 Hat Enterprise Linux Server release 6.1 (Santiago)
第1个最佳实践:了解你的对手

基于PHP的应用程序面临不同类型的攻击。我注意到了几种不同类型的攻击:

1. XSS:跨站脚本是Web PHP应用程序中的一种安全漏洞,攻击者可以利用该漏洞来窃取用户的信息。你可以配置Apache,编写更安全的PHP脚本(验证所有的用户输入),以避免XSS攻击。

2. SQL注入攻击:这是PHP应用程序的数据库层中的安全漏洞。用户输入不正确地过滤时,应用程序就能执行任何SQL语句。你可以配置Apache,编写安全代码(验证和转换所有的用户输入),以避免SQL注入攻击。PHP中的一个常见做法是,在发送SQL查询之前,使用名为mysql_real_escape_string()的函数,转换参数。

3. 文件上传:它让访客可以将文件放在(将文件上传到)你的服务器上。这会带来众多安全问题,比如删除你的文件、删除数据库、获取用户详细资料,不一而足。你可以使用php来禁用文件上传,或编写安全代码(比如验证用户输入,只允许PNG或GIF等图像文件类型)。

4. 添加本地和远程文件:攻击者可以从远程服务器打开文件,执行任何PHP代码。这让他们得以上传文件、删除文件和安装后门。可以配置php以禁用远程文件执行功能。

5. eval() :将字符串作为PHP代码来进行评估。攻击者常常利用该函数来隐藏其在服务器本身上面的代码和工具。你可以配置PHP,禁用eval()。

6. sea-surf攻击(跨站请求伪造,CSRF):这种攻击迫使最终用户针对目前已验证其身份的Web应用程序执行有害的操作。如果是平常的用户,得逞的CSRF攻击会危及最终用户的数据和操作。但如果被盯上的最终用户使用管理员帐户,这会危及整个Web应用程序。


第2个最佳实践:查找内置的PHP模块



想查看一组编译进去的PHP模块,请输入以下命令:
# php -m


示例输出:



[PHP模块]
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模块]
Suhosin


我建议你使用模块数量减少的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/service httpd 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=1K1K设置了php应用程序允许的POST请求数据的最大大小。该设置还影响文件上传。要上传大容量文件,这个值必须大于upload_max_filesize。我还建议你限制使用Apache Web服务器的可用方法。编辑httpd.conf,执行针对文件根目录/var/www/html的以下指令:

<Directory /var/www/html>
       <LimitExcept GET POST>
               Order allow,deny
    </LimitExcept>## 可在此添加配置的其余部分... ##

</Directory>第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用户的身份来运行:

# ps aux | grep php-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.1 IP地址处端口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 such as /var/www/html/
open_basedir="/var/www/html/"
; ------------------------------------
; Multiple dirs example
; 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安全更新版本,并尽快打上:

# yum update或

# apt-get update && 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有以下命令,实现限制性配置:

<Directory / >
    Options None
    AllowOverride None
    Order allow,deny
</Directory>你只要在需要时才应该授予写入访问权。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个最佳实践:尽可能在chroot jail环境中运行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
#########################
## Add more rules here ##
#########################
# No editing below
# Drop everything for apache outgoing connection
/sbin/iptables --append apache_user -j REJECT第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和电子邮件服务等)。但是在上述例子中,按以下方式提供不同内容:

1. static.lan.cyberciti.biz:使用lighttpd或nginx服务器,用于提供js/css/images等静态资产。

2. phpcgi1.lan.cyberciti.biz和phpcgi2.lan.cyberciti.biz:Apache web服务器,php用于生成动态内容。

3. mysql1.lan.cyberciti.biz:MySQL数据库服务器。

4. mcache1.lan.cyberciti.biz:Memcached服务器是用于MySQL的速度非常快的缓存系统。它使用libevent或epoll(Linux运行时环境),可以扩展至任何数量的打开的连接,并使用非阻塞的网络输入/输出。

5. 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脚本或所谓的常见后门,比如c99、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/结束语

你基于PHP的服务器现在经过了适当的加固,可以准备显示动态网页了。不过,安全漏洞主要是因没有遵守堪称最佳实践的编程规则而引起的。为了满足在web应用程序安全方面的要求,你应该查阅更多资源,特别是PHP编程知识,尽管这超出了系统管理员的工作范畴。

原文地址:http://www.cyberciti.biz/tips/php-security-best-practices-tutorial.html

分享到:
评论

相关推荐

    ApacheServer系统管理员手册

    Apache服务器是全球最广泛使用...通过深入理解和实践这本手册中的内容,系统管理员可以有效地管理Apache服务器,确保其稳定、高效地为用户提供服务。无论是初学者还是经验丰富的管理员,都能从中获取宝贵的知识和技巧。

    Apache Server系统管理员手册 (PDG).rar

    《Apache Server系统管理员手册》是一本专门为Apache服务器的系统管理员准备的详尽指南。这本书涵盖了Apache服务器的基础知识、安装配置、安全管理、性能优化以及故障排查等多个方面,旨在帮助读者全面理解并熟练...

    Php制作会员管理系统

    3. **权限控制**:系统根据用户角色分配不同的访问权限,如普通用户、管理员等。这通常涉及PHP中的会话管理(session)和cookie机制,以及面向对象编程(OOP)中的角色-权限模型设计。 4. **订单管理**:对于电子...

    php学生成绩管理系统

    这个系统通常包括管理员界面和学生界面,管理员可以进行成绩录入、修改、查询等功能,而学生则可以查看自己的成绩和排名。作为大三的PHP课程设计项目,它不仅锻炼了学生的编程能力,还要求他们具备良好的数据库设计...

    PHP点菜系统管理

    《PHP点菜系统管理详解》 在餐饮行业中,点菜系统的高效运作对于提升服务质量与顾客体验至关重要。本文将深入探讨一款基于PHP开发的点菜后台管理系统,该系统着重于数据库的管理和操作,包括数据的增、删、改、查等...

    php学生信息管理后台系统

    《PHP学生信息管理后台系统详解》 在信息技术日益发达的今天,学生信息管理系统的构建显得尤为重要,它能够高效地处理大量...同时,系统的开发也是一个学习和实践PHP编程、数据库设计以及Web应用安全的良好实践项目。

    图书馆管理系统_php_

    1. **图书信息管理**:管理员可以通过系统录入、修改和删除图书的基本信息,如书名、作者、出版社、出版日期等,同时支持按照不同条件进行查询,方便快速定位到所需图书。 2. **借阅与归还管理**:系统记录每本书的...

    php图书管理系统源码

    4. **权限管理**:实现不同用户角色(如管理员、普通用户)的访问权限控制,确保数据安全。这可能涉及到PHP的会话管理,以及与数据库中的角色和权限表进行交互。 5. **借阅与归还模块**:如果系统支持图书借阅功能...

    基于PHP物业管理系统

    6. **权限管理**:设置不同角色(如管理员、物业人员、业主)的权限,保护敏感信息。 7. **统计分析**:提供数据分析报表,帮助管理者了解运营状况,做出决策。 在开发过程中,还需要考虑系统的安全性,如防止SQL...

    PHP文件管理系统源码.zip

    这样的系统对于网站管理员、开发人员以及需要远程协作的团队来说,是极其便利的工具。本篇文章将深入探讨PHP文件管理系统的原理、组成及实现方式。 1. PHP基础 PHP(Hypertext Preprocessor)是一种广泛使用的开源...

    PHP新闻管理系统

    1. **登录与权限管理**:系统管理员需要登录才能进行新闻管理。登录页面一般包含用户名和密码输入框,后台验证用户身份后提供相应的管理界面。权限管理则确保不同级别的管理员只能访问和操作他们被授权的功能。 2. ...

    PHP简易图书管理系统

    PHP简易图书管理系统是一个基于PHP编程语言构建的应用,旨在提供基本的图书管理功能,如用户注册、登录以及管理员对图书信息的维护。这个系统展现了PHP在Web开发中的应用,特别是对于小型项目的实用性。 1. **PHP...

    php学生成绩管理系统_khsztf_php_

    1. 用户登录与权限管理:系统通常会有不同级别的用户,如管理员、教师和学生,每个角色的权限不同。例如,管理员可以添加、修改和删除数据,教师可以查看和录入成绩,而学生只能查看自己的成绩。 2. 学生信息管理:...

    php图书管理系统

    9. **权限管理**:为了防止未经授权的访问,系统可以设置不同级别的用户权限,如管理员和普通用户。这涉及数据库中的用户表和登录验证机制。 10. **优化与扩展**:初级版的系统可能还有优化空间,如添加缓存机制以...

    PHP学生管理系统学生管理系统

    7. 安全性:考虑到学生信息的敏感性,系统需遵循最佳的安全实践,如使用预处理语句防止SQL注入,以及对密码进行加密存储。 8. 响应式设计:如果系统具有网页版本,那么响应式设计可以使它在不同设备上(如桌面、...

    php图书管理系统实验报告

    - 管理员添加新书信息到数据库,包括书名、作者、出版社、ISBN码、出版日期等。 - 新书入库后,更新图书库存,确保数据一致性。 6. **数据库设计** - 设计合理的数据库表结构,如用户表、图书表、借阅记录表等。...

    PHP图书管理系统

    1. 图书录入:管理员可以添加新的图书条目,包括书籍的基本信息,同时系统会自动生成唯一的ID以便于管理和查询。 2. 图书查询:用户可以通过关键词、作者、分类等多种方式查找所需书籍,提高了检索效率。 3. 借阅与...

    学生管理系统PHP

    总的来说,构建一个学生管理系统PHP项目,需要掌握PHP编程基础、MySQL数据库操作、HTML/CSS/JavaScript前端知识,以及一定的软件工程实践,包括需求分析、系统设计、测试和维护等。这样的项目对于学习和提升PHP开发...

    Apache Server 系统管理员手册

    以上只是Apache服务器系统管理员需要掌握的一部分知识,实际工作中还需要根据具体业务需求和环境进行深入研究和实践。"Apache Server 系统管理员手册"将提供详尽的指导,帮助你成为一个精通Apache服务器管理的专业...

    图书馆管理系统 PHP 实例 源码

    《图书馆管理系统 PHP 实例 源码》是一个用于学习和实践PHP编程的宝贵资源,它提供了构建一个完整的图书馆管理系统的代码实现。这个系统基于PHP语言,可以用来管理图书馆的书籍信息、借阅记录、用户账户等多种功能,...

Global site tag (gtag.js) - Google Analytics