PHP本身是一种开源的开发语言,编写好的项目如果分发到客户服务器上,一般就是明文的可以直接查看的。如果你想对业务的核心代码进行加密混淆,业内其实有不少方案,但主要是2个方向:带扩展的和不带扩展的。
特点:由 Swoole 官方团队开发,直接将 PHP 源码编译成 C++ 代码并生成二进制目标文件。
优势:
非组件化:不依赖 Opcode,破解难度极高。
性能优化:编译后的代码执行效率通常比原代码更高。
功能强大:支持代码混淆、时间授权、指纹绑定。
适用场景:高价值的商业软件、高性能要求的项目。
特点:业界元老级方案,几乎是商业 PHP 程序的标配(如旧版的 WHMCS)。
优势:
稳定性极佳:兼容性非常强,支持从 PHP 5 到 PHP 8.x 的所有版本。
自研加密算法:使用复杂的层级加密和 Opcode 转换。
缺点:收费昂贵,且由于名气太大,市面上存在一些针对旧版本的“脱壳”工具(虽然新版本依然坚挺)。
Basic方案是199美元,不支持授权许可文件:
Licensing Features Features to generate time expiring and IP/domain name restricted license files (支持生成具有“到期时间限制”以及“IP/域名限制”的授权许可文件。)
Pro方案299美元,才支持上述功能。
https://www.ioncube.com/php_encoder.php?page=pricing
SourceGuardian 是与 IonCube 齐名的“老大哥”级商业方案。不要使用旧版本,有破解版外流。
极高的安全性:它不只是简单的混淆,而是将 PHP 源码编译成一种特殊的字节码(Bytecode)。没有扩展插件,很难还原出原始代码。
灵活的授权机制(Licensing):SG 完美支持:
到期锁定:设置代码在某个日期后失效。
IP/域名绑定:锁定代码只能在特定的服务器或网站运行。
机器码绑定:锁定特定的硬件 ID(防止代码被拷贝到其他服务器)。
支持 PHP 全版本:更新速度极快,目前已支持最新的 PHP 8.3 及以上版本。
跨平台支持:支持 Windows, Linux, FreeBSD, macOS 等主流系统。
注意:曾经的行业标准,但 Zend 官方已停止维护(最高仅支持到 PHP 7.0)。目前不建议在新项目中使用。
特点:一个开源的 PHP 加密扩展。如果你需要一定的保护,但不想支付高昂的商业授权费,可以考虑这些。
原理:利用 zlib 压缩和简单的位运算(如 XOR)对源码进行加密。
评价:属于“防君子不防小人”。因为它是开源的,如果黑客拿到了你的 php_screw.so 扩展文件,通过逆向工程很快就能找回密钥。
改进版:PHP Screw Plus 增强了对 MD5 校验和代码执行路径的保护。
特点:由国内开发者开发的开源加密扩展。
优势:
支持 AES、DES、RC4 等多种算法。
可以禁用 eval、system 等危险函数。
支持限制代码的有效期。
评价:配置相对简单,适合中小型项目的内部保护。
这些带扩展的方案有一个缺点,就是需要服务器上安装加载指定的加载器(loader.so)。如果服务器不能安装这个加载器,就无法使用这个方案。
这种方案的本质是源码级混淆 + 自解密外壳。
免扩展加密并不真正“改变”PHP 的底层运行方式,而是通过以下步骤重新包装你的代码:
代码压缩与混淆:去掉注释、缩进,将变量名和函数名改为无意义的字符(如 $O00OO0)。
编码/加密内容:将原始代码通过 base64、rot13 或对称加密算法(如 AES)转为乱码。
构建自解密外壳(Stub):生成一段引导代码,在运行时动态调用 eval() 或 preg_replace('/.*/e', ...) 来还原并执行原始逻辑。
这类工具通常是收费软件,混淆逻辑非常复杂,难以通过简单的格式化还原:
EnPHP:国内非常出名的免扩展混淆工具。它会将逻辑打乱,并使用大量的变量名干扰,虽然不依赖扩展,但反混淆难度很大。目前貌似已无维护。
ZendGuard (Legacy):虽然它有扩展版,但也支持简单的混淆模式。
PHPProtect:老牌的源码混淆工具。
适合简单的项目保护,防止被小白直接看懂逻辑。
PHP Obfuscator (yakpro-php):基于语法树(AST)的混淆器。它可以重命名变量、函数、类名,甚至可以打乱控制流(Control Flow Flattening)。
在线加密平台:如 phpjiami.com 等。这类平台通常使用多层 eval 和 base64 嵌套。
警告:使用第三方在线平台有源码被对方泄露或植入后门的风险。
直接给结论:防君子不防小人。
由于 PHP 最终必须解析为 Opcode 才能运行,任何“免扩展”方案最终都会在内存中还原出原始的 PHP 代码。资深程序员可以通过以下手段破解:
Hook eval 函数:直接拦截解密后的字符串输出。
使用 Xdebug:单步调试查看变量内容。
VLD 扩展:查看解密后生成的 Opcode。
如果为了保护核心算法:
尽量说服客户使用支持扩展的环境,上 Swoole Compiler 或 IonCube;但即使是这种带扩展的方案,也不是百分百防破解,他只能增加破解的难度。
如果环境受限且必须加密:
推荐使用 YAK Pro (YAK PHp Obfuscator)。它是开源的,安全可控,且基于语法树的混淆比简单的 base64+eval 要强得多。
配合手段:
加入域名锁定逻辑(检查 $_SERVER['HTTP_HOST'])。
加入时间锁逻辑(检查 time())。
即使代码被还原,这些硬编码在逻辑里的限制依然能起到一定作用。
yakpro-po 官方的github库已下线。可以从以下的备份库下载:
从备份库下载:
https://git.conv.su/public_fork/yakpro-po
国内:
https://gitee.com/hcx07/yakpro-po
https://gitee.com/zilf/yakpro-po
也可以使用 yakpro-po 的在线工具:
https://www.php-obfuscator.com/?demo

【注意】:
对于lumen、laravel这类框架类,混淆时,不能启用 Namespaces、Classes、Methods、Functions。
yakpro-po 2.0.4 依赖 PHP-Parser 4.x(4.19.5 是4.x分支里最新的一个版本)
下载 PHP-Parser:https://github.com/nikic/PHP-Parser/releases
在 yakpro-po-master 目录(yakpro-po.php所在文件夹)里创建 PHP-Parser 目录,放入 v4.19.5.zip 解压后的所有文件。
同时修改 PHP-Parser 下的 composer.json ,文件最后加入:
"extra": {
"branch-alias": {
"dev-master": "4.19.5"
}
}因为执行版本检测时,yakpro-po 会检查依赖的版本号,而 composer.json 里可能没有 extra 字段。
php yakpro-po.php --help
先修改默认配置文件:
yakpro-po.cnf
对于lumen、laravel框架,不混淆命令空间、类、类方法、函数:
$conf->obfuscate_function_name = false; // self explanatory $conf->obfuscate_class_name = false; // self explanatory $conf->obfuscate_method_name = false; // self explanatory $conf->obfuscate_namespace_name = false; // self explanatory
windows下调用例子:
php yakpro-po.php source_directory -o target_directory
php yakpro-po.php source_filename -o target_filename
实际php例子:
php yakpro-po.php D:\WEB\www\local\y1.php -o D:\WEB\www\local\y1-o.php

y1.php 源码:
function store(Request $request)
{
// 验证
$validator = \Validator::make($request->all(), [
'loc_type' => 'required',
],[],[
'loc_type' => '服务器所在地',
]);
if ($validator->fails()) {
$error_text = implode(" ", $validator->errors()->all());
return $this->sendErrorData($error_text);
}
// 检查
if(empty($request->plat_code) or empty($request->plat_key)){
return $this->sendErrorData("平台key 或 平台code 为空");
}
$config = \App\Models\AiConfig::find(1);
// 参数
$input = [
"loc_type" => $request->input("loc_type"),
"plat_code" => $request->input("plat_code"),
];
// 更新
$res = \App\Models\AiConfig::where("id", 1)->update($input);
return $this->sendData($res);
}加密混淆后的y1-o.php源码:

混淆后,只有一行代码,并且大量使用goto语句。
在实际使用中,yakpro方案只是整个加密验证逻辑中的一环,可以结合php动态化调用方法、16进制混淆、aes加密、gz压缩等等。