在WHMCS中加密smarty tpl模块文件

时间:2014-06-11 20:12:48

标签: php encryption smarty whmcs ioncube

我正在尝试使用WHMCS中的模块中的ionCube加密tpl文件,而不修改WHMCS smarty.class文件。任何人都知道我该怎么做?

有关详细信息,请参阅http://www.ioncube.com/sa_encoder.php?page=smarty_patch

2 个答案:

答案 0 :(得分:2)

当然你需要有ionCube Php Encoder,你需要创建项目,添加文件然后在Project settings -> Source中的GUI中你应该右键单击你的TPL文件并选择"加密非PHP文件& #34 ;.如果不在ionCube文档中应用Smarty补丁,就无法做到这一点。

你也可以扩展Smarty课程。

对于 Smarty 2 ,代码很简单:

<?php

class MyTemplate extends Smarty {

// Replacement function for _read_file() in Smarty.class.php to add support
// for reading both ionCube encrypted templates and plain text templates.
// Smarty.class.php must be encoded by the creator of the templates for
// ioncube_read_file() to decode encrypted template files

    function _read_file($filename)
    {
        $res = false;

        if (file_exists($filename)) {
            if (function_exists('ioncube_read_file')) {
                $res = ioncube_read_file($filename);
                if (is_int($res)) $res = false;
            }
            else if ( ($fd = @fopen($filename, 'rb')) ) {
                $res = ($size = filesize($filename)) ? fread($fd, $size) : '';
                fclose($fd);
            }
        }

        return $res;
    }    
}

你应该创建这个类的对象来使用修改后的代码。

对于 Smarty 3 ,它有点复杂。

您需要创建MyFileResource课程,如下所示:

<?php
//MyFileResource.php    

class MyFileResource extends Smarty_Internal_Resource_File {

    /**
     * Load template's source from file into current template object
     *
     * @param  Smarty_Template_Source $source source object
     * @return string                 template source
     * @throws SmartyException        if source cannot be loaded
     */
    public function getContent(Smarty_Template_Source $source)
    {       
        if ($source->timestamp) {                                    

            if (file_exists($source->filepath) && function_exists('ioncube_read_file')) {
                $res = ioncube_read_file($source->filepath);
                if (is_int($res)) {
                    $res = false;
                }
                return $res;                  
            }
            else {
                return file_get_contents($source->filepath); 
            }                                
        }

        if ($source instanceof Smarty_Config_Source) {
            throw new SmartyException("Unable to read config {$source->type} '{$source->name}'");
        }
        throw new SmartyException("Unable to read template {$source->type} '{$source->name}'");
    }

}

在你创建Smarty对象的地方添加一些代码。

假设您以这种方式创建了Smarty对象:

require '../libs/Smarty.class.php';

$smarty = new Smarty;

您应该将其更改为:

require '../libs/Smarty.class.php';

require('MyFileResource.php');

$smarty = new Smarty;

$smarty->registerResource('file', new MyFileResource());

这样,每次从文件中读取模板时,都会使用MyFileResource类。我还没有测试过这段代码,但它应该可行。根据您的设置,您可能需要删除所有已编译的模板文件以重新生成它们。

答案 1 :(得分:1)

您可以使用非PHP文件加密功能加密模板文件,但需要修改smarty引擎才能处理解密。如果不这样做,您将只看到显示的加密内容。使用ioncube_read_file()API函数,它将无缝地处理加密和非加密文件。请注意,调用函数的文件必须进行编码,因为没有保护文件调用解密例程是没有意义的。