给PHP网站源码添加授权是保护开发者知识产权的重要手段,通过合理的授权验证机制,可以有效限制未授权用户使用源码,避免源码被非法传播和滥用。常见的授权方式有多种,开发者可以根据自身需求选择合适的方案。
本地授权文件验证方式
本地授权文件验证是最简单的授权方式,核心思路是在源码中读取指定路径的授权文件,验证文件内容的合法性,验证通过才允许程序正常运行。
实现步骤
- 生成唯一的授权密钥,包含授权域名、授权到期时间、授权版本等信息,使用加密算法对信息进行加密处理
- 将加密后的授权内容写入授权文件,分发给授权用户
- 在源码入口处添加验证代码,读取授权文件内容,解密后校验信息是否合法
示例代码
以下是本地授权验证的核心实现代码:
<?php
// 授权文件路径
$licenseFile = __DIR__ . '/license.key';
// 加密密钥,需要和生成授权文件时的密钥一致
$encryptKey = 'your_encrypt_key_2024';
// 检查授权文件是否存在
if (!file_exists($licenseFile)) {
die('未找到授权文件,请联系管理员获取授权');
}
// 读取授权文件内容
$licenseContent = file_get_contents($licenseFile);
if (empty($licenseContent)) {
die('授权文件内容为空,授权无效');
}
// 解密授权内容,这里使用openssl解密示例,实际可根据需求调整加密方式
$decrypted = openssl_decrypt($licenseContent, 'AES-256-CBC', $encryptKey, 0, substr($encryptKey, 0, 16));
if ($decrypted === false) {
die('授权文件解密失败,授权无效');
}
// 解析授权信息,格式可以自定义,这里使用json格式
$licenseInfo = json_decode($decrypted, true);
if (json_last_error() !== JSON_ERROR_NONE) {
die('授权信息解析失败,授权无效');
}
// 验证授权域名
$currentDomain = $_SERVER['HTTP_HOST'];
if (!isset($licenseInfo['domain']) || $licenseInfo['domain'] != $currentDomain) {
die('当前域名未授权,请联系管理员添加授权');
}
// 验证授权到期时间
if (isset($licenseInfo['expire_time'])) {
$expireTime = strtotime($licenseInfo['expire_time']);
if ($expireTime < time()) {
die('授权已到期,请联系管理员续费');
}
}
// 验证通过,继续执行后续程序
echo '授权验证通过,程序正常运行';
?>
远程服务器验证方式
远程服务器验证的安全性更高,授权信息存储在开发者自己的服务器上,每次源码运行时都向授权服务器发起请求校验授权状态,避免用户篡改本地授权文件。
实现逻辑
首先需要在自己的授权服务器上搭建授权接口,接收域名、授权密钥等参数,返回授权校验结果。然后在PHP源码中添加远程请求代码,向授权接口发送验证请求,根据返回结果判断授权是否合法。
示例代码
源码端的远程验证代码实现如下:
<?php
// 授权服务器接口地址,实际使用时替换为自己的服务器地址
$authServerUrl = 'http://ipipp.com/api/check_license';
// 当前源码的授权密钥,分发给用户时提供
$licenseKey = 'user_license_key_123456';
// 当前访问域名
$currentDomain = $_SERVER['HTTP_HOST'];
// 构建请求参数
$postData = [
'license_key' => $licenseKey,
'domain' => $currentDomain,
'timestamp' => time()
];
// 可以添加签名参数,增强请求安全性
$postData['sign'] = md5($licenseKey . $currentDomain . $postData['timestamp'] . 'your_sign_key');
// 发起curl请求校验授权
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $authServerUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
$response = curl_exec($ch);
curl_close($ch);
if (empty($response)) {
die('授权服务器连接失败,请稍后重试');
}
// 解析返回结果,假设接口返回json格式数据
$result = json_decode($response, true);
if (!isset($result['code']) || $result['code'] != 200) {
$errorMsg = isset($result['msg']) ? $result['msg'] : '授权验证失败';
die($errorMsg);
}
// 验证通过
echo '远程授权验证通过,程序正常运行';
?>
域名绑定授权方式
域名绑定授权是结合本地和远程验证的一种常用方式,将授权和指定域名绑定,只有当访问域名在授权列表中时,源码才能正常运行,适合针对特定客户部署的场景。
实现要点
- 授权时记录客户的域名信息,生成对应域名的授权标识
- 源码运行时获取当前访问域名,和授权信息中的域名进行比对
- 可以结合到期时间、功能权限等维度扩展授权规则
域名绑定的验证代码可以整合到上述两种验证方式中,只需要在校验逻辑中添加域名比对的部分即可,前文本地授权验证的代码中已经包含了域名校验的示例,可参考实现。
授权实现的注意事项
- 加密密钥和签名密钥需要妥善保管,不要直接硬编码在源码中,可以通过混淆、拆分存储等方式提升安全性
- 远程验证需要做好容错处理,比如授权服务器临时不可用时,可以设置本地缓存的验证结果,避免程序直接无法运行
- 授权文件可以定期更新,或者设置验证频率,防止用户禁用验证代码
- 如果源码需要分发,建议对核心验证逻辑进行代码混淆,避免被用户轻易修改绕过验证
授权机制只是增加源码被破解的难度,无法做到绝对的安全,开发者可以根据源码的价值选择合适的授权方案,平衡安全性和实现成本。