PHP 安全

使用 PHP 开发应用时产生的漏洞,以及为防御这些漏洞而遵循的编码、配置与运维层面的安全原则

PHP 安全

概述

PHP 安全是指在用 PHP 编写的 Web 应用中预防可能出现的安全漏洞,并通过编写安全的代码、配置服务器以及运维管理,将攻击面降至最低的一系列实践体系。PHP 是占据全球 Web 服务器相当大份额的语言,历史上曾出现过大量 SQL 注入、XSS、文件包含等传统漏洞案例。不过,随着进入 PHP 7·8 世代,语言层面的安全机制得到强化,加之框架与静态分析工具的普及,安全的开发实践正在逐步确立。

主要内容

1. 典型漏洞类型

  • SQL 注入(SQL Injection):当用户输入被原样拼接到查询语句中时发生。使用 PDO 或 mysqli 的预处理语句(Prepared Statement)与参数绑定,可以从根本上加以阻断。
  • 跨站脚本(XSS):输出时使用 htmlspecialchars($str, ENT_QUOTES, 'UTF-8') 进行转义是基本做法。若同时配合内容安全策略(CSP)响应头,则可实现纵深防御。
  • CSRF(跨站请求伪造):对会改变状态的请求,必须签发并校验基于会话的 CSRF 令牌。
  • 文件包含与路径操纵:不要在 include、require 以及文件上传路径中直接使用用户输入,而应以白名单方式加以校验。
  • 远程代码执行(RCE):eval()、assert()、preg_replace() 的 /e 修饰符、滥用 unserialize() 是典型途径。
  • 会话劫持:通过重新生成会话 ID(session_regenerate_id(true)),并设置 HttpOnly、Secure、SameSite 等 Cookie 属性来防御。

2. 安全编码原则

1. 输入校验与输出编码分离:明确信任边界,对所有外部输入进行校验,并让所有输出按相应语境进行编码。

2. 最小权限原则:将数据库账户、文件系统权限、进程权限降至最低。

3. 机密信息分离:不要将数据库凭据、API 密钥硬编码在代码中,而应通过环境变量或密钥管理器进行管理。

4. 错误信息暴露控制:在生产环境中设置 display_errors=Off、log_errors=On,详细错误仅记录到日志中。

5. 安全存储密码:使用 password_hash() 与 password_verify(),采用 bcrypt/Argon2。绝对禁止使用 MD5、SHA1。

3. 服务器与运行时配置

  • 在 php.ini 中设置 expose_php=Off、allow_url_include=Off、allow_url_fopen=Off(如有需要则加以限制)、指定 open_basedir,并通过 disable_functions 屏蔽危险函数。
  • 文件上传需校验扩展名、MIME 类型与大小,并将其存储在 Web 根目录之外或不可执行的目录中。
  • 强制使用 HTTPS,并应用 Strict-Transport-Security 响应头。
  • 使用 Composer 依赖时,应通过 composer audit 定期检查,并立即更新存在漏洞的包。

4. 工具与框架

Laravel、Symfony 等现代框架默认提供 ORM 的查询绑定、Blade/Twig 模板的自动转义以及 CSRF 中间件。静态分析工具中,PHPStan、Psalm、PHP_CodeSniffer(含安全规则)被广泛使用;动态诊断工具中,OWASP ZAP、Burp Suite 被广泛采用。将 SAST/DAST 集成到 CI 流水线中已成为标准实践。

最新趋势

截至 2024 至 2025 年,PHP 安全生态的主要变化如下。第一,向 PHP 8.1 及以上版本的迁移已进入事实上收尾阶段,使用已停止支持(EOL)的版本成为突出风险因素。PHP 8.4(2024 年 11 月发布)引入了属性钩子与非对称可见性等特性,安全社区正在梳理新语法下的安全使用模式。第二,应对供应链攻击成为核心议题。随着 Packagist 与 Composer 生态中报道出域名抢注(typosquatting)与恶意包案例,锁定 composer.lock、哈希校验、引入 SBOM(软件物料清单)等做法受到推荐。第三,基于 AI 的代码生成工具日益普及,自动生成的 PHP 代码中混入不安全模式的风险随之增大,为此,AI 代码审查与静态分析自动化的重要性愈发受到强调。第四,顺应 OWASP Top 10 的最新修订趋势,易受攻击的组件管理与身份认证·会话设计失误被重新审视为首要风险。最后,随着零信任架构与细粒度权限管理也被应用于基于 PHP 的后端,摆脱以传统“边界防御”为中心的思维,在应用内部也验证最小权限的设计正在扩散。

相关主题

  • [[SQL 注入]]
  • [[跨站脚本]]
  • [[OWASP Top 10]]
  • [[PHP]]
  • [[Web 应用防火墙]]