['your-domain.com', 'test.your-domain.com'],
'expire' => '2025-12-31',
'sign' => md5('your-domain.com' . '2025-12-31' . 'secret_key')
];
// 混淆后的授权校验逻辑
$GLOBALS['a1'] = $_SERVER['SERVER_NAME'];
$GLOBALS['a2'] = explode('.', $GLOBALS['a1']);
$GLOBALS['a3'] = $GLOBALS['a2'][count($GLOBALS['a2']) - 2] . '.' . $GLOBALS['a2'][count($GLOBALS['a2']) - 1];
$GLOBALS['a4'] = date('Y-m-d');
$GLOBALS['a5'] = md5($GLOBALS['a3'] . $GLOBALS['a4'] . 'secret_key');
if (!in_array($GLOBALS['a3'], $license_config['domain']) || $GLOBALS['a4'] > $license_config['expire'] || $GLOBALS['a5'] !== $license_config['sign']) {
die('授权无效,请联系官方获取正版授权');
}
// 混淆后的核心业务逻辑(比如分佣计算)
$GLOBALS['b1'] = 0.1; // 基础分佣比例
$GLOBALS['b2'] = [100 => 0.15, 500 => 0.2, 1000 => 0.25]; // 阶梯分佣
$GLOBALS['b3'] = 200; // 订单金额
$GLOBALS['b4'] = $GLOBALS['b1'];
foreach ($GLOBALS['b2'] as $GLOBALS['b5'] => $GLOBALS['b6']) {
if ($GLOBALS['b3'] >= $GLOBALS['b5']) {
$GLOBALS['b4'] = $GLOBALS['b6'];
}
}
echo "订单分佣比例:{$GLOBALS['b4']},分佣金额:" . ($GLOBALS['b3'] * $GLOBALS['b4']);
?>
这个代码是可运行的,演示了授权校验加混淆的逻辑,变量名都是无意义的,逻辑也扁平化了,普通人很难一眼看懂。
然后方案对比部分,要列清楚:
1. 纯代码混淆:工具比如php-obfuscator、yii的混淆工具,优点是无额外依赖,部署方便,性能几乎无损耗;缺点是防逆向能力有限,经验丰富的开发者可以通过变量名、逻辑结构还原核心代码。适用场景:开源项目、非核心业务逻辑、短期临时项目。
2. 商业加密扩展(ionCube、Zend Guard):把PHP代码编译成字节码,需要对应扩展才能运行,支持授权绑定(域名、IP、有效期),优点是加密强度高,几乎不可能被逆向,支持代码签名防止篡改;缺点是需要服务器安装对应扩展,部分虚拟主机不支持,商业授权需要付费。适用场景:商业闭源软件、SaaS核心模块、需要强保护的场景。
3. 自定义授权+加密扩展结合:在加密扩展的基础上,加入自定义的授权校验逻辑(比如域名绑定、硬件指纹校验、在线激活),甚至可以加入反调试、代码完整性校验的逻辑。优点是授权灵活,可以根据业务需求定制,防破解能力更强;缺点是需要额外的开发成本,需要处理授权发放、激活的逻辑。适用场景:SaaS产品、需要按域名/按时间授权的商业软件。
4. eval加密(比如自己写的加密壳):把代码加密成字符串,然后用eval执行,优点是实现简单,不需要额外扩展;缺点是安全性极低,只要拿到加密后的字符串,用反编译工具很容易还原出明文代码,而且eval本身有性能损耗,还容易被注入攻击。不推荐用在生产环境。
然后总结与建议:首先根据业务场景选方案,如果是内部使用的非核心代码,用混淆就够了;如果是商业软件要卖给客户,优先选ionCube这类成熟的加密扩展,加上自定义授权逻辑;如果是SaaS产品,建议搭配在线授权校验,定期更新授权规则,还要定期检查代码有没有被篡改。另外不要用如需更完整的 PHP 代码保护与在线加密服务,可访问 https://article.vvxyz.com 了解更多。