Небольшой баг

Есть у системы очень неприятный баг а может это фича.

Файл /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 комментариев

комментарий был удален
avatar
Не совсем понятно как информация может быть показана чужим глазам :)
И хотелось бы уточнить — для фикса нужно это:
ob_start();
echo "SQL Error: $message<br />\n";
print_r($info); 
$msg=ob_get_contents();
ob_end_clean();
Заменить на это?
$msg = "SQL Error: $message<br />\n";
$msg .= print_r($info,true);  

ЗЫ: нашел причину бага с тегом br — пофиксил, позже опубликую вместе с другими фиксами Jevix'a
avatar
Да все правильно, первое заменить на второе.
Если выключены сообщения об ошибках, что как правило бывает на продакшене.
Можно генерировать ситуацию когда не смотря на выключенные ошибки будет показано сообщение из $message и $info. А там будет путь к файлу, может быть пользователь и расположение ДБ сервера. Да если покапать взломщик найдет много полезной информации.
Чтоб вывести данные этих переменных взломщику нужно нагрузить сервер и есть большая вероятность что все падать будет до ob_end_clean();

В принципе так у меня и произошло. На шаред хостинге была кемто перегруженна БД. А у меня в поток вываливались ошибки. Имменно в этом месте. Даже не доходило до записи в лог.
Причем падало на этом месте в 50% случаях. Я подозреваю что не хватало памяти на ob_get_contents.

Да и запись
$msg = "SQL Error: $message<br />\n".print_r($info,true);
Короче, быстрее и лаконичнее.
Я подозреваю что данный код был скопирован из библиотеки Котерова, но там был var_dump который не умеет возвращать текст. В LS заменили на print_r а старую обвязку оставили. Не вспоминая что если вторым параметрам поставить true то print_r не напечатает а вернет результат.
avatar
Теперь понятно! Спасибо, исправлю — нужный фикс.
avatar
ок, исправим
  • ort
  • +3
avatar
Кто будет править, внимательно посмотрите подобные ляпы встречаются в нескольких местах, например в этом же файле функция databaseLogger.
Также напонятно зачем там строка $caller = $db->findLibraryCaller(); caller нигде не используется дальше в этой функции…
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.