Script kiddies ErrorHandler
Aus APF Wiki [de]
Einleitung
Aus Sicherheitsgründen sollte eine Applikation möglichst "unauffällig" auf einen provozierten Fehler reagieren um nicht zu viel "Futter" für weitere Angriffe zu geben.
Eine Möglichkeit ist, globale Fehler mit einem eigenen ErrorHandler abzufangen. Dieser nimmt den Fehler auf und leitet zu einem definierten Punkt in der Applikation weiter. So wird der Fehler zur Auswertung und Behebung zwar protokolliert, der Angreifer kann diese jedoch nicht auswerten.
Umsetzung
Die Umsetzung gestaltet sich dabei gemäß der oben verlinkten Dokumentation sehr einfach:
import('core::errorhandler','DefaultErrorHandler'); class LiveErrorHandler extends DefaultErrorHandler { public function handleError($errorNumber,$errorMessage,$errorFile,$errorLine){ // fill attributes $this->errorNumber = $errorNumber; $this->errorMessage = $errorMessage; $this->errorFile = $errorFile; $this->errorLine = $errorLine; // log error $this->logError(); // redirect to start page header('Location: /'); exit(0); } }
In der Version 1.13 wurden (nahezu) alle Stellen entfernt die die PHP-Funktion trigger_error() zur Anzeige von Fehlern nutzten. Die Vorkommen wurden durch Exceptions ersetzt. Daher ist es empfehlenswert für den Live-Betrieb parallel zum LiveErrorHandler (Errors können durch die PHP-API bedingt immer noch auftreten) einen LiveExceptionHandler einzusetzen. Dieser kann wie folgt aussehen:
import('core::exceptionhandler','DefaultExceptionHandler'); class LiveExceptionHandler extends DefaultExceptionHandler{ public function handleException($exception){ // fill attributes $this->exceptionNumber = $exception->getCode(); $this->exceptionMessage = $exception->getMessage(); $this->exceptionFile = $exception->getFile(); $this->exceptionLine = $exception->getLine(); $this->exceptionTrace = $exception->getTrace(); $this->exceptionType = get_class($exception); // log exception $this->logException(); // redirect to start page header('Location: /'); exit(0); } }
Um den ErrorHandler zu registrieren, ist nur noch ein Eintrag in der Bootstrap-Datei nach dem Einbinden der pagecontroller.php notwendig:
APF 1.12:
$reg = &Singleton::getInstance('Registry'); $reg->register( 'apf::core', 'ErrorHandler', new ErrorHandlerDefinition( 'namespace::to::my::custom::error::handler', 'LiveErrorHandler' ) );
APF 1.13:
Registry::register( 'apf::core', 'ErrorHandler', new ErrorHandlerDefinition( 'namespace::to::my::custom::error::handler', 'LiveErrorHandler' ) );
Die Registrierung eines ExceptionHandler gestaltet sich analog dazu:
APF 1.12:
$reg = &Singleton::getInstance('Registry'); $reg->register( 'apf::core', 'ExceptionHandler', new ExceptionHandlerDefinition( 'namespace::to::my::custom::exception::handler', 'LiveExceptionHandler' ) );
APF 1.13:
Registry::register( 'apf::core', 'ExceptionHandler', new ExceptionHandlerDefinition( 'namespace::to::my::custom::exception::handler', 'LiveExceptionHandler' ) );