1. 系统及软件包更新
保持CentOS系统和PHP及相关软件包为最新版本,及时安装安全补丁,修复已知漏洞。使用sudo yum update命令更新系统,确保PHP(如php-cli、php-fpm、php-mysqlnd等)及依赖包同步升级。
2. 防火墙配置
使用Firewalld精细控制服务器网络访问,仅开放必要端口(如HTTP的80端口、HTTPS的443端口),阻止非法IP或端口的访问。执行以下命令配置:
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
3. 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 = On(允许上传),但限制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秒,控制会话有效期)。4. Web服务器安全配置
/etc/httpd/conf/httpd.conf或站点配置文件,禁用目录列表(Options -Indexes),限制访问权限(Require all granted仅允许可信IP),并关闭不必要的模块(如mod_autoindex)。/etc/nginx/nginx.conf或站点配置文件,使用try_files指令防止目录遍历,限制fastcgi_pass仅监听Unix socket(如unix:/run/php-fpm/www.sock),并添加limit_req_zone限制请求频率(防DDoS)。sudo systemctl restart httpd(Apache)或sudo systemctl restart nginx(Nginx)。5. 安全模块部署
sudo yum install mod_security -y安装,启用后配置规则集(如OWASP Core Rule Set)。/etc/php-fpm.d/www.conf,设置user和group为非root用户(如apache),限制security.limit_extensions(仅允许.php文件执行),防止权限提升。6. 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。
7. 数据库安全防护
/etc/my.cnf),设置mysqli.allow_local_infile = Off(禁用本地文件加载)、mysqli.allow_persistent_connections = Off(禁用持久连接),减少数据库漏洞。$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username');
$stmt->execute(['username' => $username]);
$user = $stmt->fetch();
8. 输入验证与输出编码
对用户输入的数据进行严格验证(如检查邮箱格式、手机号长度)和清理(如使用htmlspecialchars函数转义HTML特殊字符),防止XSS攻击。示例:
$user_input = $_POST['comment'];
$safe_output = htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
echo $safe_output;
9. 文件上传安全
upload_max_filesize和post_max_size限制上传文件大小,使用accept属性(HTML)或pathinfo函数(PHP)限制文件类型(如仅允许.jpg,.png,.pdf)。/var/www/uploads),并通过open_basedir限制PHP脚本访问,防止上传恶意脚本被执行。10. 日志与监控
error_log = /var/log/php_errors.log)、Web服务器访问日志(如Apache的/var/log/httpd/access_log)和错误日志(/var/log/httpd/error_log),定期检查异常记录(如大量404请求、POST请求)。Lynis进行系统漏洞扫描,及时修复风险。11. 备份与恢复
定期备份网站数据(包括PHP文件、数据库、配置文件),使用rsync或tar命令备份至异地(如云存储),并测试恢复流程。示例备份脚本:
#!/bin/bash
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d)
mkdir -p $BACKUP_DIR/$DATE
rsync -avz --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天前的备份