在 CentOS 7.x / Fedora 21 上面体验 PHP 7.0

澳门新葡亰赌995577 2

PHP是一种为我们熟知的通用服务器网页脚本语言。非常多的在线网站都是用PHP编写的。PHP这些年来一直在持续进化,丰富其功能,变得易于使用,更好地组织的脚本语言。目前PHP的开发团队正筹备下一个PHP版本的发行,名字是PHP
7。现在的PHP版本为PHP 5.6,可能你清楚PHP 6已经流产了,PHP
7的支持者们不希望下一个重要的版本被其他分支混淆,即过去已经停止很久的PHP
6。所以决定下一个PHP主要的发行版本叫PHP 7,而不是PHP 6。PHP
7.0预计在今年十一月份发行。

  PHP是广泛使用的开源服务端脚本语言。通过HTTP或HTTPS协议,Apache
Web服务允许用户访问文件或内容。服务端脚本语言的错误配置会导致各种问题。因此,PHP应该小心使用。以下是为系统管理员准备的,安全配置PHP的25个实践事例。

在下一代主要PHP版本里有一些不错的功能:

澳门新葡亰赌995577 1

  • 为了改善执行效率与内存占用,新的版本添加了PHPNG功能。
  • 引入了JIT引擎来动态编译Zend操作码为自然机器码,以此来达到更快的处理性能。这项功能允许随后的程序调用同一份代码,这样会运行快很多。
  • AST(抽象语法树)是最新添加的功能,它可以增强支持PHP的扩展性和用户应用。
  • 添加异步编程功能以支持同一个请求中的并行任务。
  • 新的版本会支持独立的多线程网页服务器,这样可以使用一个单独的存储池处理很多并发的请求。

  用于下文的PHP设置样例

澳门新葡亰赌995577 2

  • DocumentRoot:/var/www/html
  • 默认Web服务:Apache(可以使用Lighttpd或Nginx代替)
  • 默认PHP配置文件:/etc/php.ini
  • 默认PHP Extensions配置目录:/etc/php.d/
  • PHP安全配置样例文件:/etc/php.d/security.ini(需要使用文本编辑器创建这个文件)
  • 操作系统:RHEL / CentOS / Fedora
    Linux(指令应该可以在所有其他Linux发行版,如Debian /
    Ubuntu,或是Unix-like的操作系统,如OpenBSD / FreeBSD /
    HP-UX下正常运行)
  • PHP服务的默认TCP/UDP端口:none

在CentOS/Fedora上安装PHP 7

让我们来看看怎样在CentOS 7和Fedora
21安装PHP7。为了安装PHP7,我们首先需要克隆php-src
仓库。当克隆工作完成,我们再配置和编译它。进行下一步之前,我们要确保已经在LInux系统下安装了如下的组件,否则PHP编译会返回错误中止。

  • Git
  • autoconf
  • gcc
  • bison

所有上面提到的要求可以使用Yum软件包管理器安装。以下一条命令即可完成:

yum install git autoconf gcc bison

准备好开始安装PHP7了吗?让我们先创建一个PHP7目录,作为你的当前工作目录。

mkdir php7
cd php7

现在克隆php-src仓库,在终端里运行下面的命令。

git clone https://git.php.net/repository/php-src.git

工作应该会在几分钟后完成,这里是一个样例输出,你应该会在任务完成时看见。

[root@localhost php7]# git clone https://git.php.net/repository/php-src.git
Cloning into 'php-src'...
remote: Counting objects: 615064, done.
remote: Compressing objects: 100% (127800/127800), done.
remote: Total 615064 (delta 492063), reused 608718 (delta 485944)
Receiving objects: 100% (615064/615064), 152.32 MiB | 16.97 MiB/s, done.
Resolving deltas: 100% (492063/492063), done.

让我们来配置,编译PHP7,在终端运行下面的命令,开始配置工作:

cd php-src
./buildconf

下面是./buildconf命令的样例输出。

[root@localhost php-src]# ./buildconf
buildconf: checking installation...
buildconf: autoconf version 2.69 (ok)
rebuilding aclocal.m4
rebuilding configure
rebuilding main/php_config.h.in

使用下面的命令,继续配置进程:

./configure /
--prefix=$HOME/php7/usr /
--with-config-file-path=$HOME/php7/usr/etc /
--enable-mbstring /
--enable-zip /
--enable-bcmath /
--enable-pcntl /
--enable-ftp /
--enable-exif /
--enable-calendar /
--enable-sysvmsg /
--enable-sysvsem /
--enable-sysvshm /
--enable-wddx /
--with-curl /
--with-mcrypt /
--with-iconv /
--with-gmp /
--with-pspell /
--with-gd /
--with-jpeg-dir=/usr /
--with-png-dir=/usr /
--with-zlib-dir=/usr /
--with-xpm-dir=/usr /
--with-freetype-dir=/usr /
--with-t1lib=/usr /
--enable-gd-native-ttf /
--enable-gd-jis-conv /
--with-openssl /
--with-mysql=/usr /
--with-pdo-mysql=/usr /
--with-gettext=/usr /
--with-zlib=/usr /
--with-bz2=/usr /
--with-recode=/usr /
--with-mysqli=/usr/bin/mysql_config

这会花去不少的时间,当完成后你应该会看到如下面的输出:

creating libtool
appending configuration tag "CXX" to libtool
Generating files
configure: creating ./config.status
creating main/internal_functions.c
creating main/internal_functions_cli.c
+--------------------------------------------------------------------+
| License:                                                           |
| This software is subject to the PHP License, available in this     |
| distribution in the file LICENSE.  By continuing this installation |
| process, you are bound by the terms of this license agreement.     |
| If you do not agree with the terms of this license, you must abort |
| the installation process at this point.                            |
+--------------------------------------------------------------------+

Thank you for using PHP.

config.status: creating php7.spec
config.status: creating main/build-defs.h
config.status: creating scripts/phpize
config.status: creating scripts/man1/phpize.1
config.status: creating scripts/php-config
config.status: creating scripts/man1/php-config.1
config.status: creating sapi/cli/php.1
config.status: creating sapi/cgi/php-cgi.1
config.status: creating ext/phar/phar.1
config.status: creating ext/phar/phar.phar.1
config.status: creating main/php_config.h
config.status: executing default commands

运行下面的命令,完成编译过程。

make

“make”命令的样例输出如下所示:

Generating phar.php
Generating phar.phar
PEAR package PHP_Archive not installed: generated phar will require PHP's phar extension be enabled.
clicommand.inc
directorytreeiterator.inc
directorygraphiterator.inc
pharcommand.inc
invertedregexiterator.inc
phar.inc

Build complete.
Don't forget to run 'make test'.

活儿干完了,该安装PHP7了,运行下面的命令安装它。

make install

成功安装的进程的样例输出应该像这样:

[root@localhost php-src]# make install
Installing shared extensions:     /root/php7/usr/lib/php/extensions/no-debug-non-zts-20141001/
Installing PHP CLI binary:        /root/php7/usr/bin/
Installing PHP CLI man page:      /root/php7/usr/php/man/man1/
Installing PHP CGI binary:        /root/php7/usr/bin/
Installing PHP CGI man page:      /root/php7/usr/php/man/man1/
Installing build environment:     /root/php7/usr/lib/php/build/
Installing header files:          /root/php7/usr/include/php/
Installing helper programs:       /root/php7/usr/bin/
program: phpize
program: php-config
Installing man pages:             /root/php7/usr/php/man/man1/
page: phpize.1
page: php-config.1
Installing PEAR environment:      /root/php7/usr/lib/php/
[PEAR] Archive_Tar    - installed: 1.3.13
[PEAR] Console_Getopt - installed: 1.3.1
[PEAR] Structures_Graph- installed: 1.0.4
[PEAR] XML_Util       - installed: 1.2.3
[PEAR] PEAR           - installed: 1.9.5
Wrote PEAR system config file at: /root/php7/usr/etc/pear.conf
You may want to add: /root/php7/usr/lib/php to your php.ini include_path
/root/php7/php-src/build/shtool install -c ext/phar/phar.phar /root/php7/usr/bin
ln -s -f /root/php7/usr/bin/phar.phar /root/php7/usr/bin/phar
Installing PDO headers:          /root/php7/usr/include/php/ext/pdo/

恭喜你,PHP7已经安装在你的Linux系统上了。安装完后,进入PHP7安装文件里的sapi/cli里面。

cd sapi/cli

澳门新葡亰赌995577,验证一下PHP的版本。

[root@localhost cli]# ./php -v
PHP 7.0.0-dev (cli) (built: Mar 28 2015 00:54:11)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0-dev, Copyright (c) 1998-2015 Zend Technologies

  下午列出的大部分操作,都是基于 root 用户能在 bash 或其他现代 shell
上执行操作的假设。

总结

PHP
7也添加到了remi仓库,这个即将到来的版本主要关注执行效率的提升,它的新特性致力于使PHP较好满足现代编程的需求和趋势。PHP
7.0将会有许多新的特性、丢弃一些老版本的东西。在接下来的日子里,我们希望看到新特性和弃用功能的具体情况。希望你喜欢!

1
$ php -v

  样例输出

1
2
3
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

  本文使用的操作系统

1
$ cat /etc/redhat-release

  样例输出

1
Red Hat Enterprise Linux Server release 6.1 (Santiago)

  #1:知彼

  基于PHP的应用面临着各种各样的攻击:

  • XSS:对PHP的Web应用而言,跨站脚本是一个易受攻击的点。攻击者可以利用它盗取用户信息。你可以配置Apache,或是写更安全的PHP代码(验证所有用户输入)来防范XSS攻击
  • SQL注入:这是PHP应用中,数据库层的易受攻击点。防范方式同上。常用的方法是,使用mysql_real_escape_string()对参数进行转义,而后进行SQL查询。
  • 文件上传:它可以让访问者在服务器上放置(即上传)文件。这会造成例如,删除服务器文件、数据库,获取用户信息等一系列问题。你可以使用PHP来禁止文件上传,或编写更安全的代码(如检验用户输入,只允许上传png、gif这些图片格式)
  • 包含本地与远程文件:攻击者可以使远程服务器打开文件,运行任何PHP代码,然后上传或删除文件,安装后门。可以通过取消远程文件执行的设置来防范
  • eval():这个函数可以使一段字符串如同PHP代码一样执行。它通常被攻击者用于在服务器上隐藏代码和工具。通过配置PHP,取消eval()函数调用来实现
  • Sea-surt Attack(Cross-site request
    forgery,CSRF。跨站请求伪造):这种攻击会使终端用户在当前账号下执行非指定行为。这会危害终端用户的数据与操作安全。如果目标终端用户的账号用于管理员权限,整个Web应用都会收到威胁。

  #2:减少内建的PHP模块

  执行下面指令可以查看当前PHP所编译的模块

1
$ php -m

  样例输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
[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是不必要的。那么可以通过删除或重命名/etc/php.d/sqlite3.ini文件来取消它:

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

  或

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

  有些模块则只能通过使用重新编译安装PHP来移除。例如,从php.net下载PHP源码后,使用下面指令编译GD,fastcgi和MySQL支持:

1
./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

  更多信息请查看:how to compile and reinstall php on Unix like
operating system

  #3:防止PHP信息泄漏

  可以通过取消export_php,对PHP信息泄漏进行限制。编辑/etc/php.d/security.ini如下:

1
expose_php=Off

  expose_php会在HTTP
Header中添加服务器上,包括版本在内的PHP信息(例如X-Powered-By:
PHP/5.3.3)。同时,PHP的全局统一标识符也会暴露。如果export_php启用的话,可以通过下面命令查看PHP版本信息:

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

  样例输出:

1
2
3
4
5
6
7
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 and ServerSignature
directives in httpd.conf to hide Apache
version

  #4:最小化可载入的PHP模块(动态Extension)

  PHP支持“Dynamic
Extensions”。默认情况下,RHEL会载入/etc/php.d/目录下的所有Extension模块。如需启用或取消某一模块,只需把/etc/php.d/目录下配置文件把该模块注释掉。也可以把文件删除或重命名该模块的配置文件。为了最优化PHP的性能和安全性,应只启用Web应用所需的Extension。例如,用下面命令取消GD模块:

1
2
3
# cd /etc/php.d/
 # mv gd.{ini,disable}
 # <span style="text-decoration: underline;">/sbin/service httpd restart</span>

  启用则是:

1
2
# mv gd.{disable,ini}
 # <span style="text-decoration: underline;">/sbin/service httpd restart</span>

  #5:记录所有PHP错误

  不要把PHP错误信息输出给所用用户。编辑/etc/php.d/security.ini,如下修改:

1
display_errors=Off

  确保把所有错误信息记录到日志文件

1
2
log_errors=On
error_log=/var/log/httpd/php_scripts_error.log

  #6:禁止文件上传

  为安全考虑,如下编辑/etc/php.d/security.ini取消文件上传

1
file_uploads=Off

  如用户的确需要上传文件,那么把它启用,而后限制PHP接受的最大文件大小:

1
2
3
file_uploads=On
# user can only upload upto 1MB via php
upload_max_filesize=1M

  #7:关闭远程代码执行

  如果这个特性被启动,PHP可以通过allow_url_fopen,在file_get_contents()、include、require中获取诸如FTP或网页内容这些远程数据。程序员经常忘记了对用户输入进行过滤,而如果这些函数调用了这些数据,则形成了注入漏洞。在基于PHP的Web应用中,大量代码中的注入漏洞都由此产生。可以通过编辑/etc/php.d/security.ini来关闭该特性:

1
allow_url_fopen=Off

  除此之外,建议把allow_url_include也取消掉:

1
allow_url_include=Off

  #8:启用SQL安全模式

  如下修改/etc/php.d/security.ini:

1
sql.safe_mode=On

  当此特性被启用,mysql_connect()和mysql_pconnect()会忽略传入的所有参数。与此同时,你需要在代码上做些相应的修改。第三方以及开源应用,如Wordpress,在sql.safe_mode下可能无法正常工作。同时建议关闭5.3.x版本的PHP的magic_quotes_gpc过滤,因为它简单粗暴又没效率。使用mysql_escape_string()以及自定义的过滤函数会更好一些

1
magic_quotes_gpc=Off

  #9:控制POST的数据大小

  HTTP POST通常作为请求的一部分,被客户端用于向Apache
Web服务器发送数据,如上传文件或提交表单。攻击者会尝试发送超大的POST请求去消耗服务器的资源。如下编辑/etc/php.d/security.ini限制POST的最大大小:

1
2
; 在这里设置一个靠谱的数值
 post_max_size=1K

  这里设置了1K的最大大小。这个设置会影响到文件上传。要上传大文件,这个值需要比update_max_filesize大。
建议在Apache中限制可用的请求方法,编辑httpd.conf如下:

1
2
3
4
5
6
<Directory /var/www/html>
     <LimitExcept GET POST>
         Order allow,deny
     </LimitExcept>
 ## Add rest of the config goes here... ##
 </Directory>

  #10:资源控制(DoS控制)

  设置每个PHP脚本的最大运行时间。另外建议限制用于处理请求数据的最大时间,以及最大可用内存数。

  # 单位:秒

1
2
3
max_execution_time = 30
max_input_time = 30
memory_limit = 40M

  #11:为PHP安装Suhosin高级保护系统

  具体参考Suhosin项目页:project
page

  #12:取消危险的PHP函数

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图