Swoole 4.x 安全加固需从运行时、网络层、代码逻辑三方面设防:禁用调试接口、强制关闭display_errors、拦截恶意URI与payload、限制上传类型、降权运行、禁用危险函数、启用TLSv1.2+并校验证书。

Swoole 4.x 系列(如 4.8.13)虽已停止主版本更新,但在部分遗留系统中仍有使用。其安全加固不能依赖框架自动防护,需从运行时、网络层、代码逻辑三方面主动设防。以下为实操性配置要点,不讲理论,只列关键动作。
禁用危险函数与协程上下文泄漏
默认启用的 Coroutine::getPcid()、Coroutine::list() 等调试接口,在生产环境必须关闭:
- 编译安装时加
--disable-debug参数,避免内置调试符号和未文档化API暴露 - 在启动脚本开头强制覆盖全局协程上下文:
ini_set('swoole.enable_coroutine', '1'); ini_set('swoole.display_errors', '0'); - 禁止在 HTTP 回调中直接输出
print_r($server)或var_dump($request)—— 请求对象含原始 header、cookie,极易造成敏感信息回显
HTTP Server 层硬性过滤规则
Swoole 4.x 的 Http\Server 不自带 WAF,需手动拦截常见攻击载荷:
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 在
onRequest回调最前端加入 URI 和 body 检查:if (preg_match('/(\.\.|phpinfo|eval\(|base64_decode)/i', $request->server['request_uri'] . $request->rawContent())) { $response->status(403); return; } - 限制上传文件类型:对
$request->files中每个项校验mime_type,仅放行image/jpeg、application/pdf等白名单类型,拒绝application/x-php、text/html - 设置请求体最大长度:
$server->set(['package_max_length' => 5 * 1024 * 1024]);防止慢速攻击或超大 payload 内存耗尽
进程与权限最小化原则
Swoole 4 默认以 root 启动主进程,这是高危行为:
- 主进程启动后立即降权:
$server->addProcess(new Swoole\Process(function () { posix_setuid(1001); posix_setgid(1001); }));,再通过posix_setsid()分离会话 - 禁用
exec、system、shell_exec等函数:在 php.ini 中设置disable_functions = exec,system,shell_exec,passthru,proc_open,pcntl_exec - Worker 进程不挂载 /proc、/sys 等敏感路径;若用 Docker,添加
--read-only --tmpfs /tmp:rw,size=64m
SSL/TLS 强制配置与证书校验
即使业务未强制 HTTPS,也应启用 TLS 并禁用弱协议:
- 启用时必须指定完整证书链:
'ssl_cert_file' => '/path/to/fullchain.pem', 'ssl_key_file' => '/path/to/privkey.pem' - 禁用 SSLv2/v3、TLS 1.0/1.1:
'ssl_protocols' => ['TLSv1.2', 'TLSv1.3'](Swoole 4.8+ 支持) - 客户端证书双向认证可选,但若启用,务必校验
$request->header['x-client-cert-subject']是否匹配白名单 DN

















