澳门新浦京电子游戏在 Linux/windows下 命令行中使用和执行 PHP 代码[交互式php]

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预计在今年十一月份发行。

【注释】在ubuntu下,升级php到7.1版本,虽然提示的是Interactive
mode enabled, 但实际上可以直接书写命令,和interactive
shell效果一样。

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

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

一:windows下

澳门新浦京电子游戏 1

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

首先配置环境变量,注意是把php.exe所在的文件夹(而不是二进制文件)放在环境变量中。然后可以cmd中就可以运行php命令了 

  用于下文的PHP设置样例

澳门新浦京电子游戏 2

如何使用PHP的交互式运行环境(Interactive shell) php -a 

从PHP 5.1.0开始,CLI SAPI提供了一个交互式命令行工具(Interactive
shell),这个交互式PHP
shell是通过使用 –with-readline 编译选项集成到php内核里的。使用这个交互式shell,你可以直接在命令行窗口里输入PHP并直接获得输出结果。

开启PHP的交互式shell模式,需要使用 -a 参数。下面是使用交互式shell的一些例子。

$ php -a
Interactive shell

php > echo 5+8;
13
php > function addTwo($n)
php > {
php { return $n + 2;
php { }
php > var_dump(addtwo(2));
int(4)
php >

在交互式shell里,你可以使用 tab 键对函数名,内置变量,类名,静态方法等进行自动补全操作。

需要注意的是,Interactive Shell 和
Interactive Mode 并不是一个东西,尽管名称和功能都很相似。

如果你输入 php -a ,得到的回应是 ‘Interactive
Shell’
 并跟随着 ‘php>’ 提示符,那你使用的就是交互式shell。如果你得到的回应是 ‘Interactive
mode
enabled’
 ,说明你的PHP并不支持交互式shell,上面介绍的用法也不实用于你。

但也不用担心,Interactive
mode(交互模式)也可以在命令行窗口里执行PHP代码,只是代码的执行方式有些区别。
在PHP交互模式(Interactive
mode)里,你在命令行窗口里输入PHP代码,代码不会立即执行,当你输入了所有PHP代码后,输入 Ctrl-Z (windows里),或输入 Ctrl-D (linux里),你输入的所有代码将会一次执行完成并输出结果。

在PHP交互模式(Interactive
mode)里,跟交互式shell里不一样,你的代码需要以 <?php 开头,跟你的普通PHP文件里的写法一致。下面是在Windows里的使用例子。

C:>php -a
Interactive mode enabled

<?php
echo "Hello, world!";
?>
^Z
Hello, world!

在Winidows里,没有交互式shell,只有Interactive
mode。

 

 

PHP是一个开源服务器端脚本语言,最初这三个字母代表的是“Personal
Home Page”,而现在则代表的是“PHP:Hypertext
Preprocessor”,它是个递归首字母缩写。它是一个跨平台脚本语言,深受C、C++和Java的影响。

 

在 Linux 命令行中运行 PHP 代码

PHP的语法和C、Java以及带有一些PHP特性的Perl变成语言中的语法十分相似,它当下大约正被2.6亿个网站所使用,当前最新的稳定版本是PHP版本5.6.10。

PHP是HTML的嵌入脚本,它便于开发人员快速写出动态生成的页面。PHP主要用于服务器端(而Javascript则用于客户端)以通过HTTP生成动态网页,然而,当你知道可以在Linux终端中不需要网页浏览器来执行PHP时,你或许会大为惊讶。

本文将阐述PHP脚本语言的命令行方面。

1.
在安装完PHP和Apache2后,我们需要安装PHP命令行解释器。

  1. # apt-get install php5-cli [Debian 及类似系统]
  2. # yum install php-cli [CentOS 及类似系统]

接下来我们通常要做的是,在/var/www/html(这是
Apache2
在大多数发行版中的工作目录)这个位置创建一个内容为 <?php phpinfo(); ?>,名为 infophp.php 的文件来测试(PHP是否安装正确),执行以下命令即可。

  1. # echo '<?php phpinfo(); ?>' > /var/www/html/infophp.php

然后,将浏览器访问  ,这将会在网络浏览器中打开该文件。

澳门新浦京电子游戏 3

检查PHP信息

不需要任何浏览器,在Linux终端中也可以获得相同的结果。在Linux命令行中执行/var/www/html/infophp.php,如:

  1. # php -f /var/www/html/infophp.php

澳门新浦京电子游戏 4

从命令行检查PHP信息

由于输出结果太大,我们可以通过管道将上述输出结果输送给 less 命令,这样就可以一次输出一屏了,命令如下:

  1. # php -f /var/www/html/infophp.php | less

澳门新浦京电子游戏 5

检查所有PHP信息

这里,‘-f‘选项解析并执行命令后跟随的文件。

2.
我们可以直接在Linux命令行使用phpinfo()这个十分有价值的调试工具而不需要从文件来调用,只需执行以下命令:

  1. # php -r 'phpinfo();'

澳门新浦京电子游戏 6

PHP调试工具

这里,‘-r‘
选项会让PHP代码在Linux终端中不带<>标记直接执行。

3.
以交互模式运行PHP并做一些数学运算。这里,‘-a‘
选项用于以交互模式运行PHP。

  1. # php -a
  2. Interactive shell
  3. php > echo 2+3;
  4. 5
  5. php > echo 9-6;
  6. 3
  7. php > echo 5*4;
  8. 20
  9. php > echo 12/3;
  10. 4
  11. php > echo 12/5;
  12. 2.4
  13. php > echo 2+3-1;
  14. 4
  15. php > echo 2+3-1*3;
  16. 2
  17. php >exit

输入 ‘exit‘ 或者按下 ‘ctrl+c‘
来关闭PHP交互模式。

澳门新浦京电子游戏 7

启用PHP交互模式

4.
你可以仅仅将PHP脚本作为shell脚本来运行。首先,创建在你当前工作目录中创建一个PHP样例脚本。

  1. # echo -e '#!/usr/bin/phpn<?php phpinfo(); ?>' > phpscript.php

注意,我们在该PHP脚本的第一行使用#!/usr/bin/php,就像在shell脚本中那样(/bin/bash)。第一行的#!/usr/bin/php告诉Linux命令行用
PHP 解释器来解析该脚本文件。

其次,让该脚本可执行:

  1. # chmod 755 phpscript.php

接着来运行它,

  1. # ./phpscript.php

5.
你可以完全靠自己通过交互shell来创建简单函数,这你一定会被惊到了。下面是循序渐进的指南。

开启PHP交互模式。

  1. # php -a

创建一个函数,将它命名为 addition。同时,声明两个变量 $a 和 $b

  1. php >function addition ($a, $b)

使用花括号来在其间为该函数定义规则。

  1. php >{

定义规则。这里,该规则讲的是添加这两个变量。

  1. php { echo $a + $b;

所有规则定义完毕,通过闭合花括号来封装规则。

  1. php {}

测试函数,添加数字4和3,命令如下:

  1. php > var_dump (addition(4,3));

 

  • 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

验证一下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

样例输出

  1. 7NULL

你可以运行以下代码来执行该函数,你可以测试不同的值,你想来多少次都行。将里头的
a 和 b 替换成你自己的值。

  1. php > var_dump (addition(a,b));

  1. php > var_dump (addition(9,3.3));

 

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

总结

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

样例输出

  1. 12.3NULL

澳门新浦京电子游戏 8

创建PHP函数

你可以一直运行该函数,直至退出交互模式(ctrl+z)。同时,你也应该注意到了,上面输出结果中返回的数据类型为
NULL。这个问题可以通过要求 php 交互 shell用 return 代替 echo
返回结果来修复。

只需要在上面的函数的中 ‘echo‘ 声明用
‘return‘ 来替换

替换

  1. php { echo $a + $b;

  1. php {return $a + $b;

剩下的东西和原理仍然一样。

这里是一个样例,在该样例的输出结果中返回了正确的数据类型。

澳门新浦京电子游戏 9

PHP函数

永远都记住,用户定义的函数不会从一个shell会话保留到下一个shell会话,因此,一旦你退出交互shell,它就会丢失了。

希望你喜欢此次教程。保持连线,你会获得更多此类文章。保持关注,保持健康。请在下面的评论中为我们提供有价值的反馈。点赞并分享,帮助我们扩散。

PHP 7
,你值得拥有  

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

CentOS 6.3 安装LNMP (PHP
5.4,MyySQL5.6) 

在部署LNMP的时候遇到Nginx启动失败的2个问题 

Ubuntu安装Nginx
php5-fpm
MySQL(LNMP环境搭建) 

《细说PHP》高清扫描PDF+光盘源码+全套教学视频 

CentOS
6中配置PHP的LNMP的开发环境  

PHP
的详细介绍
:请点这里
PHP
的下载地址
:请点这里

还请阅读: 12个Linux终端中有用的的PHP命令行用法——第二部分


via: 

作者:Avishek
Kumar 译者:GOLinux 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

本文永久更新链接地址

【第二篇
高级用法】

本文旨在让你了解一些相当不错的Linux终端中的PHP交互性 shell 的用法特性。

 

让我们先在PHP 的交互shell中来对php.ini设置进行一些配置吧。

 

6. 设置PHP命令行提示符

 

要设置PHP命令行提示,你需要在Linux终端中使用下面的php
-a(启用PHP交互模式)命令开启一个PHP交互shell。

 

  1. $ php -a

 

然后,设置任何东西(比如说Hi Tecmint
::)作为PHP交互shell的命令提示符,操作如下:

 

  1. php >#cli.prompt=Hi Tecmint ::

 

澳门新浦京电子游戏 10

 

启用PHP交互Shell

 

同时,你也可以设置当前时间作为你的命令行提示符,操作如下:

 

  1. php >#cli.prompt=`echo date('H:m:s');` >
  2. 22:15:43>

 

7. 每次输出一屏

 

在我们上一篇文章中,我们已经在原始命令中通过管道在很多地方使用了less命令。通过该操作,我们可以在那些不能一屏全部输出的地方获得分屏显示。但是,我们可以通过配置php.ini文件,设置pager的值为less以每次输出一屏,操作如下:

 

  1. $ php -a
  2. php >#cli.pager=less

 

澳门新浦京电子游戏 11

 

限制PHP屏幕输出

 

这样,下次当你运行一个命令(比如说条调试器phpinfo();)的时候,而该命令的输出内容又太过庞大而不能固定在一屏,它就会自动产生适合你当前屏幕的输出结果。

 

  1. php > phpinfo();

 

澳门新浦京电子游戏 12

 

PHP信息输出

 

8. 建议和TAB补全

 

PHP
shell足够智能,它可以显示给你建议和进行TAB补全,你可以通过TAB键来使用该功能。如果对于你想要用TAB补全的字符串而言有多个选项,那么你需要使用两次TAB键来完成,其它情况则使用一次即可。

 

如果有超过一个的可能性,请使用两次TAB键。

 

  1. php > ZIP [TAB][TAB]

 

如果只有一个可能性,只要使用一次TAB键。

 

  1. php >#cli.pager [TAB]

 

你可以一直按TAB键来获得建议的补全,直到该值满足要求。所有的行为都将记录到~/.php-history文件。

 

要检查你的PHP交互shell活动日志,你可以执行:

 

  1. $ nano ~/.php_history | less

 

澳门新浦京电子游戏 13

 

检查PHP交互Shell日志

 

9. 你可以在PHP交互shell中使用颜色,你所需要知道的仅仅是颜色代码。

 

使用echo来打印各种颜色的输出结果,类似这样:

 

  1. php > echo "color_code1 TEXT second_color_code";

 

具体来说是:

 

  1. php > echo "33[0;31m Hi Tecmint x1B[0m";

 

澳门新浦京电子游戏 14

 

在PHP Shell中启用彩色

 

到目前为止,我们已经看到,按回车键意味着执行命令,然而PHP
Shell中各个命令结尾的分号是必须的。

 

10. 在PHP shell中用basename()输出路径中最后一部分

 

PHP shell中的basename函数可以从给出的包含有到文件或目录路径的最后部分。

 

basename()样例#1和#2。

 

  1. php > echo basename("/var/www/html/wp/wp-content/plugins");
  2. php > echo basename("www.tecmint.com/contact-us.html");

 

上述两个样例将输出:

 

  1. plugins
  2. contact-us.html

 

澳门新浦京电子游戏 15

 

在PHP中打印基本名称

 

11.
你可以使用PHP交互shell在你的桌面创建文件(比如说test1.txt),就像下面这么简单

 

  1. php> touch("/home/avi/Desktop/test1.txt");

 

我们已经见识了PHP交互shell在数学运算中有多优秀,这里还有更多一些例子会令你吃惊。

 

12. 使用PHP交互shell打印比如像tecmint.com这样的字符串的长度

 

strlen函数用于获取指定字符串的长度。

 

  1. php > echo strlen("tecmint.com");

 

澳门新浦京电子游戏 16

 

在PHP中打印字符串长度

 

13. PHP交互shell可以对数组排序,是的,你没听错

 

声明变量a,并将其值设置为array(7,9,2,5,10)。

 

  1. php > $a=array(7,9,2,5,10);

 

对数组中的数字进行排序。

 

  1. php > sort($a);

 

以排序后的顺序打印数组中的数字,同时打印序号,第一个为[0]。

 

  1. php > print_r($a);
  2. Array
  3. (
  4. [0]=>2
  5. [1]=>5
  6. [2]=>7
  7. [3]=>9
  8. [4]=>10
  9. )

 

澳门新浦京电子游戏 17

 

在PHP中对数组排序

 

14. 在PHP交互Shell中获取π的值

 

  1. php > echo pi();
  2. 3.1415926535898

 

15. 打印某个数比如32的平方根

 

  1. php > echo sqrt(150);
  2. 12.247448713916

 

16. 从0-10的范围内挑选一个随机数

 

  1. php > echo rand(0,10);

 

澳门新浦京电子游戏 18

 

在PHP中获取随机数

 

17. 获取某个指定字符串的md5校验和sha1校验,例如,让我们在PHP
Shell中检查某个字符串(比如说avi)的md5校验和sha1校验,并交叉校验bash
shell生成的md5校验和sha1校验的结果。

 

  1. php > echo md5(avi);
  2. 3fca379b3f0e322b7b7967bfcfb948ad
  3. php > echo sha1(avi);
  4. 8f920f22884d6fea9df883843c4a8095a2e5ac6f

 


 

  1. $ echo -n avi | md5sum
  2. 3fca379b3f0e322b7b7967bfcfb948ad-
  3. $ echo -n avi | sha1sum
  4. 8f920f22884d6fea9df883843c4a8095a2e5ac6f-

 

澳门新浦京电子游戏 19

 

在PHP中检查md5校验和sha1校验

 

这里只是PHP Shell中所能获取的功能和PHP
Shell的交互特性的惊鸿一瞥,这些就是到现在为止我所讨论的一切。保持连线,在评论中为我们提供你有价值的反馈吧。为我们点赞并分享,帮助我们扩散哦。

 

PHP 7 ,你值得拥有  

 

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

 

CentOS 6.3 安装LNMP (PHP
5.4,MyySQL5.6) 

 

在部署LNMP的时候遇到Nginx启动失败的2个问题 

 

Ubuntu安装Nginx php5-fpm
MySQL(LNMP环境搭建) 

 

《细说PHP》高清扫描PDF+光盘源码+全套教学视频 

 

CentOS
6中配置PHP的LNMP的开发环境  

 

PHP
的详细介绍
:请点这里
PHP
的下载地址
:请点这里

 


 

via: 

 

作者:Avishek
Kumar 译者:GOLinux 校对:wxy

 

本文由 LCTT 原创翻译,Linux中国 荣誉推出

 

本文永久更新链接地址

 

$ 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的应用面临着各种各样的攻击:

  • 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所编译的模块

$ 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是不必要的。那么可以通过删除或重命名/etc/php.d/sqlite3.ini文件来取消它:

# 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

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

  #3:防止PHP信息泄漏

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

expose_php=Off

  expose_php会在HTTP
Header中添加服务器上,包括版本在内的PHP信息(例如X-Powered-By:
PHP/5.3.3)。同时,PHP的全局统一标识符也会暴露。如果export_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 
 ...

  建议同时隐藏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模块:

# cd /etc/php.d/
 # mv gd.{ini,disable}
 # /sbin/service httpd restart

  启用则是:

# mv gd.{disable,ini}
 # /sbin/service httpd restart

  #5:记录所有PHP错误

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

display_errors=Off

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

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

  #6:禁止文件上传

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

file_uploads=Off

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

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来关闭该特性:

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

magic_quotes_gpc=Off

  #9:控制POST的数据大小

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

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

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

<Directory /var/www/html>
     <LimitExcept GET POST>
         Order allow,deny
     </LimitExcept>
 ## Add rest of the config goes here... ##
 </Directory>

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

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

  # 单位:秒

max_execution_time = 30
max_input_time = 30
memory_limit = 40M

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

  具体参考Suhosin项目页:project
page

  #12:取消危险的PHP函数

  PHP有大量可用于入侵服务器的函数,如使用不当则会成为漏洞。如下取消这些函数:

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协同工作。Fastcgi可以减少Web服务器的内存足迹(memory
footprint),并改善PHP性能。可以参考这个来配置Apache2+PHP+FastCGI。在这个配置中,cgi.force_redirect会阻止用户通过访问URL来调用PHP。为安全考虑,启用该特性:

; Enable cgi.force_redirect for security reasons in a typical *Apache+PHP-CGI/FastCGI* setup
 cgi.force_redirect=On

  #14:PHP用户与用户组ID

  mod_fastcgi是Apache
Web服务的一个cgi模块,可连接到外部的FASTCGI服务器。你需要确保PHP使用非root用户运行。若其使用root或是UID小于100的用户权限,它就可以访问,乃至操作系统文件。通过Apache’s
suEXEC或mod_suPHP,可在非特权用户下执行PHP
CGI。suEXEC可以是Apache调用CGI程序的user ID不同于运行Apache的user
ID。如下:

# 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

  可以通过spawn-fcgi来生成phpcgi用户的远程或本地FastCGI进程(前提是有这个用户):

# spawn-fcgi -a 127.0.0.1 -p 9000 -u phpcgi -g phpcgi -f /usr/bin/php-cgi

  现在可以配置Apache、Lighthttpd或Nginx
Web服务调用运行在127.0.0.1:9000的FastCGI。

  #15:限制PHP访问文件系统

  open_basedir会限制PHP的运行目录,例如通过fopen()之类的函数可访问的目录。如果访问的目录不在open_basedir之内,PHP会拒绝该访问。不要使用软链接作为工作区。例如,只允许访问/var/www/html而非/var/www、/tmp或/etc目录:

; 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:Session路径

  PHP
Session用户提供数据保存功能,以便后续访问。这可以使应用可定制性更强,提升吸引力。所有Session相关的数据会被保存在session.save_path中。RHEL/CentOS/Fedora
Linux的默认设置如下:

session.save_path="/var/lib/php/session"
 ; Set the temporary directory used for storing files when doing file upload
 upload_tmp_dir="/var/lib/php/session"

  确认这个路径在/var/www/html之外,且不可被其他系统用户访问:

# ls -Z /var/lib/php/

  样例输出:

drwxrwx---. root apache system_u:object_r:httpd_var_run_t:s0 session

  注:ls
-Z会显示SELinux的安全信息,如文件模式,user,group,安全信息,文件名等。

  #17:保证PHP,软件及操作系统更新到最新

  维护Linux、Apache、PHP和MySQL服务器的一项重要工作是更新安全补丁。所有的PHP安全更新应尽快进行审查并更新。可使用如下命令(如果通过包管理器来安装PHP):

# yum update

  或

# apt-get update && apt-get upgrade

  可以配置Red Hat / CentOS / Fedora
Linux通过Email发送yum的包更新提醒,或是Debian / Ubuntu
Linux下的apticron发送提醒。又或通过cron计划任务进行更新。

  注:查看php.net以获取最新的PHP版本信息

  #18:限制文件及目录访问

  确认以Apache或www这种非root用户运行Apache。/var/www/html目录下的owner也应是非root用户:

# chown -R apache:apache /var/www/html/

  DocumentRoot下的文件应禁止运行或创建。设置该目录下的文件权限为0444(只读):

# chmod -R 0444 /var/www/html/

  设置该目录下的所有文件夹权限为0445

# find /var/www/html/ -type d -print0 | xargs -0 -I {} chmod 0445 {}

  #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/

  同样可以为/var/www/html目录加上写入保护

# chattr +i /var/www/html/file1.php# chattr +i /var/www/html/

  #20:使用Linux安全拓展(如SELinux)

  Linux有各种安全方案来防止服务程序的错误配置或漏洞。尽可能使用SELinux或其他Linux安全方案限制网络和程序。例如,SELinux为Linux内核或Apache
Web服务提供不同的安全策略。使用下面命令列出所有Apache保护信息:

# 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

  详细参考:Red Hat SELinux
guide

  #21:安装Mod_security

  ModSecurity是一个开源的入侵检测和防范的Web应用引擎。安装mod_security可以保护Apache和PHP应用免受XSS和其他攻击:

## A few Examples ##
 # Do not allow to open files in /etc/
 SecFilter /etc/

 # Stop SQL injection
 SecFilter "delete[[:space:]]+from"
 SecFilter "select.+from"

  #22:如有可能,在Chroot Jail下运行Apache / PHP

  在Chroot Jail下运行Apache /
PHP可以最小化可能受到的损失,使其局限于文件系统下的一小块。可以使用一般的chroot来配置Apache:chroot
kind of setup with
Apache。不过我建议使用FreeBSD
jails、XEN,KVM或OpenVZ虚拟化。

  #23:使用防火墙限制传出连接

  攻击者会使用wget之类的工具从你的Web服务器下载文件。使用iptables来阻挡Apache用户的传出连接。ipt_owner模块会为本地数据包的生成者分配不同角色。它只对OUTPUT
chain有效。下面指令允许vivek用户通过80端口进行外部访问:

/sbin/iptables -A OUTPUT -o eth0 -m owner --uid-owner vivek -p tcp --dport 80 -m state --state NEW,ESTABLISHED  -j ACCEPT

  下面的样例则是阻挡所有Apache用户的传出连接,只允许smtp服务及spam识别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

  查看日志文件可以让你知道服务器正在承受何种攻击,并分析当前安全级别是否足够。启用审查服务用于系统审查,可审查SELinux时间,验证事件,文件修改,账号修改等。建议使用Linux
System Monitoring Tools来监控Web服务器。

  #25:把服务分离到不同的服务器或虚拟机

  对于比较庞大的安装配置,建议把运行、数据库、静态与动态内容分离到不同的服务器

///////////////
 / ISP/Router /
 //////////////
   
    |
    Firewall
      
       |
      +------------+
      | LB01       |
      +------------+                 +--------------------------+
                   |                 | static.lan.cyberciti.biz |
                   +-----------------+--------------------------+
                                     | phpcgi1.lan.cyberciti.biz|
                                     +--------------------------+
                                     | phpcgi2.lan.cyberciti.biz|
                                     +--------------------------+
                                     | mysql1.lan.cyberciti.biz |
                                     +--------------------------+
                                     | mcache1.lan.cyberciti.biz|
                                     +--------------------------+

  在不同的服务器或虚拟机下运行不同的网络服务,这可以减少被入侵对其他服务的影响。例如,一个攻击者入侵了Apache,那就可以访问同一服务器下的其他服务(如MySQL,email服务等)。但在上述例子中则不会:

  • static.lan.cybercity.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来适应任意连接数。而且它使用的是非阻塞网络IO。
  • LB01 –
    一个Nginx服务器,用于Web及Apache前端的反向代理。所有的访问连接会通过nginx代理服务,被直接处理或分发到相应的Web服务器。LB01提供简单的负载均衡。

发表评论

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