в скрипте используется такая конструкция
if (!defined('GUESTBOOK'))
throw new Exception('Hack attempt in ' . __FILE__);
но она находится не в try-блоке. Далее можно увидеть это:
set_exception_handler(array('Base', 'ExceptionHandler'));
из чего я делаю вывод, что назначается функция для обработки неперехваченых исключений.
Сама функция:
public static function ExceptionHandler($exception)
{
echo $exception->getMessage();
}
Вот... Я пробовал проверить ее работу, при этом опера выдает следующее:
Fatal error: Uncaught exception 9;Exception' with message 'Hack attempt in C:\www\html\guest\private\index.php' in C:\www\html\guest\private\index.php:13 Stack trace: #0 {main} thrown in C:\www\html\guest\private\index.php on line 13
Я полагаю, что функция не сработала... Почему? Как правильно указывать обработчик исключений?
Спустя 59 минут, 13 секунд (22.08.2010 - 14:52) Guest написал(а):
это и есть обрыв исключения если оно не перехвачено
Спустя 15 минут, 22 секунды (22.08.2010 - 15:07) Invis1ble написал(а):
Guest это я итак понимаю. Прочти мой вопрос
Спустя 1 час, 48 минут, 12 секунд (22.08.2010 - 16:55) Invis1ble написал(а):
Неужели задумка автора состояла в том, чтобы возникала Fatal error?
ИМХО, логичнее было бы простой вывод сообщения в браузер, без fatal error... Думаю, в скрипте есть какая-то недоработка...
ИМХО, логичнее было бы простой вывод сообщения в браузер, без fatal error... Думаю, в скрипте есть какая-то недоработка...
Спустя 1 час, 14 минут, 50 секунд (22.08.2010 - 18:10) vasa_c написал(а):
Цитата |
Далее можно увидеть это: |
Далее это где?
Спустя 7 минут, 5 секунд (22.08.2010 - 18:17) Invis1ble написал(а):
вот код, чтоб было понятно:
if (!defined('GUESTBOOK'))
throw new Exception('Hack attempt in ' . __FILE__);
class Base
{
/**
* @staticvar
* Синглтон приложения (Application).
*
* @var Application
*/
private static $app = null;
/**
* @static
* Функция создает объект приложения.
* Выбрасывает исключение, если приложение уже создано.
*/
public static function CreateApplication()
{
if (self::$app == null)
self::$app = new Application;
else
throw new Exception('Application is already created');
}
/**
* @static
* Функция возвращает объект приложения.
* Выбрасывает исключение, если объект приложения еще не создан.
*
* @return Application
*/
public static function App()
{
if (self::$app == null)
throw new Exception('Application is not yet created');
return self::$app;
}
/**
* @static
* Функция для автозагрузки классов в PHP. Подключение в самом низу файла.
*
* @param string $classname
*/
public static function Autoload($classname)
{
include MODULES_DIR . $classname . '.php';
}
/**
* @static
* Функция для управления необработанными исключениями (если не был найден ниодин подходящий оператор catch).
*
* @param Exception $exception
*/
public static function ExceptionHandler($exception)
{
// Here some logic may be placed, so we can process $exception data passed from throw operator
echo $exception->getMessage();
}
/**
* @static
* Функция гарантирует, что в переданной строке будут экранированы все опасные символы для sql-запроса.
* Следует использовать на данных из массивов GET, POST и COOKIE.
*
* @param string $string
* @return string
*/
public static function EscapeAfterRequest($string)
{
if (get_magic_quotes_gpc())
return $string;
return mysql_real_escape_string($string);
}
/**
* @static
* Функция устанавливает заголовок Location и завершает выполнение скрипта
* для того, чтобы немедленно перенаправить запрос.
*
* @param string $location Url на который необходимо перенапривать запрос.
*/
public static function Redirect($location)
{
header('Location: ' . $location);
exit();
}
}
/**
* Функция устанавливает обработчик для автозагрузки классов.
* Подробнее смотреть на php.net.
*/
spl_autoload_register(array('Base', 'Autoload'));
/**
* Функция устанавливает обработчик для для неперехваченных во время выполнения скрипта исключений.
* Подробнее смотреть на php.net.
*/
set_exception_handler(array('Base', 'ExceptionHandler'));
Спустя 1 минута, 33 секунды (22.08.2010 - 18:19) vasa_c написал(а):
В какой последовательности выполнятся эти инструкции?
Спустя 6 минут, 21 секунда (22.08.2010 - 18:25) Invis1ble написал(а):
терзают меня смутные сомнения по поводу того, что функция определяется "после" выброса исключения... В этом причина? Если да, то как правильней сделать?
Спустя 3 минуты, 50 секунд (22.08.2010 - 18:29) vasa_c написал(а):
Очевидно - определять до.
Спустя 1 минута, 6 секунд (22.08.2010 - 18:30) Invis1ble написал(а):
я просто набираю в строке браузера страницу, например данный код находится в guest/midules/Base.php - вот если это набрать то выскакивает fatal error, хотя по идее я так понимаю должно просто сообщение выводиться "Hack attempt..." и завершаться скрипт
Спустя 1 минута, 22 секунды (22.08.2010 - 18:32) Invis1ble написал(а):
vasa_c
Цитата |
Очевидно - определять до. |
так а как в данном случае правильней сделать?
Спустя 1 минута, 31 секунда (22.08.2010 - 18:33) Invis1ble написал(а):
то есть функцию надо выдрать из класса и поставить ее до throw new Exception ?
Спустя 4 минуты, 30 секунд (22.08.2010 - 18:38) vasa_c написал(а):
Нет, но установить её в качестве обработчика прерываний очевидно нужно до выброса оного.
Спустя 17 минут, 17 секунд (22.08.2010 - 18:55) Invis1ble написал(а):
set_exception_handler(array('Base','ExceptionHandler'));
if (!defined('GUESTBOOK'))
throw new Exception('Hack attempt in '.__FILE__);
class Base
{
...
public static function ExceptionHandler()
{
echo $exception->getMessage();
}
...
}
Так?
P.S. Кстати насколько целесообразно использование в данном случае константы __FILE__ в плане безопасности?
Спустя 9 минут, 11 секунд (22.08.2010 - 19:04) vasa_c написал(а):
Цитата |
Так? |
Если заработало так, как надо, значит так.
Цитата |
Кстати насколько целесообразно использование в данном случае константы __FILE__ в плане безопасности? |
Внутри кода в плане безопасности никаких проблем.
А показывать простым смертным пользователям исключения, ошибки и пути к файлам неправильно, как в плане безопасности, так и здравого смысла.
Спустя 16 минут, 59 секунд (22.08.2010 - 19:21) Invis1ble написал(а):
vasa_c
Цитата |
А показывать простым смертным пользователям исключения, ошибки и пути к файлам неправильно, как в плане безопасности, так и здравого смысла. |
я так и думал.
Цитата |
Если заработало так, как надо, значит так |
заработать-то заработало, только самое интересное вот что: if (!defined('GUESTBOOK')) throw new Exception('Hack attempt ...'); вставлено в начало каждого файла... Т.е. получается, что файлы, в которые этот класс не включается, будут выдавать пресловутый fatal error ? Я правильно понимаю?
Спустя 9 минут, 6 секунд (22.08.2010 - 19:30) vasa_c написал(а):
GUESTBOOK - это не класс, это константа.
Видимо, все эти файлы подключаются из другого, в котором константа эта определена, а таким образом делается проверка на то, чтобы файл не запустили напрямую.
Видимо, все эти файлы подключаются из другого, в котором константа эта определена, а таким образом делается проверка на то, чтобы файл не запустили напрямую.
Спустя 5 минут, 22 секунды (22.08.2010 - 19:35) Invis1ble написал(а):
vasa_c
Цитата |
GUESTBOOK - это не класс, это константа |
это я понимаю. Я имею ввиду класс Base (в котором функция ExceptionHandler) подключается не ко всем файлам, а throw new Exception во всех файлах есть...
Спустя 13 часов, 10 минут, 28 секунд (23.08.2010 - 08:46) linker написал(а):
Это ахинея - автолоад класса запихан в конец файла, где определяется сам класс... Придется тебе во всех файлах, где определяются только классы и функции сносить нафиг не нужные
if (!defined('GUESTBOOK')). Удалять в конце всех таких файлов
throw new Exception('Hack attempt in ' . __FILE__);
set_exception_handler(array('Base', 'ExceptionHandler'));в отдельный конфиг, туда же вынести
spl_autoload_register(array('Base', 'Autoload'));
Спустя 6 часов, 16 минут, 30 секунд (23.08.2010 - 15:02) Invis1ble написал(а):
linker
Я так понимаю, что скачаный мной сорс - далеко не лучший пример для изучения и тренировки ... Огромная просьба: дай какой-нибудь нормальный не слишком запутаный сорс, подходящий для изучения (желательно с комментариями).
Я так понимаю, что скачаный мной сорс - далеко не лучший пример для изучения и тренировки ... Огромная просьба: дай какой-нибудь нормальный не слишком запутаный сорс, подходящий для изучения (желательно с комментариями).
Спустя 12 минут, 4 секунды (23.08.2010 - 15:14) linker написал(а):
Спустя 10 минут, 28 секунд (23.08.2010 - 15:25) Invis1ble написал(а):
linker
Спасибо. Только я имел ввиду, вообще, ООП-шный код какой-нибудь, типа гостевухи или что-нибудь в этом духе...
Спасибо. Только я имел ввиду, вообще, ООП-шный код какой-нибудь, типа гостевухи или что-нибудь в этом духе...
Спустя 2 минуты, 24 секунды (23.08.2010 - 15:27) linker написал(а):
К сожалению такового не имею, но почитать мануал и написать самому будет куда полезнее.
Спустя 6 минут, 56 секунд (23.08.2010 - 15:34) Invis1ble написал(а):
linker
да теорию я уже почитал, не только мануал. Хочется самому написать форум на ООП (я его уже писал на процедурках), а мне намного проще по примерам ориентироваться (наверно склад ума такой)...
да теорию я уже почитал, не только мануал. Хочется самому написать форум на ООП (я его уже писал на процедурках), а мне намного проще по примерам ориентироваться (наверно склад ума такой)...
_____________
Профессиональная разработка на заказ
Я на GitHub | второй профиль