1. 系统与PHP版本更新
保持Ubuntu系统和PHP及其扩展为最新版本,及时修复已知安全漏洞。使用以下命令更新系统及PHP:
sudo apt update && sudo apt upgrade -y
sudo apt install php php-cli php-fpm php-mysql php-curl php-xml php-zip php-gd php-mbstring php-pear php-bcmath --only-upgrade
定期检查Ubuntu安全公告和PHP官方更新,确保第一时间应用补丁。
2. PHP配置文件安全优化
编辑PHP配置文件(根据运行模式选择/etc/php/{version}/apache2/php.ini或/etc/php/{version}/fpm/php.ini),调整以下关键参数:
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
disable_functions = eval,exec,system,passthru,shell_exec,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
upload_max_filesize = 2M
post_max_size = 8M
file_uploads = On
在Web服务器配置中添加规则(如Nginx的deny all或Apache的<FilesMatch "\.(php|php5|php7)$">deny all</FilesMatch>)。3. Web服务器安全配置
mod_security(Web应用防火墙)和mod_evasive(防暴力破解),隐藏版本信息。sudo apt install libapache2-mod-security2
sudo a2enmod security2 evasive20
在配置文件中添加:ServerTokens Prod
Header unset X-Powered-By
xmlrpc.php),限制敏感页面访问(如登录页仅允许可信IP)。location = /xmlrpc.php { deny all; }
location = /wp-login.php { allow 192.168.1.1; deny all; }
确保server_tokens off;关闭版本信息。4. 安全模块与防火墙
sudo aa-status # 查看状态
sudo aa-enforce /etc/apparmor.d/usr.sbin.php-fpm # 强制生效
sudo apt install ufw
sudo ufw allow 'Nginx Full' # 或 'Apache Full'
sudo ufw allow ssh
sudo ufw enable
sudo apt install fail2ban
sudo systemctl enable --now fail2ban
复制配置文件cp /etc/fail2ban/jail.local /etc/fail2ban/jail.local.local并修改阈值。5. 会话与会话安全管理
HttpOnly(防止XSS窃取Cookie)、Secure(仅HTTPS传输)属性。session.cookie_httponly = On
session.cookie_secure = On
session.gc_maxlifetime = 3600
password_hash()函数存储用户密码(默认使用 bcrypt 算法),避免明文存储。$hashed_password = password_hash('user_password', PASSWORD_DEFAULT);
验证密码时使用password_verify()函数。6. 数据库安全防护
SELECT、INSERT),避免使用root账户连接。CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT SELECT, INSERT, UPDATE ON app_db.* TO 'app_user'@'localhost';
FLUSH PRIVILEGES;
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email");
$stmt->bindParam(':email', $email);
$stmt->execute();
$user = $stmt->fetch();
ssl-ca参数)。7. HTTPS加密与证书管理
使用Let’s Encrypt免费获取SSL证书,启用HTTPS加密数据传输,防止中间人攻击。
sudo apt install certbot python3-certbot-apache # Apache
# 或
sudo apt install certbot python3-certbot-nginx # Nginx
sudo certbot --apache -d yourdomain.com # 替换为你的域名
sudo certbot --nginx -d yourdomain.com
证书到期前自动续期(Let’s Encrypt支持自动续期)。
8. 日志监控与安全审计
/var/log/apache2/access.log/error.log或/var/log/nginx/access.log/error.log)开启,并定期检查异常请求(如大量404错误、POST请求到敏感页面)。auditd监控PHP文件变动(如上传目录、配置文件),及时发现非法篡改。sudo apt install auditd
sudo auditctl -w /var/www/html -p wa -k php_files # 监控/var/www/html目录
sudo ausearch -k php_files # 查看监控日志
9. 文件与目录权限控制
www-data用户(Web服务器运行用户),目录权限设为755(允许遍历),文件权限设为644(禁止写入)。sudo chown -R www-data:www-data /var/www/html
sudo find /var/www/html -type d -exec chmod 755 {} \;
sudo find /var/www/html -type f -exec chmod 644 {} \;
/uploads)设置为755,禁止执行PHP文件(通过Web服务器配置),防止上传恶意脚本。10. 安全编码实践
filter_var()函数验证邮箱、手机号),拒绝非法字符。$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
if (!$email) {
die("Invalid email address");
}
htmlspecialchars()函数转义特殊字符(如<、>),防止XSS攻击。echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');