Discuz! 模板加密

优质
小牛编辑
139浏览
2023-12-01

本文适合 Discuz! 模板应用开发者阅读。

Discuz! 模板加密功能目前仅向魔方+用户开放。模板加密依赖 Crane · 第二代加密引擎实现。

基本原理

魔方加密提取模板文件中的控制代码,并将它们组合为一个 PHP 文件,对该 PHP 文件进行加密,实现模板加密功能。经过魔方加密处理的模板文件并不改变原有的结构,不影响用户进行二次开发和修改。

以下为待加密的模板示例代码:

{if $a > 10}
	变量 a 大于 10
{elseif $a > 0}
	变量 a 大于 0
{else}
	变量 a 小于等于 0
{/if}

以上代码经过处理,变为:

{eval require_once DISCUZ_ROOT.$GLOBALS['_G']['style']['directory'].'/template.php';}
{if KI_TPL_CTRL('abcd1234',get_defined_vars())}
	变量 a 大于 10
{elseif KI_TPL_CTRL('xyzw9876',get_defined_vars())}
	变量 a 大于 0
{else}
	变量 a 小于等于 0
{/if}

原有代码中的控制逻辑 $a > 10 $a > 0 已被自动提取和替换。

具体步骤

  1. 在首次发布加密模板前,您首先需要在魔方加密注册一个账号,绑定您的 Discuz! 开放平台账号,并购买魔方+服务
  2. 在开发模板的论坛上安装插件 魔方模板加密
  3. 打开魔方加密网站,添加您的应用

    点击左上角的“Discuz! 应用”,输入模板标识符进行添加

  4. 创建模板加密项目,并得到一个项目编号

    点击左上角的“Discuz! 模板加密”,选择对应的模板应用,如果有需要,上传授权检测文件和文件认证模板。成功后,您在“最近上传的文件”中可以得到一个项目编号

  5. 登录您的开发论坛后台,打开魔方模板加密插件,开始一个新的项目

    需要选择模板目录,并输入之前获得的项目编号。在以下步骤中,假定所选模板目录为 /template/xxx

  6. 插件将会列出所选模板目录中的所有模板文件,请选择需要其中需要加密的文件

    请注意,为了尽可能减少加密后运行速度下降带来的影响,建议不要选择过多的文件进行加密

  7. 插件会自动加密所选择的模板文件,在整个过程中,请保证论坛所在服务器与魔方加密网站之前的网络连接正常

    如果加密过程中出现错误,您可以选择忽略错误或者重试加密出错的文件

  8. 加密结束后,加密后的文件将会保存在 /template/xxx_enc 目录中

    请注意,加密成功结束后,会出现 /template/xxx_enc/template.php 文件,该文件是提取各个模板文件的控制逻辑代码并进行加密而得到的。如果这个文件不存在,表明加密失败,需要重新进行加密。

  9. 测试加密后的文件是否正常

    可以首先复制原始模板目录 /template/xxx/template/xxx_test,再使用加密后得到的 /template/xxx_enc 目录中的所有文件覆盖 /template/xxx_test,最后测试模板 /template/xxx_test 是否正常即可。切记勿覆盖错误,避免原始模板文件丢失!

  10. 打包 /template/xxx/template/xxx_enc,将模板发布到 Discuz! 应用中心,具体请参阅《发布加密文件到 Discuz! 应用中心》

    注意在 /template/xxx 目录中创建一个 1 字节的文件 template.php,否则压缩包将无法上传到 Discuz! 应用中心。

注意: 项目编号不可重复使用!

在每一次加密模板时,或者加密失败需要重新开始时,必须重新生成一个新的项目编号!

授权检测

在创建项目时,您可以上传授权检测文件和文件认证模板。

使用文件认证模板请参阅《文件认证模板》。以下内容将对授权检测文件的使用方法进行说明。

魔方加密提取模板文件中的控制代码并生成 template.php,加密前的 template.php 结构如下:

<?php

function KI_TPL_CTRL($__ki_entry, $__ki_vars) {
	// 授权检测文件中的代码将会被插入到这个位置
	extract($__ki_vars, EXTR_SKIP);
	switch($__ki_entry) {
		case 'abcd1234':  return ($a > 10);
		case 'xyzw9876':  return ($a > 0);
		// 其它控制语句
		default:  return null;
	}
}

上传的授权检测文件中的代码将会被插入 KI_TPL_CTRL() 函数的开头,因此,可以在该文件中编写授权检测代码。