本文目录导读:

PHP 安全托管,核心是防止执行恶意代码、防止文件泄露、防止数据库被脱库。
如果你是指“我怎么安全地管理或部署一个 PHP 项目”,以下是几个关键层面的操作指南,我会从 代码层面 和 服务器/托管环境层面 分开讲。
代码层面的安全托管(开发者自己可控的部分)
这是最基础、最重要的部分,哪怕托管商再安全,代码有漏洞也没用。
-
绝不信任用户输入(过滤 & 转义)
-
SQL注入: 使用 PDO 预处理语句 或 mysqli 预处理,绝对不要用
mysql_query拼接字符串。// 危险做法 $sql = "SELECT * FROM users WHERE id = $_GET[id]"; // 安全做法 (PDO) $stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id"); $stmt->execute([':id' => $_GET['id']]); -
XSS(跨站脚本攻击): 输出到 HTML 时,使用
htmlspecialchars()函数。echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
-
文件上传: 限制文件类型(检查 MIME 和扩展名),重命名文件(不使用用户原始文件名),文件存储到 Web 根目录之外(防止直接通过 URL 访问执行)。
-
-
隐藏敏感配置
- 永远不要在代码中写数据库密码、API Key,使用
.env文件(通过vlucas/phpdotenv读取)或者服务器环境变量。 - 确保
.env文件不能被浏览器访问(放在 public 目录外,或者在 Nginx/Apache 里禁止访问.env、.git目录)。
- 永远不要在代码中写数据库密码、API Key,使用
-
安全的 Session 和 Cookie
- 设置
session.cookie_httponly为 true(防止 JS 读取 Cookie)。 - 设置
session.cookie_secure为 true(强制只有 HTTPS 下才传输)。 - 使用随机、难以猜测的 Session ID,并且定期重置(
session_regenerate_id())。
- 设置
-
禁用危险函数
- 在
php.ini中通过disable_functions禁用掉执行系统命令的函数(除非你特别需要):exec,system,passthru,shell_exec,eval,assert,popen,proc_open等。 - 特别警惕
eval()函数,很多时候安全问题就是因为它能执行任意 PHP 代码。
- 在
服务器/托管环境层面(选择托管商或自己配置)
这部分决定了你的代码能否被安全执行,以及遭遇攻击时能否快速响应。
-
选择安全的托管商(如果你用共享主机)
- PHP 版本: 必须使用仍在官方安全支持的版本(当前主流是 PHP 8.1/8.2/8.3,PHP 7.4 以下早已停止安全更新,非常危险)。
- open_basedir: 好的托管商会开启
open_basedir,限制 PHP 只能访问特定目录(如public_html),即使有文件包含漏洞,也无法读取/etc/passwd等系统文件。 - 禁用危险函数: 上面提到的危险函数是否已被禁用。
- Suhosin 补丁: 有些安全强化型 PHP 会安装 Suhosin,提供额外的防护。
-
如果你是独立服务器/VPS(自己搭建)
- 最小权限原则:
- 文件权限: 文件设置为
644,目录设置为755。chmod不要给 777。 - 所有者分离: Web 服务器(如
www-data)只拥有读和执行权限,写权限只给日志、缓存、上传目录,且这些目录禁止执行PHP(见下一点)。
- 文件权限: 文件设置为
- 禁止上传目录执行 PHP: 这是最常见的漏洞利用点,在 Nginx/Apache 中配置,让
uploads/目录下的.php文件返回 403 或直接下载。# Nginx 示例 location ~ \.php$ { # 排除 uploads 目录 location ~ /uploads/.*\.php$ { deny all; return 403; } fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; # ... } - 使用容器化/虚拟化: 用 Docker 运行 PHP 应用,可以控制 PHP 进程只能访问容器内部文件系统,即使被入侵,攻击者也很难逃逸到宿主机。
- 开启 HTTPS: 使用 Let's Encrypt 免费证书,加密数据传输,在生产环境中,确保
force_redirect和cookie_secure开启。
- 最小权限原则:
-
实时监控与防御
- Web 应用防火墙(WAF): 使用 Cloudflare、ModSecurity(Nginx/Apache 模块)等,自动拦截 SQL 注入、XSS 等常见攻击。
- 文件完整性监控: 使用工具(如 Tripwire、AIDE)监控重要文件是否被篡改。
- 日志审计: 定期查看
access.log和error.log,警惕异常请求(如大量eval(base64_decode(...))请求)。
如何选择“PHP 安全托管”服务?
如果你不想自己配置服务器,想直接买托管服务,建议关注以下指标:
| 安全特性 | 推荐设置 | 说明 |
|---|---|---|
| PHP 版本 | PHP 8.1+ | 必须,PHP 5.6/7.0 等早已丧失安全补丁 |
| HTTPS | 免费 SSL 证书 (Let's Encrypt) | 标配,否则数据明文传输 |
| 函数禁用 | exec, system, eval, passthru, shell_exec |
防止远程执行 |
| 文件权限 | 用户隔离 (如 CloudLinux CageFS) | 防止其他用户读取你的文件 |
| 防火墙 | ModSecurity / Web 应用防火墙 | 对生产环境至关重要 |
| 自动备份 | 每日备份 + 异地备份 | 防止被黑客完全删除 |
| 专业 WAF | Cloudflare 企业版 / Sucuri | 拦截 0-day 和 DDoS |
推荐考虑的托管商:
- 共享型: SiteGround(安全口碑好)、Kinsta(基于 Google Cloud,安全配置完善)
- VPS 型(自建): DigitalOcean / Linode + 自己配置 Docker + Nginx + ModSecurity(需要较多动手能力)
最后一句忠告:
永远不要使用 eval(),永远不要用 $_GET/$_POST 直接拼接 SQL,永远不要在代码里硬编码密码。
如果能做到以上三点,你的 PHP 托管安全性已经超过了 80% 的网站。