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 коментаря
Recommended Comments
Створіть аккаунт або увійдіть для коментування
Ви повинні бути користувачем, щоб залишити коментар
Створити обліковий запис
Зареєструйтеся для отримання облікового запису. Це просто!
Зареєструвати аккаунтВхід
Уже зареєстровані? Увійдіть тут.
Вхід зараз