CentOS环境下运行PHP应用,安全配置这件事,不是锦上添花,而是底线要求。很多攻击手段看起来复杂,但实际操作中,往往是因为最基本的配置疏漏才给了可乘之机。下面逐一拆解,把该做的事情落到实处。
系统及软件包更新
先把系统拉到最新状态——这也是性价比最高的防御手段。及时安装CentOS和PHP的安全补丁,能直接堵上已知漏洞。跑一遍sudo yum update,同时确保php-cli、php-fpm、php-mysqlnd这些依赖包同步升级,基础防线就有了。

防火墙配置
服务器不是公共广场,得把门守住。用Firewalld做精细控制,只开放HTTP(80端口)和HTTPS(443端口)这类必要端口,其他一律封死。操作很简单:
sudo yum install firewalld -y
sudo systemctl start firewalld
sudo systemctl enable firewalld
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
sudo firewall-cmd --zone=public --add-port=443/tcp --permanent
sudo firewall-cmd --reload
PHP配置安全优化
编辑/etc/php.ini文件,这一块值得多花点心思。几个关键参数,直接影响安全水平:
- 关闭错误显示:把
display_errors设为Off,避免数据库凭据、服务器路径这些敏感信息直接暴露给用户。同时开启log_errors = On,把错误日志写到/var/log/php_errors.log(记得先创建目录并给权限)。 - 限制文件访问范围:用
open_basedir指定PHP脚本能访问的目录,比如/var/www/html:/tmp,防止脚本跨目录搞事情。 - 禁用危险函数:在
disable_functions里把eval、exec、shell_exec、system、passthru、curl_exec这些高危函数统统禁掉,不给恶意代码执行留后门。 - 约束文件上传:把
file_uploads保持开启(毕竟功能需要),但upload_max_filesize限制在2M,post_max_size限制在8M,同时验证文件类型,只允许图片、文档等安全格式。 - 强化会话安全:开启
session.cookie_httponly防止XSS窃取Cookie,session.cookie_secure确保只在HTTPS下传输,session.cookie_samesite = Strict限制跨站请求,再把session.gc_maxlifetime设为1440秒,控制会话有效期。
Web服务器安全配置
Apache和Nginx的配置重点不同,分开说:
- Apache:编辑
/etc/httpd/conf/httpd.conf或站点配置文件,禁用目录列表(Options -Indexes),用Require all granted只允许可信IP访问,把不需要的模块(比如mod_autoindex)关掉。 - Nginx:编辑
/etc/nginx/nginx.conf或站点配置,用try_files指令防止目录遍历,把fastcgi_pass改成只监听Unix socket(比如unix:/run/php-fpm/www.sock),再加上limit_req_zone限制请求频率,防DDoS。配置完后记得重启服务:sudo systemctl restart httpd或sudo systemctl restart nginx。
安全模块部署
两个实用工具值得装上:
- ModSecurity:开源的Web应用防火墙(WAF),专门拦截SQL注入、XSS、CSRF这类常见攻击。跑
sudo yum install mod_security -y安装,启用后配置OWASP Core Rule Set规则集。 - PHP-FPM安全设置:编辑
/etc/php-fpm.d/www.conf,把user和group设成非root用户(比如apache),限制security.limit_extensions只允许.php文件执行,防止权限提升。
HTTPS加密通信
传输过程不加密,等于在互联网上裸奔。用Let's Encrypt或商业证书启用HTTPS,防止中间人攻击。安装Certbot:
sudo yum install certbot python3-certbot-apache -y(Apache)或sudo yum install certbot python3-certbot-nginx -y(Nginx)
运行sudo certbot --apache或sudo certbot --nginx,按提示完成证书申请和自动配置,顺便让HTTP自动重定向到HTTPS。
数据库安全防护
数据库那边也不能放松:
- 参数配置:修改MySQL/MariaDB的
/etc/my.cnf,设置mysqli.allow_local_infile = Off禁用本地文件加载,mysqli.allow_persistent_connections = Off禁用持久连接,减少数据库层面的风险入口。 - 查询安全:始终使用预处理语句(PDO或MySQLi)来防SQL注入,这是铁律。示例:
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username'); $stmt->execute(['username' => $username]); $user = $stmt->fetch();
输入验证与输出编码
用户提交的数据,默认都是不可信的。严格验证邮箱格式、手机号长度这些信息,再用htmlspecialchars转义HTML特殊字符,XSS攻击基本就能挡掉大半。示例:
$user_input = $_POST['comment'];
$safe_output = htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
echo $safe_output;
文件上传安全
上传功能是很多攻击的突破口,必须双重保险:
- 限制类型与大小:通过
upload_max_filesize和post_max_size卡死文件大小,用accept属性(HTML)或pathinfo函数(PHP)验证文件类型,只允许.jpg、.png、.pdf这类安全格式。 - 隔离存储路径:把上传文件放在Web根目录之外(比如
/var/www/uploads),再配合open_basedir限制PHP脚本访问,就算有人上传了恶意脚本也执行不了。
日志与监控
安全不是配完就完,得有人盯着。配置PHP错误日志(error_log = /var/log/php_errors.log)、Web服务器的访问日志(Apache的/var/log/httpd/access_log)和错误日志(/var/log/httpd/error_log),定期翻翻看看有没有大量404请求或异常POST请求。另外,用Fail2Ban监控日志,自动封禁暴力破解SSH的IP,再用Lynis这类工具做系统漏洞扫描,发现问题及时修。
备份与恢复
最后是兜底方案——备份。不备份等于没有安全感。用rsync或tar把PHP文件、数据库、配置文件打包,存到异地(比如云存储),然后定期测试恢复流程。一个实用的备份脚本参考:
#!/bin/bash
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d)
mkdir -p $BACKUP_DIR/$DATE
rsync -a vz --delete /var/www/html/ $BACKUP_DIR/$DATE/html
mysqldump -u root -p'your_password' your_database | gzip > $BACKUP_DIR/$DATE/db.sql.gz
find $BACKUP_DIR -type d -mtime +7 -exec rm -rf {} \; # 删除7天前的备份