使用文档

从注册到部署,五分钟了解 CodeGuard 的完整流程。

快速开始

  1. 注册并登录,进入「在线加密」。
  2. 上传一个 .php 文件,或上传 .zip 压缩包批量加密其中所有 PHP 文件。
  3. 点击加密,下载生成的 .enc.php 文件。
  4. 用加密文件替换服务器上的原文件即可运行。
三种模式:标准模式输出源码级容器,无需安装扩展;原生 Loader 输出 NC11 PHP 包装容器;opcode 模式 输出 NC12 指令容器(PHP 8.3)。原生与 opcode 产物都是可读 PHP 文件,通过 return nc_load('...') 交付加密载荷。
NC11 = Naicha CodeGuard 11,NC12 = Naicha CodeGuard 12,是 CodeGuard 自研的容器格式代号,编号按引擎代次顺序递增(NC11 → NC12 → …,作用类似 SourceGuardian 的 SG11 / SG16 版本体系),文件头与 Loader 会自动识别版本。

加密参数

参数说明默认
绑定域名允许运行加密文件的域名,支持每行一个,自动包含子域名不限制
绑定 IP允许运行加密文件的来源 IP,支持完整 IP、前缀(10.0.0.)与通配(192.168.1.*)不限制
PHP 版本范围限制加密文件可运行的 PHP 版本区间,超出范围拒绝执行不限制
绑定机器码限制在指定 /etc/machine-id 的服务器上运行,换机或重装通常失效不限制
版权注释写入加密文件开头的可读保护头,作为版权 / 归属声明空
到期时间加密文件的有效期,到期后拒绝执行永久
目标 PHP 版本用于生成对应版本的产物(内测阶段统一格式)8.3
文件大小单文件 2 MB,zip 压缩包 20 MB(解压后 64 MB 内)—

原生 Loader 模式

选择「原生 Loader」模式后,输出文件是一个可读 PHP 文件:包含版权保护头、Loader 检查,以及 return nc_load('BASE64载荷');。扩展在编译期拦截并还原执行,域名 / IP / PHP 版本 / 到期校验都在扩展内完成。

  1. 在下载中心下载对应 PHP 版本的 codeguard.so;
  2. 放到 PHP 扩展目录,在 php.ini 增加 extension=/path/to/codeguard.so;
  3. 重启 PHP-FPM 或 Web 服务;
  4. 上传文件时选择「原生 Loader」模式即可。
当前提供 PHP 7.4 / 8.0 / 8.1 / 8.2 / 8.3(Linux x86_64 / NTS) 版本。未安装扩展时运行文件会报 nc_load 未定义,请先按下载中心的步骤安装对应版本 codeguard.so。
如果目标机启用了 opcache,请关闭 opcache.file_cache 与 preload,避免编译结果落盘;原生模式目前不走 opcache 缓存。

产物结构与 SourceGuardian 类似:<?php 保护头 + return nc_load('...');,载荷是加密后的 Base64 文本,不再是整片二进制。文件本身不包含任何可执行逻辑,必须先安装对应版本的 codeguard.so。

原生 opcode 模式(实验性)

opcode 模式把 PHP 编译后的指令序列直接加密,运行时由 Loader 还原执行,不再以源码形式存在。这是目前防护强度最高的模式,但仍处于实验阶段:

  • 仅支持 PHP 8.3;
  • 已支持:变量、算术 / 字符串、条件、循环、foreach、switch / match、数组与下标、内置函数调用、用户自定义函数(含默认参数,暂不支持类型声明)、echo / return;
  • 已支持基础类:构造函数、实例方法与静态方法、公有 / 受保护 / 私有属性及默认值、$this、instanceof、clone、类内 new 与静态调用、__toString;
  • 已支持单继承:用户类继承用户类、继承内部类(如自定义异常 extends RuntimeException),父类属性 / 方法会正常继承;
  • 已支持异常:throw、try / catch / finally、多重 catch、嵌套与重抛、循环中的 break / continue;
  • 已支持类型声明:参数类型、返回类型、可空类型、类类型,以及类型化属性(含未初始化状态);
  • 暂不支持:接口实现校验、trait、枚举、类常量、静态属性、闭包、生成器、联合 / 交叉类型;
  • 需要目标服务器安装 PHP 8.3 对应的 codeguard.so;
  • 容器格式为 NC12,与标准 / 原生模式的 NC11 并存。格式版本与 PHP 版本共同决定需要的 Loader,文件头会标注引擎版本。
上传包含暂不支持语法的文件时,平台会直接提示编码失败,不会产出无法运行的文件。

opcode 产物同样是可读 PHP 包装:保护头 + return nc_load('...');,内部是加密后的指令载荷;未安装对应 Loader 时会报 nc_load 未定义。

源码找回

每次加密任务都会保留一份加密后的原始文件,保留期为 7 天。期间任务所有者可以在「在线加密」记录里点击「还原源码」取回原始文件。

  • 仅任务所有者(或管理员)可以还原;
  • 每次还原都会写入审计日志;
  • 超过 7 天自动删除,无法找回;
  • 源码以加密形式落盘,按任务独立密钥保护。

加密记录可以随时在列表里删除。删除只会清理平台上的记录、产物和保留源码,已经下载到你自己服务器上的加密文件不受影响,仍可正常运行。平台不提供把加密产物还原成源码的通用解密功能;超过保留期或删除记录后就无法再取回源码。

License 授权

License 是一个由平台私钥签名的 JSON 文件,包含:

  • domains:允许的域名列表;
  • expires_at:到期时间(Unix 时间戳,0 表示永久);
  • max_install:允许的装机数量;
  • plan 与 customer:套餐与客户信息。

Loader 使用内置公钥离线验签,不依赖平台服务器。公钥可通过 /pubkey 获取,用于自行校验授权文件。

使用 .license 文件

  1. 在「授权管理」下载 .license 文件(与 JSON 内容对应,供 Loader 读取);
  2. 放到加密文件同目录并命名为 codeguard.license,或设置环境变量 CODEGUARD_LICENSE=/绝对路径/xxx.license;
  3. 加密时勾选「需要 License 文件」,可再填写 License ID 只允许指定授权;
  4. Loader 会校验签名、产品、到期时间、机器码、License ID 和授权域名。

在线激活

需要限制装机数时,在目标机器执行一次激活,换取绑定本机的授权文件:

curl -X POST https://codeguard.naicha.cloud/api/activate \
  -H 'Content-Type: application/json' \
  -d '{"license_id":"lic_xxx","machine_id":"'$(cat /etc/machine-id)'","domain":"example.com"}'

返回 JSON 中的 license 字段就是绑定到该机器码的 NCGL1 授权文本,写入 codeguard.license 即可。超过 max_install 或授权已吊销时,激活会被拒绝。

{
  "v": 1,
  "id": "lic_xxx",
  "product": "naicha-codeguard",
  "plan": "pro",
  "customer": "you@example.com",
  "domains": ["example.com"],
  "expires_at": 1800000000,
  "max_install": 3,
  "issued_at": 1760000000,
  "nonce": "xxx",
  "sig": "base64..."
}

部署与运行

加密文件本身就是一个普通 PHP 文件,直接放到站点目录即可:

# 备份原文件
cp app.php app.php.bak

# 用加密文件替换
cp app.enc.php app.php

# 访问站点验证

CLI 场景下(php script.php)默认跳过域名校验,到期校验仍然生效。

常见问题

提示 "domain not licensed"

访问域名与加密时填写的绑定域名不一致。请确认是否带 www、是否使用了 IP 访问,或重新生成加密文件。

提示 "ip not licensed" / "php version not allowed"

来源 IP 不在白名单,或当前 PHP 版本超出加密时设置的范围。检查反向代理下的 REMOTE_ADDR,或重新生成对应范围的加密文件。

提示 "license expired"

文件已超过到期时间。重新加密并选择新的到期时间,或改为永久授权。

加密后性能会下降吗?

源码级容器每次请求需要解密一次,通常开销在毫秒级;opcode 容器版本会进一步降低开销。

安全说明

任何运行在客户机器上的代码都存在被逆向的可能。CodeGuard 通过加密、完整性校验与授权绑定提高破解成本,但不能承诺绝对安全。请结合服务端授权校验、功能分级下发等方式保护核心商业逻辑。

  • 防篡改:载荷使用 AES-256-GCM 认证加密,修改任意字节都会导致解密失败(payload corrupted),无法通过改文件绕过校验。
  • 防复制:可绑定域名、IP、PHP 版本、机器码;复制到其他域名 / IP / 机器会直接拒绝执行。
  • 重装失效:绑定机器码(/etc/machine-id)后,重装系统或更换服务器通常会导致机器码变化,文件随之失效。
  • 可读包装:外层 PHP 只是保护头与 return nc_load('...');,Loader 只信任内部加密载荷;修改外层注释不会绕过校验。
不要把平台账号密码、License 私钥或签名密钥写入加密文件;这些信息应始终保存在服务端。