阅读量:21
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 - 限制PHP访问目录:通过
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服务器安全
- Apache配置:
编辑Apache主配置文件(/etc/apache2/apache2.conf)或虚拟主机文件,隐藏服务器版本信息并禁用目录列表:启用ServerTokens Prod ServerSignature OffOptions -Indexes mod_security(Web应用防火墙)和mod_evasive(防暴力破解)模块:sudo a2enmod security2 sudo a2enmod evasive2 sudo systemctl restart apache2 - Nginx配置:
若使用Nginx,需在配置文件中隐藏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. 配置防火墙与入侵防护
- UFW防火墙:限制对SSH(22端口)和Web服务(80/443端口)的访问,仅允许可信IP访问SSH。
sudo ufw allow 'Apache Full' # 允许HTTP/HTTPS sudo ufw allow ssh # 允许SSH sudo ufw enable # 启用防火墙 - Fail2Ban:防止暴力破解攻击,监控日志文件并自动封禁恶意IP。
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扫描代码,查找已知漏洞。 - 日志监控:定期检查PHP错误日志(
/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. 使用安全编码实践
- 预处理SQL语句:使用PDO或MySQLi扩展的预处理功能,防止SQL注入。
$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