Я работаю над фреймворком Laravel в течение короткого времени, после завершения веб-сайта, я хочу кодировать его с помощью Ioncube — но я сталкиваюсь с проблемой, когда Ioncube не может преобразовать код движка шаблона лезвия в код PHP перед кодированием и выводить код в виде HTML нормальный текст.
Файлы шаблонов лезвий Laravel не являются настоящим PHP-кодом, поэтому кодер ionCube не может их правильно кодировать; тем не менее, Encoder также предлагает шифрование файлов, которое может помочь в вашем случае, но для этого требуется некоторая настройка:
В Laravel измените модуль, который читает файлы шаблона Blade, заменив file_get_contents(<blade template files>)
с ioncube_read_file(<blade template_files>)
,
В моей установке Laravel 4 кажется, что файл, отвечающий за загрузку и компиляцию шаблонов Blade, находится в vendor/laravel/framework/src/Illuminate/View/Compilers/BladeCompiler.php
строка 62: $contents = $this->compileString($this->files->get($path));
,
Вот, $this->files->get($path)
это просто file_get_contents($path)
с некоторой обработкой ошибок — вы можете найти эту функцию в bootstrap/compiled.php
, Тем не менее, вы должны иметь возможность заменить строку в BladeCompiler.php
с:
$contents = $this->compileString(ioncube_read_file($path));
или (если вы использовали фразу-пароль):
$passphrase = "<my passphrase>";
$contents = $this->compileString(ioncube_read_file($path, $is_encrypted, $passphrase));
Обратите внимание, что вы можете убедиться, что фраза-пароль защищена в файле. Вы можете найти больше информации об этих функциях в Гид пользователя на странице 54.
Получить ioncube_read_file
работая, вам нужно будет кодировать модифицированный модуль. Кроме того, закодируйте остальную часть вашего приложения, за исключением файлов шаблонов Blade.
Зашифруйте (не закодируйте!) Файлы шаблона Blade, обычно заканчивающиеся на .blade.php
и — если вы используете фразу-пароль — убедитесь, что она совпадает с той, которая использовалась для ioncube_read_file
,
Также имейте в виду, что это сгенерирует стандартные файлы PHP из ваших зашифрованных, так как файл компилируется и записывается обратно в кэш в виде простого текста. Если вы хотите изменить это, возможно, стоит заглянуть в Гид пользователя, п. 54 и переопределить / расширить соответствующие методы bootstrap/compiled.php
такие как get
а также put
определить, зашифрован ли файл, и при необходимости записать зашифрованный файл.
Я также должен упомянуть, поскольку этот вопрос регулярно задают на сайте службы технической поддержки ionCube: несмотря на все кодирование и шифрование, код HTML и JavaScript будут быть отображены в сыром виде для всех клиентов, чтобы увидеть. Я упоминаю об этом только потому, что требуется много усилий для защиты ваших файлов шаблонов, которые в большинстве случаев состоят в основном из кода HTML. Это действительно делает любую модификацию действительно сложной (например, удаление логотипа), но такие вещи может также может быть достигнуто с помощью некоторых пользовательских CSS.
Столкнувшись с этой проблемой, я считаю, что этот ответ будет простым и легким способом ее решения. С помощью этого метода вам не придется редактировать каркасные файлы каждый раз после обновления.
Наконец, поменяйте местами Осветить \ View \ ViewServiceProvider :: класс из массива провайдеров config / app.php и замените его собственным ViewServiceProvider.
namespace App\Providers;
use App\Libraries\IonCubeBladeCompiler;
use Illuminate\View\Engines\CompilerEngine;
use Illuminate\View\ViewServiceProvider;
class IonCubeCompilerServiceProvider extends ViewServiceProvider
{
public function registerBladeEngine($resolver)
{
$this->app->singleton('blade.compiler', function () {
return new IonCubeBladeCompiler(
$this->app['files'], $this->app['config']['view.compiled']
);
});
$resolver->register('blade', function () {
return new CompilerEngine($this->app['blade.compiler']);
});
}
}
Второй файл
namespace App\Libraries;use Illuminate\View\Compilers\BladeCompiler;
class IonCubeBladeCompiler extends BladeCompiler
{
public function compile($path = null)
{
if ($path) {
$this->setPath($path);
}
if (! is_null($this->cachePath)) {
if(function_exists('ioncube_read_file')){
//This is what I'm adding.
$contents = $this->compileString(ioncube_read_file($this->getPath()));
}else{
//This is the original line.
$contents = $this->compileString($this->files->get($this->getPath()));
}
$this->files->put($this->getCompiledPath($this->getPath()), $contents);
}
}
}
Для более подробной информации вы можете проверить следующие две ссылки
https://laracasts.com/discuss/channels/laravel/extend-the-compile-function-on-bladecompilerphp
а также
http://blog.ioncube.com/2016/12/19/ioncube-encoding-laravel-project-controllers-models-templates/