Небольшой баг
Есть у системы очень неприятный баг а может это фича.
Файл /classes/modules/sys_database/Database.class.php
Функция databaseErrorHandler строка 169
Ситуация: администрация запретила вывод ошибок, но при перегрузке сайте, и если php отвалился по таймауту то ошибка и системная информация может быть выведена в силу особенности работы буфферов. Зачем «чужим» глазам показывать какую либо информацию?
Вот мой фикс:
PS О еще один бажок в нутри тэга кода "\n" неправильно обрабатывается, при выводе добавляет лишний перенос строки…
Файл /classes/modules/sys_database/Database.class.php
Функция databaseErrorHandler строка 169
ob_start();
echo "SQL Error: $message
\n";
print_r($info);
$msg=ob_get_contents();
ob_end_clean();
Ситуация: администрация запретила вывод ошибок, но при перегрузке сайте, и если php отвалился по таймауту то ошибка и системная информация может быть выведена в силу особенности работы буфферов. Зачем «чужим» глазам показывать какую либо информацию?
Вот мой фикс:
$msg = "SQL Error: $message
\n";
$msg .= print_r($info,true);
PS О еще один бажок в нутри тэга кода "\n" неправильно обрабатывается, при выводе добавляет лишний перенос строки…
6 комментариев
И хотелось бы уточнить — для фикса нужно это:
Заменить на это?
ЗЫ: нашел причину бага с тегом br — пофиксил, позже опубликую вместе с другими фиксами Jevix'a
Если выключены сообщения об ошибках, что как правило бывает на продакшене.
Можно генерировать ситуацию когда не смотря на выключенные ошибки будет показано сообщение из $message и $info. А там будет путь к файлу, может быть пользователь и расположение ДБ сервера. Да если покапать взломщик найдет много полезной информации.
Чтоб вывести данные этих переменных взломщику нужно нагрузить сервер и есть большая вероятность что все падать будет до ob_end_clean();
В принципе так у меня и произошло. На шаред хостинге была кемто перегруженна БД. А у меня в поток вываливались ошибки. Имменно в этом месте. Даже не доходило до записи в лог.
Причем падало на этом месте в 50% случаях. Я подозреваю что не хватало памяти на ob_get_contents.
Да и запись Короче, быстрее и лаконичнее.
Я подозреваю что данный код был скопирован из библиотеки Котерова, но там был var_dump который не умеет возвращать текст. В LS заменили на print_r а старую обвязку оставили. Не вспоминая что если вторым параметрам поставить true то
Также напонятно зачем там строка $caller = $db->findLibraryCaller(); caller нигде не используется дальше в этой функции…