Integration von PHPIDS

Aus APF Wiki [de]
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Einleitung

PHPIDS ist ein in PHP geschriebenes intrusion detection system. Es wird eingesetzt, um verdächtige Inhalte zu dedektieren und die Applikation vor möglichen Einbrüchen zu schützen. In diesem Tutorial geht es darum, PHPIDS in das APF zu integrieren.


Idee

Das APF verfügt mit dem Filter-Konzept über eine Möglichkeit, Benutzer-Eingaben zu einem sehr frühen Zeitpunkt zu prüfen und entsprechend zu reagieren. Aus diesem Grund soll PHPIDS in einem eigenen Filter eingesetzt werden, der eine Applikation effektiv schützt.


Umsetzung

Unter php-ids.org wird eine einfache Umsetzung für die Integration des PHPIDS gezeigt. Diese soll genutzt werden, um die APF-Input-Filter zu erweitern.

Das APF besitzt zwei Arten von Input-Filtern: einen für den Betrieb einer Page-Controller- und einen für Front-Controller-Anwendungen. Für beide "Betriebs-Arten" gibt es je eine Variante für UR-Rewriting und eine für "normale" URLs. Die Aufgabe der Filter ist es im Rewrite-URL-Fall, die generischen URLs auf eine Sammlung von URL-Parametern und deren zugehörige Werte zurück zu übersetzen. Da wir diese Funktion auch weiterhin benötigen, sollen die hierzu eingesetzten Filter lediglich um die IDS-Unterstützung erweitert werden.


Grundgerüst

Das Grundgerüst eines APF-Input-Filters hat folgende Gestalt:

Für APF <= 1.13

class IDSFilter extends AbstractFilter {  
 
   public function filter($input){  
      ...
   } 
 
}

Für APF >= 1.14

class IDSFilter implements ChainedContentFilter {  
 
   public function filter(FilterChain &$chain, $input = null) {  
      ...
   } 
 
}

Da wir die bisherige Funktion der Filter weiter nutzen wollen um eine transparente Einbindung des IDS-Filters zu gewährleisten, erweitern wir diese.


Fehlerbehandlung

Sofern der IDS-Monitor anschlägt, soll die Applikation nicht weiter ausgeführt werden. Hierzu bedienen wir uns des globalen Exception-Handlings, das alle nicht in Applikationen abgefangenen Exceptions aufnimmt und mit einer angepassten Fehler-Seite quittiert.


Page-Controller IDS-Filter für APF <= 1.13

Der Page Der hierzu notwendige Quellcode

require('IDS/Init.php');
class PageControllerIDSFilter extends PageControllerInputFilter {  
 
   public function filter($input){  
 
      // Parameter-Mapping im Rewrite-URL-Fall auflösen
      parent::filter($input);
 
      // IDS-Monitor einbinden
      $request = array(
         'REQUEST' => $_REQUEST,
         'GET' => $_GET,
         'POST' => $_POST,
         'COOKIE' => $_COOKIE
      );
      $init = IDS_Init::init('IDS/Config/Config.ini');
      $ids = new IDS_Monitor($request,$init);
      $result = $ids->run();
 
      if(!$result->isEmpty()){
         throw new Exception('IDS monitor detected potential intrusion! Details: '.$result);
      }
 
   } 
 
}

Front-Controller IDS-Filter für APF <= 1.13

require('IDS/Init.php');
class FrontControllerIDSFilter extends PageControllerInputFilter {  
 
   public function filter($input){  
 
      // Parameter-Mapping im Rewrite-URL-Fall auflösen
      parent::filter($input);
 
      // IDS-Monitor einbinden
      $request = array(
         'REQUEST' => $_REQUEST,
         'GET' => $_GET,
         'POST' => $_POST,
         'COOKIE' => $_COOKIE
      );
      $init = IDS_Init::init('IDS/Config/Config.ini');
      $ids = new IDS_Monitor($request,$init);
      $result = $ids->run();
 
      if(!$result->isEmpty()){
         throw new Exception('IDS monitor detected potential intrusion! Details: '.$result);
      }
 
   } 
 
}

Alle Anwendungsfälle für APF >= 1.14

require('IDS/Init.php');
class IDSFilter implements ChainedContentFilter {  
 
   public function filter(FilterChain &$chain, $input = null) {  
 
      // IDS-Monitor einbinden
      $request = array(
         'REQUEST' => $_REQUEST,
         'GET' => $_GET,
         'POST' => $_POST,
         'COOKIE' => $_COOKIE
      );
      $init = IDS_Init::init('IDS/Config/Config.ini');
      $ids = new IDS_Monitor($request,$init);
      $result = $ids->run();
 
      if(!$result->isEmpty()){
         throw new Exception('IDS monitor detected potential intrusion! Details: '.$result);
      }
 
      return $chain->filter($input);
 
   } 
 
}


Anwendung

Die Anwendung gestaltet sich sehr einfach: es muss in der Bootstrap-Datei lediglich der entsprechene Filter angegeben werden:

Page-Controller für APF <= 1.13

include('./apps/core/pagecontroller/pagecontroller.php');
 
Registry::register(
   'apf::core',
   'PageControllerInputFilter',
   new FilterDefinition('my::filter::namespace','PageControllerIDSFilter') 
);
 
$page = new Page();
...

Front-Controller für APF <= 1.13

include('./apps/core/pagecontroller/pagecontroller.php');
import('core::frontcontroller','Frontcontroller');
 
Registry::register(
   'apf::core',
   'PageControllerInputFilter',
   new FilterDefinition('my::filter::namespace','PageControllerIDSFilter') 
);
 
$fC = Singleton::getInstance('Frontcontroller');
...

Alle Anwendungsfälle für APF >= 1.14

include('./apps/core/pagecontroller/pagecontroller.php');
import('core::frontcontroller','Frontcontroller');
 
import('my::filter::namespace','IDSFilter');
InputFilterChain::getInstance()
   ->clear()
   ->addFilter(new IDSFilter())
   ->addFilter(new ChainedGenericInputFilter());
 
$fC = Singleton::getInstance('Frontcontroller');
...


Anpassung der Ausgabe

Das Ergebnis einer intrusion detection ist nun die Anzeige der APF-Exception-Seite. Sollen die durch den Monitor gewonnenen Informationen nicht direkt an den Benutzer geleitet werden, so bietet sich an, den ExceptionHandler zu erweitern. Details dazu können der Dokumentation im Kapitel Erweiterung des Exception-Handling entnommen werden.

Meine Werkzeuge
Namensräume
Varianten
Aktionen
menü
misc
Werkzeuge