Script kiddies ErrorHandler

Aus APF Wiki
Wechseln zu: Navigation, Suche

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:

use APF\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);

   }

}

Grundsätzlich werden im APF-Code keine trigger_error()-Aufrufe sondern konsequent Exceptions zur "Anzeige" von Fehlern genutzt. Aus diesem Grund 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:

use APF\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 die Behandlung von PHP-Fehlern und Exceptions zu vereinheitlichen lässt sich der LiveErrorHandler auch wie folgt verändern:

use \ErrorException;
use APF\core\errorhandler\DefaultErrorHandler;

class LiveErrorHandler extends DefaultErrorHandler {

   public function handleError($errorNumber, $errorMessage, $errorFile, $errorLine){
      throw new ErrorException($errorMessage, $errorNumber, 1, $errorFile, $errorLine);
   }

}

Sollte ein PHP-Fehler auftreten, wird dieser nun in eine Exception verpackt und an den LiveExceptionHandler "weitergeleitet".


Konfiguration

Um den LiveErrorHandler bzw. den LiveExceptionHandler zu registrieren fügen Sie bitte folgende Zeilen zu ihrer Bootstrap-Datei hinzu:

use APF\core\errorhandler\GlobalErrorHandler; 
use VENDOR\..\LiveErrorHandler; 
GlobalErrorHandler::registerErrorHandler(new LiveErrorHandler());

use APF\core\exceptionhandler\GlobalExceptionHandler; 
use VENDOR\..\LiveExceptionHandler; 
GlobalExceptionHandler::registerExceptionHandler(new LiveExceptionHandler());
Sprachen: