centos如何解决php安全问题
小樊
35
2025-11-29 16:50:02
CentOS 上提升 PHP 安全性的可执行清单
一 系统与网络基线
- 保持系统与软件包为最新,及时修补漏洞:执行命令:sudo yum update。
- 仅开放必要端口,使用 Firewalld 精细化管理:
- 启动并持久化:sudo yum install firewalld && sudo systemctl start firewalld && sudo systemctl enable firewalld
- 放行 HTTP/HTTPS:
- 按端口:sudo firewall-cmd --zone=public --add-port=80/tcp --permanent && sudo firewall-cmd --zone=public --add-port=443/tcp --permanent
- 或按服务:sudo firewall-cmd --permanent --zone=public --add-service=http && sudo firewall-cmd --permanent --zone=public --add-service=https
- 重载规则:sudo firewall-cmd --reload
- 启用 SELinux 强制模式,提供进程与文件的强制访问控制:
- 临时生效:sudo setenforce 1
- 永久生效:编辑 /etc/selinux/config,设置 SELINUX=enforcing
- 加固 SSH:禁用 root 直接登录,优先使用密钥认证(编辑 /etc/ssh/sshd_config:PermitRootLogin no),并重启 sshd。
- 部署 Fail2Ban 监控暴力登录并自动封禁,降低爆破风险。
二 PHP 运行时安全配置
- 编辑 php.ini(路径因 SAPI 与发行版可能不同,如 /etc/php.ini、/etc/php.d/*.ini):
- 关闭错误显示,开启日志记录:
- display_errors = Off
- log_errors = On
- error_log = /var/log/php_errors.log(确保目录与文件可被 Web 服务运行用户写入)
- 限制文件与命令执行面:
- 禁用危险函数(按应用最小化放开):
- disable_functions = exec,passthru,shell_exec,system,proc_open,popen,pcntl_exec,dl,ini_alter,ini_restore,syslog,readlink,symlink,stream_socket_server,fsockopen,phpinfo
- 目录访问隔离:open_basedir = /var/www/html:/tmp(按实际站点根目录调整)
- 上传与会话安全:
- 限制上传:upload_max_filesize = 2M、post_max_size = 8M(按业务适度调整)
- 会话防护:session.cookie_httponly = On、session.cookie_secure = On(启用 HTTPS 时)、session.use_strict_mode = 1
- 资源与执行控制:
- 限制脚本执行时间:max_execution_time = 30
- 限制内存:memory_limit = 128M
- 限制 POST 大小:post_max_size(与上传限制匹配)
- 关闭远程包含:allow_url_fopen = Off、allow_url_include = Off
- 若使用 PHP-FPM(常见于 Nginx 或高并发场景):
- 进程与监听权限最小化(示例):/etc/php-fpm.d/www.conf 中设置
- user = apache、group = apache
- listen.owner = apache、listen.group = apache
- 按虚拟主机或目录设置 open_basedir 与 php_admin_value,实现更细粒度隔离。
三 Web 服务器与加密通信
- 启用 HTTPS/TLS:
- 安装模块:sudo yum install mod_ssl
- 配置证书与密钥(如 /etc/httpd/conf.d/ssl.conf 中设置 SSLCertificateFile、SSLCertificateKeyFile)
- 重启服务:sudo systemctl restart httpd
- 使用强加密套件与协议(禁用 SSLv3/TLS1.0/1.1,优先 TLS1.2/1.3),并开启 HSTS(如 Header always set Strict-Transport-Security “max-age=63072000; includeSubDomains; preload”)。
- 静态资源与上传目录禁止脚本执行(如 Nginx 配置:对 /uploads/、/static/ 设置 location ~ .php$ { deny all; })。
四 应用与数据库安全
- 输入校验与输出编码:对所有用户输入进行校验与清理,输出到页面时进行 HTML 实体编码,降低 XSS 风险。
- 杜绝 SQL 注入:使用 参数化查询/预处理语句(如 PDO 预处理、MySQLi 预处理),避免拼接 SQL。
- 数据库账户最小权限:为应用创建专用低权限数据库账户,避免使用 root;按库/表授予所需权限。
- 文件上传安全:仅允许白名单扩展名与 MIME 类型,限制大小,存储在Web 根目录之外,重命名上传文件,必要时对图片做二次校验(如 getimagesize),并在下载时设置下载而非执行。
五 运维监控与备份
- 日志与审计:
- 确保 error_log 正常写入并定期审计;使用 logrotate 管理日志轮转与保留,避免日志过大与信息泄露。
- 启用系统日志与审计(如 rsyslog/auditd)收集关键事件。
- 入侵防护:部署 Fail2Ban 监控 HTTP/SSH 等日志,自动封禁恶意 IP。
- 备份与恢复:定期备份站点代码与数据库,并进行离线/异地保存与恢复演练;示例:
- 文件:rsync -avz --delete /var/www/html/ /backup/website_backup/
- 数据库:mysqldump -u[用户] -p[密码] [库名] | gzip > /backup/website_backup.sql.gz
- 持续更新与复查:保持 PHP、Web 服务器、框架与依赖库为最新版本,定期复核安全配置基线。