| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
| Autor |
Nachricht |
MaGdev Site Admin

Anmeldungsdatum: 04.02.2004 Beiträge: 715 Wohnort: Hamburg
|
20.08.2007 21:18 Web-Application-Firewall für PHP |
|
|
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
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&var2=<script>alert(document.cookie)</script>&var3=input">Valid URL</a> | ';
echo '<a href="index.php?var1=102&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 |
|
 |
Berdir Power User
Anmeldungsdatum: 22.09.2005 Beiträge: 1347
|
20.08.2007 23:08 |
|
|
| 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...)
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 ( ), 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 |
|
 |
MaGdev Site Admin

Anmeldungsdatum: 04.02.2004 Beiträge: 715 Wohnort: Hamburg
|
21.08.2007 7:15 |
|
|
Hallo Berdir,
danke für deine Vorschläge. Das meinte ich mit konstruktiv...
| 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 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 |
|
 |
Berdir Power User
Anmeldungsdatum: 22.09.2005 Beiträge: 1347
|
21.08.2007 8:39 |
|
|
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  |
|
| Nach oben |
|
 |
MaGdev Site Admin

Anmeldungsdatum: 04.02.2004 Beiträge: 715 Wohnort: Hamburg
|
21.08.2007 9:24 |
|
|
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 |
|
 |
Berdir Power User
Anmeldungsdatum: 22.09.2005 Beiträge: 1347
|
21.08.2007 10:00 |
|
|
| 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 |
|
 |
MaGdev Site Admin

Anmeldungsdatum: 04.02.2004 Beiträge: 715 Wohnort: Hamburg
|
21.08.2007 11:18 |
|
|
| 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 ) 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 |
|
 |
MaGdev Site Admin

Anmeldungsdatum: 04.02.2004 Beiträge: 715 Wohnort: Hamburg
|
21.08.2007 22:57 |
|
|
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 |
|
 |
MaGdev Site Admin

Anmeldungsdatum: 04.02.2004 Beiträge: 715 Wohnort: Hamburg
|
21.08.2007 23:23 |
|
|
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 |
|
 |
Berdir Power User
Anmeldungsdatum: 22.09.2005 Beiträge: 1347
|
04.09.2007 14:07 |
|
|
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 |
|
 |
MaGdev Site Admin

Anmeldungsdatum: 04.02.2004 Beiträge: 715 Wohnort: Hamburg
|
04.09.2007 14:47 |
|
|
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 |
|
 |
|
|
|
Zu Deinen Favoriten hinzufügen
|
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
|
|