从注册到部署,五分钟了解 CodeGuard 的完整流程。
.php 文件,或上传 .zip 压缩包批量加密其中所有 PHP 文件。.enc.php 文件。NC11 PHP 包装容器;opcode 模式 输出 NC12 指令容器(PHP 8.3)。原生与 opcode 产物都是可读 PHP 文件,通过 return nc_load('...') 交付加密载荷。
| 参数 | 说明 | 默认 |
|---|---|---|
| 绑定域名 | 允许运行加密文件的域名,支持每行一个,自动包含子域名 | 不限制 |
| 绑定 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」模式后,输出文件是一个可读 PHP 文件:包含版权保护头、Loader 检查,以及 return nc_load('BASE64载荷');。扩展在编译期拦截并还原执行,域名 / IP / PHP 版本 / 到期校验都在扩展内完成。
codeguard.so;php.ini 增加 extension=/path/to/codeguard.so;nc_load 未定义,请先按下载中心的步骤安装对应版本 codeguard.so。
opcache.file_cache 与 preload,避免编译结果落盘;原生模式目前不走 opcache 缓存。
产物结构与 SourceGuardian 类似:<?php 保护头 + return nc_load('...');,载荷是加密后的 Base64 文本,不再是整片二进制。文件本身不包含任何可执行逻辑,必须先安装对应版本的 codeguard.so。
opcode 模式把 PHP 编译后的指令序列直接加密,运行时由 Loader 还原执行,不再以源码形式存在。这是目前防护强度最高的模式,但仍处于实验阶段:
foreach、switch / match、数组与下标、内置函数调用、用户自定义函数(含默认参数,暂不支持类型声明)、echo / return;$this、instanceof、clone、类内 new 与静态调用、__toString;extends RuntimeException),父类属性 / 方法会正常继承;throw、try / catch / finally、多重 catch、嵌套与重抛、循环中的 break / continue;codeguard.so;NC12,与标准 / 原生模式的 NC11 并存。格式版本与 PHP 版本共同决定需要的 Loader,文件头会标注引擎版本。opcode 产物同样是可读 PHP 包装:保护头 + return nc_load('...');,内部是加密后的指令载荷;未安装对应 Loader 时会报 nc_load 未定义。
每次加密任务都会保留一份加密后的原始文件,保留期为 7 天。期间任务所有者可以在「在线加密」记录里点击「还原源码」取回原始文件。
加密记录可以随时在列表里删除。删除只会清理平台上的记录、产物和保留源码,已经下载到你自己服务器上的加密文件不受影响,仍可正常运行。平台不提供把加密产物还原成源码的通用解密功能;超过保留期或删除记录后就无法再取回源码。
License 是一个由平台私钥签名的 JSON 文件,包含:
domains:允许的域名列表;expires_at:到期时间(Unix 时间戳,0 表示永久);max_install:允许的装机数量;plan 与 customer:套餐与客户信息。Loader 使用内置公钥离线验签,不依赖平台服务器。公钥可通过 /pubkey 获取,用于自行校验授权文件。
.license 文件(与 JSON 内容对应,供 Loader 读取);codeguard.license,或设置环境变量 CODEGUARD_LICENSE=/绝对路径/xxx.license;需要限制装机数时,在目标机器执行一次激活,换取绑定本机的授权文件:
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)默认跳过域名校验,到期校验仍然生效。
访问域名与加密时填写的绑定域名不一致。请确认是否带 www、是否使用了 IP 访问,或重新生成加密文件。
来源 IP 不在白名单,或当前 PHP 版本超出加密时设置的范围。检查反向代理下的 REMOTE_ADDR,或重新生成对应范围的加密文件。
文件已超过到期时间。重新加密并选择新的到期时间,或改为永久授权。
源码级容器每次请求需要解密一次,通常开销在毫秒级;opcode 容器版本会进一步降低开销。
任何运行在客户机器上的代码都存在被逆向的可能。CodeGuard 通过加密、完整性校验与授权绑定提高破解成本,但不能承诺绝对安全。请结合服务端授权校验、功能分级下发等方式保护核心商业逻辑。
/etc/machine-id)后,重装系统或更换服务器通常会导致机器码变化,文件随之失效。return nc_load('...');,Loader 只信任内部加密载荷;修改外层注释不会绕过校验。