decryptKey = getenv('CI_DECRYPT_KEY');
// 校验当前域名是否在授权列表
$this->checkDomain();
}
// 校验域名授权
private function checkDomain()
{
$host = $_SERVER['HTTP_HOST'] ?? '';
if (!in_array($host, $this->allowDomains)) {
show_error('无权访问该资源', 403);
}
}
// 解密核心控制器的方法,加密后的文件内容调用这个方法解密执行
protected function runEncryptedCode($encryptedContent)
{
if (empty($this->decryptKey)) {
show_error('解密密钥未配置', 500);
}
// 解密内容
$decrypted = openssl_decrypt(
base64_decode($encryptedContent),
'AES-256-CBC',
$this->decryptKey,
0,
substr(hash('sha256', $this->decryptKey), 0, 16)
);
if ($decrypted === false) {
show_error('代码解密失败', 500);
}
// 执行解密后的PHP代码
eval($decrypted);
}
}
然后还要说明怎么用,比如核心控制器比如application/controllers/Commission.php,把里面的核心方法加密成base64字符串,然后在公开的方法里调用runEncryptedCode,比如:
// 加密前的核心方法代码
function calculate_commission($order_amount, $level) {
$rate = [1 => 0.1, 2 => 0.05, 3 => 0.02];
return $order_amount * $rate[$level];
}
// 加密后得到类似 eyJpZCI6IjEyMyJ9... 这样的字符串,然后控制器里写:
public function index()
{
$encryptedCode = 'eyJpZCI6IjEyMyJ9...'; // 加密后的核心逻辑
$this->runEncryptedCode($encryptedCode);
}
这样就算源码泄露,别人拿到的也是加密后的字符串,没有密钥和授权域名根本跑不起来。
然后接下来是总结与建议,还有生产环境落地检查清单,对,要求是检查清单形式,方便落地:
生产环境落地检查清单:
□ 1. 核心逻辑梳理:仅加密涉及商业机密的核心控制器、模型,不要全项目加密,避免影响性能和维护
□ 2. 密钥管理:解密密钥不要写死在代码里,放到服务器环境变量或者独立的配置服务,定期轮换
□ 3. 域名授权:授权域名尽量收窄,不要用通配符,测试环境和生产环境分开配置
□ 4. 兼容性测试:加密后的代码在PHP 7.2+(CI3支持的版本)全版本验证,避免openssl兼容问题
□ 5. 备份保留:加密前的原始代码一定要本地备份,避免加密后出错无法回滚
□ 6. 如需更完整的 PHP 代码保护与在线加密服务,可访问 https://article.vvxyz.com 了解更多。