优化 PHP

一. 限制站点目录防止跨站访问
如果 a 目录被黑,这样会被限制到一定范围的目录中,目录最后一定要加上 /,比如 /tmp/,而不是 /tmp

在 Nginx 配置文件中加入

fastcgi_param PHP_VALUE “open_basedir=$document_root:/tmp/:/proc/”;
通常 nginx 的站点配置文件里用了 include fastcgi.conf;,这样的,把这行加在 fastcgi.conf 里就 OK 了。需要重启 nginx

在 php.ini 中加入:

[HOST=www.server110.com]
open_basedir=/home/www/www.server110.com:/tmp/:/proc/
[PATH=/home/www/www.server110.com]
open_basedir=/home/www/www.server110.com:/tmp/:/proc/
这种方式的设置需要重启 php-fpm 后生效。

二. 禁用不安全的 php 函数
因为这些函数有的可以调用系统的命令,比如 reboot 等

修改 php.ini,添加如下

disable_functions = show_source,system,shell_exec,passthru,exec,popen,proc_open,proc_get_status,phpinfo
三.php 用户对站点目录只读权限
将站点目录比如 /usr/local/nginx/html,设置为 755,里面文件为 644,这样 php 用户只能读,不能写,即使有漏洞, 黑客也传不了后门, 更不可能挂木马. 这么干之前告知程序员将文件缓存改为 nosql 内存缓存(例如 memcached、redis 等),上传的文件通过接口传到其他服务器(静态服务器)。

程序生成本地缓存是个非常糟糕的习惯,使用文件缓存速度缓慢、浪费磁盘空间、最重要一点是一般情况下服务器无法横向扩展

以上是摘抄,并不理解这是啥意思。。。。。

四.php 优化
1. 程序一旦出现错误,详细错误信息便立刻展示到用户眼前,其中包含路径、有的甚至是数据库账号密码. 注入渗
透密码基本上都是通过这个报错来猜取。生产环境上强烈关闭它

vim /etc/php.ini

display_errors = On
改为
display_errors = Off
2. 关闭 php 信息,不轻易透露自己 php 版本信息,防止黑客针对这个版本的 php 发动攻击

expose_php = On
改为
expose_php = Off
3. 确保 PHP 检查文件全名 (当它在文件结尾没有发现.php 它将忽略)

cgi.fix_pathinfo=1
改为
cgi.fix_pathinfo=0
五. 上传分离
将文件上传到远程服务器,例如 nfs 等。当然也可以调用你们写好的 php 接口. 即使有上传漏洞,那么文件也被
传到了静态服务器上。木马等文件根本无法执行

例如:www.xx.com 的静态文件地址为内网的 nfs 服务器,但是 nfs 服务器只做存储,并没有安装 php,那样上传后也执行不了木马

六. 禁用 cul
allow_url_fopen = On
改为
allow_url_fopen = Off
其实这点算不上真正的安全, 并不会导致 web 被入侵等问题, 但是这个非常影响性能, 笔者认为它属于狭义的安
全问题.

以下方法将无法获取远程 url 内容
$data = file_get_contents(“http://www.baidu.com/");
以下方法可以获取本地文件内容
$data = file_get_contents(“1.txt”);

如果你的站点访问量不大、数据库也运行良好,但是 web 服务器负载出奇的高,请你直接检查下是否有这个方
法。笔者遇到过太多这个问题,目前生产环境已全线禁用,如果 php 工程师需要获取远程 web 的内容,建议他们
使用 curl.

同样,不太理解这个摘抄的啥意思

一. 基本

查询 php.ini 文件所在位置,可以在编译的时候指定位置
php --ini

查看模块位置
php -m参考

一. 介绍
很多模块当前不用,在编译安装的时候没有编译进去。php 支持将模块单独添加进去,不用重新编译了。

php 可以将源码包中的模块单独编译,然后将编译完的模块在 php.ini 中指定,重启即可加载。

当前模拟添加 curl 模块

二. 操作
1. 移动到源码包中的 ext 文件中
cd /root/tar/php-7.1.1

这个文件夹下每个模块都有一个文件夹,现在移动到 curl 模块文件夹中
cd curl

2. 执行 phpize,如果有多个版本,要执行对应版本
/usr/local/php/bin/phpize

结果类似:
Configuring for:
PHP Api Version: 20151012
Zend Module Api No: 20151012
Zend Extension Api No: 320151012
如果提示有如下报错,安装 m4 和 autoconf
yum -y install m4 autoconf

3. 编译这个模块
./configure –with-php-config=/usr/local/php/bin/php-config
make && make install

结果类似:
Installing shared extensions: /usr/local/php/lib/php/20151012/
在 make 后就会在 modules 下生成一个 curl.so,这个就是编译后的模块。make install 就是将他复制到 php 目录下。

4. 修改配置文件
查看配置文件位置
php –ini

添加如下
vim /usr/local/php/lib/php.ini

extension=curl.so
重启即可
pkill php-fpm
/usr/local/php/sbin/php-fpm

三. 测试
查看模块是否添加
php -m |grep curl

一. 测试是否支持 php
以下脚本放到 web 服务器的网页目录下。
vim test.php

This is HTML message
$d){echo "c is bigger";} else{echo "d is bigger";} ?> curl http://127.0.0.1/test.php 返回 c is bigger,代表 web 服务器支持 php。返回文件内容,则代表当前还不支持 php,需要在 web 服务器中配置,让 nginx 或者 apache 之类的服务去支持 php-fpm。

二. 测试是否可以连接 mysql
以下脚本放到 web 服务器的网页目录下。需要修改脚本,填写正确的账号密码
vim mysql.php

connect_error){ die("连接失败:" . $conn->connect_error); } echo "连接成功"; ?> curl http://127.0.0.1/mysql.php 或者 php mysql.php 显示连接成功,表示 php 脚本已经可以连接 mysql 了。

三. 测试是否可以连接 memcached
以下脚本放到 web 服务器的网页目录下。需要修改脚本,添加正确的端口
vim mem.php

connect('localhost',11211) or die ('could not connect!!'); $memcache->set('key', 'test'); $get_values=$memcache->get('key'); echo $get_values; ?> curl http://127.0.0.1/mem.php 或者 php mem.php 返回 test,表示 php 脚本已经可以连接 memcached 了。

四.phpinfo
这个 phpinfo 可以查看当前 php 版本,模块,读取文件位置