Ioncube loader 12 и баги, которые он уже принес. Веселье впереди! Ионкуб стал злым.
После перехода некоторых хостеров на Ioncube loader 12 с 10-й или 11-й версии начали появляться чудеса в виде ошибок, которых никогда не было ранее, А именно:
PHP Warning: [obfuscated](): Null byte in regex in
При том, что код абсолютно валидный. И никаких проблем на 10-й или 11-й версии ioncube loader не возникало на любой версии php от 5.6. до 7.4.
Откуда же взялись нулевые байты в regex?
Программистам может быть интересно.
Исходный код:
$pattern_for_tags = ''; echo "\nЭто тоже 000 pattern_for_tags\n"; echo $pattern_for_tags;
элементарнейший код.
Присвоили переменной пустую строку. И сразу же вывели ее. Ожидали, что будет выведена пустая строка. Т.е. на выходе не будет ничего.
а вот, что имеем на выходе с ioncube loader 12-й версии:
смотрим в браузере в "исходный код".
php + ионкуб превратили пустую строку в последовательность шестнадцатеричных нулей.
Чудеса? Нет, это баг.
Т.е. ионкуб пихает в строки последовательности нулей.
И это даже будет незаметно до поры, до времени. Т.к. браузер даже не чихнет на эти лишние нули, т.к. он их просто не отобразит. И вам будет казаться, что все работает.
Но как только вы такую строку захотите использовать как паттерн для регулярного выражения, то php начинает ругаться на нули, т.к. они, действительно, там появились. И впихнул их именно ioncube loader 12-й версии по одному ему ведомой прихоти.
И делает он это не закономерно, т.е. в начале кода эта строка будет обработана нормально, например, но в другом месте будут подставлены нули. Т.е. тут как повезет.
Проблема к коду PHP не имеет никакого отношения.
Я даже посмотрел исходник на PHP в hex формате. А не затесался ли там нечитаемый символ?
Нет. Там четко есть пустая строка - это только кавычки, и больше ничего.
Думаю, что в лоб это можно попробовать вылечить используя энкодер 12-й.
PHP Warning: [obfuscated](): Null byte in regex in
вот такая ошибка движка PHP появляется при смене ioncube loader на 12-ю версию.
сопровождаться может также 503-й ошибкой сервера и т.д.
на деле нет никаких null byte в regex. Речь про исходный код и про переменные в процессе выполнения. Специально смотрел с отладкой. Чистой воды баг от ионкуба.
Если в журнале ошибок опенкарт увидите вышеприведенную ошибку (Null byte in regex), то смотрите версию ионкуба.
через phpinfo(). Ее генерирует именно 12-й ионкуб.
Версию ioncube loader меняет хостер на общем хостинге. Релиз 12-й ioncube loader стартовал в середине августа 2022-го.
Т.е. пока крайне сырая версия, но некоторые хостеры поспешили уже перейти с 11-й на 12-ю. Хотя обычно дают устаканиться сырому продукту, т.е. дожидаются когда массовые баги отловят в первые несколько месяцев. Месяц-два - это не срок чтобы такого рода продукт перестал быть сырым.
Пользователям VDS автоматический переход на 12-ю не грозит.
Не возникает проблем на любой версии PHP от 5.6 до 7.4 включительно с ioncube loader 10-й или 11-й веток.
Многие хостеры дают возможность выбора версии ioncube loader. Во избежание проблем выбирайте 10-ю или 11-ю версию.
По идее компания ioncube старается обеспечить обратную совместимость программ (и энкодеров более ранних версий) со всеми версиями ioncube loader.
Но когда это не получается у компании ioncube , то она предлагает перекодировать программы новым энкодером, т.е. энкодером 12-й версии чтобы не было проблем с ioncube loader 12-й версии.
Так компания ioncube видит работу над устранением багов, порожденных самой же компанией ioncube.
Чтобы устранить баг компания ioncube предлагает купить 12-й энкодер.
И все могло бы быть не так страшно, но баг ioncube напоролся на признанный баг самого движка php, который описан здесь:
https://bugs.php.net/bug.php?id=77726
Т.е. это поведение официально признано багом и известно разработчикам PHP.
вот ссылка на фиксы данного бага:
https://github.com/php/php-src/pull/8114
Но хостеры не спешат ставить обновленную версию PHP, в которой отсутствует данный баг.
В принципе этот баг самого PHP и не проявился бы если бы ioncube loader не напихал нам нулевых байтов.
вот тест:
<?php preg_match("/a".chr(0)."bc/", 'abc');
запустите этот код. Если вы увидите сообщение об ошибке:
Warning: preg_match(): Null byte in regex in ...\preg00.php on line 3
то это значит, что у вас еще версия PHP с багом. А хостер не заменил ее на версию без бага.
Итого, что имеем?
Удивительный случай когда баг ioncube loader встретился с багом движка PHP.
При совершенно валидном изначальном коде.
От аномального поведения невозможно избавиться.
удаляем NULL байты, но вместо удаления либо появляются новые, либо удаляются только конечные и начальные.
Чудеса! Точнее, это баги.
Пробовал так бороться:
$pattern_for_tags = ''; $pattern_for_tags = str_replace("\0", '', $pattern_for_tags); echo "\nЭто тоже после удаления NULL-ей pattern_for_tags\n"; echo $pattern_for_tags; $pattern_for_tags = trim($pattern_for_tags); echo "\nЭто тоже после TRIM pattern_for_tags\n"; echo $pattern_for_tags;
Но, как говорится фиг вам. php с кубом стоят на своем.
видимо, без покупки енкодера 12 удивительный баг не побороть.
Хороший маркетинговый ход у разработчиков ионкуба. Создать баг в новом loader-е, для исправления которого нужно купить новый энкодер 12-й версии за $300.
Видать, с продажами энкодера 12-го совсем плохо.
Да и зачем он нужен то?
Поддержки php 8 в нем нет и не будет. А кому нужна поддержка 8.1, собственно, для которой он и сделан?
И, не факт, что применение 12-го энкодера позволит решить проблему. Это как лотерея.
Может быть, что это неустранимый пока баг 12-й версии ioncube loader-а.
ioncube репутацию свою подпортили, подложив такую свинью...
Проблемный получился продукт № 12.
По-хорошему нужно отказываться от применения ioncube. Тем более, что для 8-й версии PHP его нет и не будет никогда. Но есть для 8.1. Для 8-ки они вообще решили не делать. Какой-то удивительный подход у разработчиков ioncube.
Изменено пользователем sitecreator
- 1
3 комментария
Рекомендованные комментарии
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Зарегистрировать аккаунтВойти
Уже зарегистрированы? Войдите здесь.
Войти сейчас