PEAR-Forum.de Übersicht Thema anzeigen - Web-Application-Firewall für PHP

Web-Application-Firewall für PHP


 

PEAR-Forum.de Übersicht » PEAR-Developer & OOP
Neues Thema eröffnen Neue Antwort erstellen Diesen Beitrag ausdrucken
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
MaGdev
Site Admin


Anmeldungsdatum: 04.02.2004
Beiträge: 715
Wohnort: Hamburg

Beitrag20.08.2007 21:18    Web-Application-Firewall für PHP Antworten mit Zitat

Hi Leute,

ich habe mir, nachdem es wohl doch noch Leute gibt, die Eingabe-Werte direkt verarbeiten, nochmal ein paar Gedanken über ein Konzept für eine Application-Firewall für PHP-Anwendungen gemacht.

Herausgekommen ist dabei bisher eine auf der filter-extension basierende Klasse, die eine XML-Datei mit Filterregeln entgegen nimmt. In der Definitonsdatei wird festgelegt, welches Script bestimmte Variablen abfragen darf und wie diese gefiltert werden sollen. Eine Wrapper-Methode für filter_var() ist ebenfalls implementiert.

Es gibt bisher eine wesentliche Einschränkung: es können keine Arrays, z.B. aus GET oder POST, gefiltert werden.

Falls ihr mal Lust habt, euch das mal anzusehen und ggf. eine konstruktive Meinung dazu habt...immer raus damit Cool

Quellcodes:
Die Klasse PHP_InputFilter
PHP:
<?php
/**
 * Copyright 2007 magdev
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * 
 * @datetime    20.08.2007 14:53:08
 * @package     PHP_InputFilter
 * @version     CVS: $Id: InputFilter.php,v 1.3 2007/08/20 19:50:29 magdev Exp $
 * @author      Marco Graetsch <magdev@pear-forum.de>
 */


/**
 * Simple rule-based input-filter
 * 
 * This class is a rule-based filter that also should act as an web-application
 * firewall. If you use this filter for your application, you must define rules
 * for valid GET-, POST-, REQUEST-, SESSION-, COOKIE-, SERVER- and ENV-
 * variables in a XML-file.
 * 
 * @version     0.0.1
 * @category    Security
 * @package     PHP_InputFilter
 * @see         http://www.php.net/filter
 */
class PHP_InputFilter
{
    private static 
$_instance null;
    private 
$_xml null;
    private 
$_input = array(
        
'get'         => INPUT_GET,
        
'post'         => INPUT_POST,
        
'request'     => INPUT_REQUEST,
        
'session'     => INPUT_SESSION,
        
'cookie'     => INPUT_COOKIE,
        
'server'     => INPUT_SERVER,
        
'env'         => INPUT_ENV
    
);
    
    
    
/**
     * Singleton method
     * 
     * @param   string|null  $xmlfile
     * @return  PHP_InputFilter
     */
    
public static function singleton($xmlfile null)
    {
        if (
is_null(self::$_instance)) {
            
self::$_instance = new PHP_InputFilter($xmlfile);
        }
        return 
self::$_instance;
    }
    
    
    
/**
     * Constructor
     * 
     * @param   string|null $xmlfile
     */
    
protected function __construct($xmlfile)
    {
        
$this->setFilterSpecs($xmlfile);
    }
    
    
    
/**
     * Set the filter-definitions
     * 
     * @param   string  $xmlfile
     * @return  true
     * @throws  InvalidArgumentException, DOMException
     */
    
public function setFilterSpecs($xmlfile)
    {
        if (
is_file($xmlfile)) {
            
$this->_xml simplexml_load_file($xmlfile);
            return 
true;
        }
        throw new 
InvalidArgumentException('File not found: '.$xmlfile);
    }
    
    
    
/**
     * Get a value from specific input
     * 
     * @param   string  $requestType    i.e get, post, server, ...
     * @param   string  $varName        Name of the requested variable
     * @param   string  $pageName       Name of the requesting script
     * @return  mixed|false
     * @throws  DOMException
     */
    
public function getVar($requestType$varName$pageName null)
    {
        if (
is_null($pageName)) {
            
$pageName basename($_SERVER['SCRIPT_NAME']);
        }
        
$xpath '//request[@type="'.strtolower($requestType).'"]/page[@name="'.$pageName.'" or @name="all"]/var[@name="'.$varName.'"]';
        if (
$filter $this->_xml->xpath($xpath)) {
            return 
$this->_filter($requestType$filter);
        }
        return 
false;
    }
    
    
    
/**
     * Filter a scalar
     * 
     * @param   mixed   $var
     * @param   int     $filter
     * @param   int     $flags
     * @param   array   $options
     * @return  mixed
     */
    
public function filterVar($var$filter$flags null$options null)
    {
        if (!
is_null($flags) && !is_array($flags)) {
            
$flags = array('flags' => $flags);
        }
        if (
is_array($options) && !array_key_exists('options'$options)) {
            
$options = array('options' => $options);
            if (
$flags) {
                
$options['flags'] = $options;
            }
        }
        return 
filter_var($var$filter$options);
    }
    
    
    
/**
     * Call filter function
     * 
     * @param   string  $requestType
     * @param   SimpleXMLElement    $filter
     * @return  mixed
     */
    
private function _filter($requestType$filter)
    {
        foreach (
$filter as $tmp) {
            
$name = (string) $tmp['name'];
            
$request = array(
                
is_int($requestType) ? $requestType $this->_input[$requestType], 
                
$name,
                
constant((string) $tmp), 
                
$this->_buildOptionsArray($tmp)
            );
            
//print_r($request);
            
$var call_user_func_array('filter_input'$request);
        }
        return 
$var;
    }
    
    
    
/**
     * Build a valid options-array
     * 
     * @param   SimpleXMLElement    $filter
     * @return  array|FILTER_FLAG_NONE
     */
    
private function _buildOptionsArray(SimpleXMLElement $filter)
    {
        
$attr $filter->attributes();
        unset(
$attr['name']);
        
        if (
$attr['flags']) {
            
$flags preg_replace('/(FILTER_[^&|+-\s]+)/e'"constant('\\1')"$attr['flags']);
            unset(
$attr['flags']);
        }
        
        if (
sizeof($attr) > 0) {
            foreach (
$attr as $name => $value) {
                
$options[$name] = (string) $value;
            }
        }
        
        if (
$options) {
            if (
$flags) {
                
$options['flags'] = $flags;
            }
            return array(
'options' => $options);
        }
        return 
$flags ? array('flags' => $flags) : FILTER_FLAG_NONE;
    }
}
?>


XML-Definitionsdatei
Code:

<?xml version="1.0" encoding="UTF-8"?>
<filterspecs>
   <request type="get">
      <page name="index.php">
         <var name="var1" min_range="0" max_range="100">FILTER_VALIDATE_INT</var>
         <var name="var2" flags="FILTER_FLAG_STRIP_HIGH">FILTER_SANITIZE_STRING</var>
         <var name="var2" flags="FILTER_REQUIRE_SCALAR | FILTER_FLAG_ENCODE_HIGH">FILTER_SANITIZE_SPECIAL_CHARS</var>
         <var name="var3" regexp="(input|output)" flags="FILTER_NULL_ON_FAILURE">FILTER_VALIDATE_REGEXP</var>
      </page>
   </request>
   <request type="server">
      <page name="all">
         <var name="REMOTE_ADDR" flags="FILTER_FLAG_IPV4 | FILTER_FLAG_NO_RES_RANGE">FILTER_VALIDATE_IP</var>
      </page>
   </request>
</filterspecs>


Beispiel:
PHP:
<?php
require_once 'PHP/InputFilter.php';

echo 
'<a href="index.php?var1=10&amp;var2=<script>alert(document.cookie)</script>&var3=input">Valid URL</a> | ';
echo 
'<a href="index.php?var1=102&amp;var2=<script>alert(document.cookie)</script>&var3=exit">Invalid URL</a>';

$filter PHP_InputFilter::singleton(dirname(__FILE__).'/filterspecs.xml');

$vars['var1'] = $filter->getVar('get''var1');
$vars['var2'] = $filter->getVar('get''var2');
$vars['var3'] = $filter->getVar('get''var3');
$vars['remote_addr'] = $filter->getVar('server''REMOTE_ADDR');
$vars['http_host'] = $filter->getVar('server''HTTP_HOST');    // This variable is not allowed
$vars['email_valid'] = $filter->filterVar('magdev@apn-solutions.de'FILTER_VALIDATE_EMAIL);
$vars['email_invalid'] = $filter->filterVar('magdevqapn-solutions.de'FILTER_VALIDATE_EMAIL);

echo 
'<pre>';
print_r($vars);
echo 
'</pre>';


Vielen Dank,
Marco

_________________
Auch der längste Weg beginnt immer mit einem kleinem Schritt!

Vorgehen bei Problemen:
1. PHP-Handbuch oder PEAR-Handbuch lesen!
2. Forensuche benutzen!
3. Fragen posten und dabei die Regeln beachten!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Berdir
Power User


Anmeldungsdatum: 22.09.2005
Beiträge: 1347

Beitrag20.08.2007 23:08     Antworten mit Zitat

Zitat:

ich habe mir, nachdem es wohl doch noch Leute gibt, die Eingabe-Werte direkt verarbeiten, nochmal ein paar Gedanken über ein Konzept für eine Application-Firewall für PHP-Anwendungen gemacht.


Solche Leute wird es immer geben, in jeder Sprache (wobei der Anteil bei PHP vermutlich höher ist als bei anderen...) Sad

Für Formulare verwende ich meistens die Validierung von QF, aber ich werde in nächster Zeit zur Vorbereitung für ein Event, bei dem ich PEAR leider nicht verwenden darf (Sad), eine ähnliche Klasse zusammenbauen...

Einige Gedanken zu deiner Umsetzung...

* singleton mit Konfigurationsangabe finde ich persönlich nicht optimal, denn das bedeutet das ich diese XML-Datei entweder immer angeben muss, oder ich muss PHP_InputFilter immer am Anfang aufrufen, auch wenn ich es vielleicht gar nicht benötige... Als Alternative wäre vielleicht eine statische Methode setXMLFile oder so möglich, die den Default-Wert für singleton() setzt. Dann muss ich zwar die Klasse laden, aber nur instanzieren, wenn ich sie auch wirklich benötige.

* XML-File für die Definition ist eine interessante Idee, gerade wenn man es mit anderen Sachen verknüpfen kann. Ich habe zur Zeit die Navigation einer Anwendung von mir in XML definiert, diese Definition könnte man noch um die Parameter(-Validierung) erweitern.... Allerdings wäre das dann eine andere Struktur als bei dir. Es hat aber auch Nachteile, wie man hier sieht, wenn, wie bei filter, die Parameter z.B. aus Konstanten bestehen, ist es relativ mühsam....

* Eine Methode um die aktuelle Page zu setzen wäre meiner Meinung nach sinnvoll, damit man das nicht bei jedem Aufruf angeben muss, falls page != SCRIPT_NAME.

* _filter ist so gebaut, das mehrere Validierungen durchgeführt werden können, aber es wird immer die gleiche Variable $var gesetzt... Ich kenne die filter extension (noch) nicht, aber für mich macht das irgendwie keinen Sinn...

* Letzter Punkt: Macht das ganze zwar komplexer, aber ich denke es wäre sinnvoll, die Validierung und das Parsen der Konfiguration zu trennen, so das man letzteres in eine bestehende Umgebung/Framework einbinden kann, ohne die ganze Klasse neu zu schreiben.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden PEAR-User
MaGdev
Site Admin


Anmeldungsdatum: 04.02.2004
Beiträge: 715
Wohnort: Hamburg

Beitrag21.08.2007 7:15     Antworten mit Zitat

Hallo Berdir,

danke für deine Vorschläge. Das meinte ich mit konstruktiv... Very Happy

Zitat:
* singleton mit Konfigurationsangabe finde ich persönlich nicht optimal, denn das bedeutet das ich diese XML-Datei entweder immer angeben muss, oder ich muss PHP_InputFilter immer am Anfang aufrufen, auch wenn ich es vielleicht gar nicht benötige... Als Alternative wäre vielleicht eine statische Methode setXMLFile oder so möglich, die den Default-Wert für singleton() setzt. Dann muss ich zwar die Klasse laden, aber nur instanzieren, wenn ich sie auch wirklich benötige.

Ok, das könnte man ja problemlos machen... im Prinzip müsste ich ja nur ->setFilterSpecs() auf statisch umstellen.

Zitat:
* XML-File für die Definition ist eine interessante Idee, gerade wenn man es mit anderen Sachen verknüpfen kann. Ich habe zur Zeit die Navigation einer Anwendung von mir in XML definiert, diese Definition könnte man noch um die Parameter(-Validierung) erweitern.... Allerdings wäre das dann eine andere Struktur als bei dir. Es hat aber auch Nachteile, wie man hier sieht, wenn, wie bei filter, die Parameter z.B. aus Konstanten bestehen, ist es relativ mühsam....

Hat man dann auch ausserhalb des Menüs Zugriff darauf? Es soll ja eben darum gehen, wirklich alle Parameter aus Eingaben und eben auch Zugriffe auf _ENV und _SERVER über den InputFilter zu beziehen. Zum Thema mühsam: Kennst du iptables? Ich finde, dagegen ist das hier Kaffeetrinken bei den Pfadfindern....

Zitat:
* Eine Methode um die aktuelle Page zu setzen wäre meiner Meinung nach sinnvoll, damit man das nicht bei jedem Aufruf angeben muss, falls page != SCRIPT_NAME.

Das macht natürlich Sinn!

Zitat:
* _filter ist so gebaut, das mehrere Validierungen durchgeführt werden können, aber es wird immer die gleiche Variable $var gesetzt... Ich kenne die filter extension (noch) nicht, aber für mich macht das irgendwie keinen Sinn...

Hehe, bin auch erstmal drüber gestolpert... Das funktioniert so: Mit dem XPath-Query werden aus der Definition alle var-Zeilen gesucht, die für die gesuchte Variable gesetzt sind (und zwar nur die!). Diese Liste wird der _filter-Methode übergeben. In jedem Element ist natürlich der Variablenname als Attribut enthalten.
[exkurs]
PHP:
<?php
$var 
filter_input(INPUT_GET'var'FILTER_VALIDATE_EMAIL);
// ist das gleiche wie
$var filter_var($_GET['var'], FILTER_VALIDATE_EMAIL);

[/exkurs]
Durch Verwendung der filter_input-Funktion entfällt also der Zugriff auf die Superglobals komplett...hat den weiteren Vorteil, das wenn man eine Aufruf eines Superglobalen Arrays findet, hat man was verkehrt gemacht Smile Es werden also für jede Variable nur die entsprechenden Filter angewandt.

Zitat:
* Letzter Punkt: Macht das ganze zwar komplexer, aber ich denke es wäre sinnvoll, die Validierung und das Parsen der Konfiguration zu trennen, so das man letzteres in eine bestehende Umgebung/Framework einbinden kann, ohne die ganze Klasse neu zu schreiben.

Naja, ein echtes parsen findet ja eigentlich nicht statt, der einzige Zugriff auf das XML erfolgt über XPath (OK, dabei wird das XML geparst, aber so ganz ohne wirds wohl nicht gehen...) Und da die Konfiguration vereinheitlich werden soll, kannst du es doch in (sagen wir mal fast) allen Umgebungen nutzen.

Wie ich das mit den Array löse, ist mir gestern abend auch noch eingefallen...

_________________
Auch der längste Weg beginnt immer mit einem kleinem Schritt!

Vorgehen bei Problemen:
1. PHP-Handbuch oder PEAR-Handbuch lesen!
2. Forensuche benutzen!
3. Fragen posten und dabei die Regeln beachten!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Berdir
Power User


Anmeldungsdatum: 22.09.2005
Beiträge: 1347

Beitrag21.08.2007 8:39     Antworten mit Zitat

Ja, das mit filter_input habe ich mehr oder weniger verstanden, was ich nicht verstehe sind die mehrfachen Aufrufe..

Wenn man die ganzen Schleifen und Abfragen weglässt, machst du ja im Prinzip so etwas:
PHP:
<?php
// Nur als Beispiel, macht so natürlich keinen Sinn...
$var filter_input(INPUT_GET'var'FILTER_VALIDATE_EMAIL); 
$var filter_input(INPUT_GET'var'FILTER_VALIDATE_STRING);


Wie weiss ich jetzt, ob $var eine gültige E-Mail Adresse ist? Und, falls diese Aufrufe intern irgendwie summiert werden, woher weiss ich, welche Validierung fehlgeschlagen ist?

Ev. könnte man den einzelnen Validierungen Fehlermeldungen zuordnen, ähnlich wie das bei QF und dem Beispiel in den Kommentaren auf dieser Seite geschieht, im Fehlerfall ein Iterator-Objekt zurückgeben, das die Fehler gespeichert hat.
http://devzone.zend.com/node/view/id/1113

PS: Nein, mit iptables habe ich noch nichts gemacht Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden PEAR-User
MaGdev
Site Admin


Anmeldungsdatum: 04.02.2004
Beiträge: 715
Wohnort: Hamburg

Beitrag21.08.2007 9:24     Antworten mit Zitat

Ah, jetzt verstehe ich was du meinst...

Es soll aber eigentlich gar nicht darum gehen, die Daten zu validieren (wie bei den QF-Rules), sondern die Eingabedaten zu filtern und ggf. eingeschleuste Werte zu "entschärfen". Der Filter soll so gesehen nicht die QF-Rules ersetzen, sondern ergänzen. Ich würde dann eine eigene QF-Regel schreiben, die den Filter verwendet. (Man könnte auch sagen, nicht addRule() soll ersetzt werden, sondern applyFilter()).

Bezüglich der mehrfachen Aufrufe: Die Filter-extension hat reichlich Möglichkeiten, Filter zu kombinieren. Es mag sein, das die ein oder andere Kombination sinnfrei ist, aber es kann eben durchaus auch sinnvolle Kombinationen geben! Und da, so wie ich das verstanden hab´, immer nur ein Filter angewendet werden kann, müssen dann eben mehrere Durchläufe her.

BTW:
Kennst du den Unterschied zwischen der Gesetzgebung und Firewalls?
Bei der Gesetzgebung ist alles erlaubt, was nicht verboten ist. Bei Firewalls ist alles verboten - es sei denn, es wurde explizit erlaubt.
Leider macht das die Sache immer ziemlich kompliziert...

_________________
Auch der längste Weg beginnt immer mit einem kleinem Schritt!

Vorgehen bei Problemen:
1. PHP-Handbuch oder PEAR-Handbuch lesen!
2. Forensuche benutzen!
3. Fragen posten und dabei die Regeln beachten!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Berdir
Power User


Anmeldungsdatum: 22.09.2005
Beiträge: 1347

Beitrag21.08.2007 10:00     Antworten mit Zitat

MaGdev hat folgendes geschrieben:
Ah, jetzt verstehe ich was du meinst...

Es soll aber eigentlich gar nicht darum gehen, die Daten zu validieren (wie bei den QF-Rules), sondern die Eingabedaten zu filtern und ggf. eingeschleuste Werte zu "entschärfen". Der Filter soll so gesehen nicht die QF-Rules ersetzen, sondern ergänzen. Ich würde dann eine eigene QF-Regel schreiben, die den Filter verwendet. (Man könnte auch sagen, nicht addRule() soll ersetzt werden, sondern applyFilter()).


Hm, das wurde meiner Meinung bei filter eben vermischt... es gibt FILTER_VALIDATE_* und FILTER_SANITIZE_*.... VALIDATE ist addRule und SANITIZE applyFilter.. meiner Meinung nach. Und mit FILTER_VALIDATE_CALLBACK kann man sowieso alles machen.

Zitat:

Bezüglich der mehrfachen Aufrufe: Die Filter-extension hat reichlich Möglichkeiten, Filter zu kombinieren. Es mag sein, das die ein oder andere Kombination sinnfrei ist, aber es kann eben durchaus auch sinnvolle Kombinationen geben! Und da, so wie ich das verstanden hab´, immer nur ein Filter angewendet werden kann, müssen dann eben mehrere Durchläufe her.


Ja, und meine Frage war eben, _kann_ man diese so kombinieren, wie du es gemacht hast. Gemäss den Tests, die ich gerade gemacht habe, kann man das eben nicht.

testFilter.php
PHP:
<?php
// Validierung macht so natürlich keinen Sinn, ein String kann nicht gleichzeitig eine URL und eine E-Mail sein.

echo '<a href="testFilter.php?var=somemail@example.tld">Korrekte Mail-Addresse</a><br />';
echo 
'<a href="testFilter.php?var=somemailatexample">Inkorrekte Mail-Adresse</a>';

$var filter_input(INPUT_GET'var'FILTER_VALIDATE_URL);
var_dump($var);

$var filter_input(INPUT_GET'var'FILTER_VALIDATE_EMAIL);
var_dump($var);


Gibt, wenn man es mit der korrekten E-Mail aufruft, folgenden Output
Zitat:

boolean false

string 'somemail@example.tld' (length=20)


Obschon der erste filter fehlgeschlagen ist, habe ich beim 2. Aufruf ein gültiges Ergebnis, es zählt also immer nur der letzte Filter. Bei diesem einfachen Beispiel kann ich beide Rückgaben abfragen, aber wenn ich das gleiche mit PHP_InputFilter implementieren würde, bekäme ich immer bloss die Rückgabe des letzten Aufrufs.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden PEAR-User
MaGdev
Site Admin


Anmeldungsdatum: 04.02.2004
Beiträge: 715
Wohnort: Hamburg

Beitrag21.08.2007 11:18     Antworten mit Zitat

Zitat:
Ja, und meine Frage war eben, _kann_ man diese so kombinieren, wie du es gemacht hast. Gemäss den Tests, die ich gerade gemacht habe, kann man das eben nicht.

Ok, das hab ich so jetzt nicht getestet...hab´ halt nur (von iptables) die Möglichkeit übernommen, mehrere Regeln auf (eine Eingabe|ein Datenpaket) anzuwenden...
Aber wenn es keinen Sinn macht, muss man es ja nicht definieren. Ist im Prinzip für den InputFilter auch egal, da ->xpath() immer ein Array zurück gibt - und wenn eben nur eine Definition drin ist. Ich werd´ das aber nochmal eruieren - es waren eben gestern von der Idee zur Version oben auch nur einige Stunden... nennen wir es doch ruhig mal eine Machbarkeitstudie...

Bezüglich QF: natürlich würden sich hier Funktionalitäten überschneiden - da QF sowas quasi schon mitbringt. Ich weiss jetzt nicht genau, ob QF die FormRule vor oder nach den anderen Rules ausführt. Wenn FormRule vorher ausgeführt wird, könnte man damit die Filterung anwenden und eine Eingabe z.B. auf eine eMail_Adresse validieren. Nach Anwendung des Filters ist dann die entsprechende Variable entweder eine eMail-Adresse oder null. Damit müsstest du in QF _nur noch_ die required-Regel anwenden. Oder wenn man kein QF benutzt, die Rückgabe nur noch auf null prüfen und keine RegExp entwerfen (was ja auch nicht jedermanns Sache ist). Natürlich könnte man hier auch die Filter-extension direkt verwenden (und sollte es im Zweifel auf jeden Fall tun!), aber die ist an sich schon etwas gewöhnungsbedürftig... man denke nur an die komische Parameter-Übergabe (nicht einfach $options, sondern array('options' => $options), usw.)

Es geht mir auch nicht darum, einen OO-Wrapper für die Filter-Extension zu schreiben! Ich möchte eben nur die Möglichkeit schaffen, an einem zentralen Punkt zu definieren, welches Script welche Variablen mit welchen Werten importieren darf. Eingaben, die an bestimmten Stellen nichts verloren haben, werden entweder gar nicht erst weitergeben (FILTER_VALIDATE_*) oder entschärft (FILTER_SANITIZE_*).
Das soll auf keinen Fall zu schlechtem Programmierstil verleiten oder tiefergehende Prüfungen ablösen...
Denkbar wäre aber z.B. die Definition eines onError-Attributes im XML, das z.B. eine Exception werfen könnte... wenn man denn Fehlermeldungen bei der Filterung benötigt.

Da dieser InputFilter sehr restriktiv ist (sein kann, ganz im Sinne einer Firewall), könnte er aber auf jeden Fall helfen, Angriffspunkte für XSS- und Injection-Attacken zu minimieren. Das man sich dabei selber ein Bein stellen oder auch Scheunentore bauen kann, ist bei Firewalls auch nicht wirklich neu...eine falsche Regel, und man kommt nicht mehr auf den eigenen Server....oder die Firewall ist insgesamt nutzlos...

Den Text unter deinem Link hab ich mir auch gerade mal durchgelesen... Leider (wie so oft in der PHP-Welt Crying or Very sad ) landet das ganze wiedermal bei einer Art Grundsatzdiskussion...

_________________
Auch der längste Weg beginnt immer mit einem kleinem Schritt!

Vorgehen bei Problemen:
1. PHP-Handbuch oder PEAR-Handbuch lesen!
2. Forensuche benutzen!
3. Fragen posten und dabei die Regeln beachten!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
MaGdev
Site Admin


Anmeldungsdatum: 04.02.2004
Beiträge: 715
Wohnort: Hamburg

Beitrag21.08.2007 22:57     Antworten mit Zitat

So, ich hab´ jetzt mal die Sache mit dem onError-Tag implementiert. Dabei kann man bei den Validierungs-Filtern eine definierbare Exception auslösen. Wenn dies nicht notwendig ist, lässt man das Tag einfach weg.

Changelog:
Code:

0.0.2
- fixed bug in filterVar() when using flags
- fixed bug in __construct() to correct handling of $xmlfile == null
- added method to set the current pagename
- added xml-attribute onError to throw an exception if validation fails
- $requestType in getVar() now can be a string (i.e. 'get') or an INPUT_* constant (i.e. INPUT_GET)
- removed invalid doc-comments

0.0.1
- Initial version


Wäre das was?

Viele Grüße und gute Nacht,
Marco

//EDIT: Sorry - hab´s gerade nochmal getestet und das ganze läuft offenbar so nicht - morgen mehr...

_________________
Auch der längste Weg beginnt immer mit einem kleinem Schritt!

Vorgehen bei Problemen:
1. PHP-Handbuch oder PEAR-Handbuch lesen!
2. Forensuche benutzen!
3. Fragen posten und dabei die Regeln beachten!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
MaGdev
Site Admin


Anmeldungsdatum: 04.02.2004
Beiträge: 715
Wohnort: Hamburg

Beitrag21.08.2007 23:23     Antworten mit Zitat

OK, doch noch jetzt - war ein Fehler beim handling mit dem $requestType.

Jetzt gehe ich aber schlafen...

_________________
Auch der längste Weg beginnt immer mit einem kleinem Schritt!

Vorgehen bei Problemen:
1. PHP-Handbuch oder PEAR-Handbuch lesen!
2. Forensuche benutzen!
3. Fragen posten und dabei die Regeln beachten!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Berdir
Power User


Anmeldungsdatum: 22.09.2005
Beiträge: 1347

Beitrag04.09.2007 14:07     Antworten mit Zitat

http://php-ids.org

Verfolgt einen ähnlichen Zweck, arbeitet aber soweit ich das sehe "nur" mit regex. Ist dafür ein gutes Stück komplexer als dieser Ansatz, bietet z.B. auch Logging und eine Einstufung, wie "böse" der Angriff ist.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden PEAR-User
MaGdev
Site Admin


Anmeldungsdatum: 04.02.2004
Beiträge: 715
Wohnort: Hamburg

Beitrag04.09.2007 14:47     Antworten mit Zitat

hallo Berdir,

danke für den Link - werd´s mir mal ansehen... In Richtung IDS gingen auch meine letzten Überlegungen... leider hat mich die Zeit etwas verlassen.

Grüße,
Marco

_________________
Auch der längste Weg beginnt immer mit einem kleinem Schritt!

Vorgehen bei Problemen:
1. PHP-Handbuch oder PEAR-Handbuch lesen!
2. Forensuche benutzen!
3. Fragen posten und dabei die Regeln beachten!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Diese Seite übersetzen
PEAR-Forum.de Übersicht » PEAR-Developer & OOP
Neues Thema eröffnen Neue Antwort erstellen Diesen Beitrag ausdrucken
   Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

Zu Deinen Favoriten hinzufügen

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum nicht herunterladen