XSS Schutz für Platzhalter

Aus APF Wiki
Wechseln zu: Navigation, Suche

Einführung

Zum Schutz vor XSS-Attacken bietet das APF mit dem XssProtectionInputFilter einen wirksamen Schutz. Details hierzu lassen sich unter XSS Schutz via InputFilter nachlesen.

Um auch bei Einbindung von externen Datenquellen (z.B. Feeds) einen wirksamen Schutz zu gewährleisten, lässen sich die Erweiterte Template-Syntax dazu nutzen, den im APF enthaltenen Platzhalter-Tag um potentielle XSS-Fragmente bei der Generierung der Ausgabe zu filtern.

Lösung

Zunächst wird die im APF enthaltene Platzhalter-Implementierung um den XSS-Schutz erweitert. Dies kann mit Hilfe einer neuen und von PlaceHolderTag abgeleiteten Klasse erledigt werden:

class XssProtectionPlaceHolderTag extends PlaceHolderTag {

   public function transform() {
      return strip_tags(
            html_entity_decode(
                  parent::transform(), ENT_QUOTES, Registry::retrieve('APF\core', 'Charset')
            )
      );
   }

}

Der APF-Parser stellt zur Registrierung von eigenen TemplateExpression-Implementierung eine geeignete Schnittstelle zur Verfügung. Hierzu ist eine vom gleichnamigen Interface abgeleitete Implementierung für den zuvor implementierten Platzhalter-Tag notwendig.

Hierzu erstellen Sie bitte folgende Klasse:

class XssProtectionPlaceHolderTemplateExpression extends PlaceHolderTemplateExpression {

   public static function getDocument($token) {
      $placeHolder = new XssProtectionPlaceHolderTag();
      $placeHolder->setAttribute('name', $token);

      return $placeHolder;
   }

}

Die neue Template-Expression lässt sich nun wie folgt registrieren bzw. den bisherigen (Standard-)Platzhalter ersetzen:

Document::clearTemplateExpressions();
Document::addTemplateExpression(XssProtectionPlaceHolderTemplateExpression::class);
Document::addTemplateExpression(DynamicTemplateExpression::class); // Standard Expression aus bootstrap.php

Anschließend werden alle Platzhalter-Werte in der Applikation durch die PHP-Funktionen strip_tags() und html_entity_decode() gefiltert und die Applikation dadurch noch zusätzlich geschützt.

Verweise

Die in diesem Artikel beschriebene Funktionalität wurde im Rahmen des Tracker-Eintrags ID#147 angefordert.

Sprachen:
Deutsch • ‎English