1. 更新系统与PHP至最新版本
保持系统和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
2. 配置PHP核心安全参数
编辑PHP配置文件(根据运行模式选择cli、apache2或fpm版本,如/etc/php/8.1/apache2/php.ini),调整以下核心参数:
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
disable_functions = eval,exec,system,passthru,shell_exec,popen,curl_exec,parse_ini_file,show_source
upload_max_filesize = 2M
post_max_size = 8M
file_uploads = On
open_basedir约束PHP脚本仅能访问指定目录(如网站根目录和临时目录)。open_basedir = /var/www/html:/tmp
allow_url_fopen或allow_url_include加载远程恶意代码。allow_url_fopen = Off
allow_url_include = Off
3. 配置Web服务器安全
/etc/apache2/apache2.conf)或虚拟主机文件,隐藏服务器版本信息并禁用目录列表:ServerTokens Prod
ServerSignature Off
<Directory /var/www/html>
Options -Indexes
</Directory>
启用mod_security(Web应用防火墙)和mod_evasive(防暴力破解)模块:sudo a2enmod security2
sudo a2enmod evasive2
sudo systemctl restart apache2
Server头信息(需安装headers-more-nginx模块):server_tokens off;
4. 强化会话安全管理
在PHP代码或配置文件中设置会话安全参数,防止会话劫持:
session.cookie_httponly = On # 禁止JavaScript访问会话Cookie
session.cookie_secure = On # 仅通过HTTPS传输会话Cookie
session.gc_maxlifetime = 1440 # 设置会话有效期为1440秒(24分钟)
session.use_strict_mode = On # 启用严格会话模式,防止会话固定攻击
5. 使用HTTPS加密通信
通过Let’s Encrypt获取免费SSL证书,强制使用HTTPS传输数据:
sudo apt install certbot python3-certbot-apache -y
sudo certbot --apache -d yourdomain.com -d www.yourdomain.com
证书自动续期可通过以下命令测试:
sudo certbot renew --dry-run
6. 配置防火墙与入侵防护
sudo ufw allow 'Apache Full' # 允许HTTP/HTTPS
sudo ufw allow ssh # 允许SSH
sudo ufw enable # 启用防火墙
sudo apt install fail2ban -y
sudo cp /etc/fail2ban/jail.local /etc/fail2ban/jail.local.bak
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
7. 管理文件与目录权限
确保PHP文件和目录的权限合理,避免未授权访问:
sudo chown -R www-data:www-data /var/www/html # 将所有权赋予Web服务器用户
sudo chmod -R 755 /var/www/html # 设置目录权限为755(所有者可读写执行,其他用户仅读执行)
sudo find /var/www/html -type f -exec chmod 644 {} \; # 设置文件权限为644(所有者可读写,其他用户仅读)
8. 定期安全审计与监控
PHP Security Advisories Checker扫描代码,查找已知漏洞。/var/log/php_errors.log)和Web服务器日志(/var/log/apache2/access.log、/var/log/apache2/error.log),识别可疑活动。auditd监控关键目录(如/var/www/html)的文件变更:sudo apt install auditd -y
sudo auditctl -w /var/www/html -p wa -k php_files # 监控写入和属性变更
9. 使用安全编码实践
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email");
$stmt->execute(['email' => $email]);
$user = $stmt->fetch();
password_hash()函数存储用户密码,password_verify()验证密码。$hashed_password = password_hash($password, PASSWORD_DEFAULT);
if (password_verify($input_password, $hashed_password)) {
// 密码匹配
}
10. 限制PHP-FPM安全设置(若使用PHP-FPM)
编辑PHP-FPM池配置文件(/etc/php/8.1/fpm/pool.d/www.conf),限制进程权限:
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
user = www-data
group = www-data
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10
重启PHP-FPM使配置生效:
sudo systemctl restart php8.1-fpm