Инструкция как сделать вашу систему DataLife Engine еще более неуязвимой. Делаем заглушку для ошибок в PHP.
1. Создаем папку "engine/logs", если она еще не существует. Создаем файл "engine/logs/php.html". На файл накладываем права записи 777. Этот файл бует логом ошибок PHP.
2. В папке "engine/logs", создаем файл ".htaccess", вот такого содержания:
Order Deny,Allow
Deny from all
* Это для того, что бы Ваш лог никто не увел.
3. Отрываем главную страницу вашего сайта, сохраняем её как файл на диск с названием "hello.html". Загружаем этот файл в папку "templates". Таким образом файл будет доступен по адресу "templates/hello.html".
Добавите в файл информацию о том, что якобы произошла ошибка и программу пришлось приостановить. Укажите свой емайл для связи или другие контактные данные, это полезно.
* Этот файл будет заглушкой в случае ошибок.
4. Отройте файл "index.php", найдите
@ini_set ( 'display_errors', true );
и замените на
@ini_set ( 'display_errors', 0 );
В этом же файле, найдите
@ini_set ( 'error_reporting', E_ALL ^ E_WARNING ^ E_NOTICE );
ниже на строчку добавьте
//-------------
function errorHandler($type, $message, $file, $line)
{
static $titles = array(
E_WARNING => 'Предупреждение',
E_NOTICE => 'Уведомление',
E_USER_ERROR => 'Ошибка, определенная пользователем',
E_USER_WARNING => 'Предупреждение, определенное пользователем',
E_USER_NOTICE => 'Уведомление, определенное пользователем',
E_STRICT => 'Проблема совместимости в коде',
E_RECOVERABLE_ERROR => 'Поправимая ошибка'
);
$i = "";
$i = '<h3>' . $titles[$type] . '</h3>'
. '<p>' . $message . '<br />'
. 'Источник: ' . basename($file) . ', line ' . $line . '</p>';
$backtrace = debug_backtrace();
array_shift($backtrace);
$i .= 'Стек вызовов: <ol>';
foreach ($backtrace as $call) {
$i .= '<li>';
if (array_key_exists('file', $call)) {
$i .= basename($call['file']) . ', line '
. $call['line'] . ': ';
}
if (array_key_exists('object', $call) &&
method_exists($call['object'], '__toString')) {
$i .= $call['object'];
}
if (array_key_exists('type', $call)) {
if ($call['type'] == '->') {
$i .= $call['class'] . '->';
} elseif ($call['type'] == '::') {
$i .= $call['class'] . '::';
}
}
$i .= $call['function'] . '(';
$strArgs = '';
foreach ($call['args'] as $arg) {
if (is_null($arg)) {
$strArgs .= 'null';
} elseif (is_bool($arg)) {
$strArgs .= ($arg) ? 'true' : 'false';
} elseif (is_string($arg)) {
$strArgs .= '"' . $arg . '"';
} elseif (is_integer($arg) || is_float($arg)) {
$strArgs .= $arg;
} elseif (is_array($arg)) {
$strArgs .= 'array (' . sizeof($arg) . ')';
} elseif (is_object($arg)) {
$strArgs .= 'object (' . get_class($arg) . ')';
} elseif (is_resource($arg)) {
$strArgs .= 'resource (' . get_resource_type($arg) . ')';
}
$strArgs .= ', ';
}
$strArgs = substr($strArgs, 0, -2);
$i .= $strArgs . ')</li>';
}
$i .= '</ol>';
@mail("admin@mail.ru", 'На вашем сайте произошла ошибка в PHP', $i);
if( ( $f = @fopen(dirname ( __FILE__ )."/engine/logs/php.html","a") ) ){
if( @fwrite( $f, date( 'Y-m-d H:i:s' ).";\n".$i."\n\n\n\n" ) ){
@fclose($f);
}
}
$b = "Извините, но произошла ошибка в программе. Работа временно приостановлена.";
print file_exists(dirname ( __FILE__ ).'/templates/hello.html')?file_get_contents(dirname ( __FILE__ ).'/templates/hello.html'):$b;
die;
}
set_error_handler('errorHandler', E_ALL ^ E_WARNING ^ E_NOTICE );
function fatalCatcher(){
$error = error_get_last();
if ($error['type'] == E_ERROR ||
$error['type'] == E_CORE_ERROR ||
$error['type'] == E_COMPILE_ERROR ||
$error['type'] == E_USER_ERROR) {
errorHandler(
$error['type'],
$error['message'],
$error['file'],
$error['line']);
}
}
register_shutdown_function('fatalCatcher');
//-------------
В этом коде подправьте строку
@mail("admin@mail.ru", 'На вашем сайте произошла ошибка в PHP', $i);
А именно, укажите свой реальный электронный адрес. Это позволит программе отправлять вам письма об ошибках.
Сохраните файл "index.php", не забудьте загрузить файл обратно на сервер.
Это же желательно проделать и для файла "admin.php".
На этом всё.
Читайте так же, как сделать заглушку для БД ошибок в DLE