Suche nach als

Filter

Auf dieser Seite:

Seit PHP 5.2 gibt es Filterfunktionen, welche Variablen und Eingaben prüfen und unschädlich machen. Vor allem wenn Daten aus Formularen stammen oder aus dem Queristring, und bevor Daten in Datenbanken oder Dateien geschrieben oder sonstwie ausgegeben werden sollen, müssen sie zuvor gefiltert werden.

Vorab ein Formular zum Testen

Das Formular versendet per action POST die Einträge wieder an diese Seite, die Felder heissen 'email' und 'coment'. Zum Test ziehen Sie die beiden bösen Codes neben den Feldern in die Felder und senden das Formular ab. Beide Eingaben werden durch die PHP-Filter gesäubert und das Resultat wird weiter unten dargestellt.

info@
:,;rrrrrr. com

<script type='text/javascript'>alert('XSS')</script>

PHP Filter

Es gibt drei Filtervorgänge in PHP:

  1. Validieren (prüfen), sie heissen FILTER_VALIDATE, und geben nur TRUE oder FALSE zurück
  2. Bereinigen (säubern, entschärfen, heilen), sie heissen FILTER_SANITIZE, und geben den geflickten String zurück
  3. Übergeben (weiterreichen) an eigene Funktionen, er heisst FILTER_CALLBACK, und gibt den bearbeitetetn String zurück

Für jede Filterfunktion gibt es FLAGS und KONSTANTEN:

  1. Wo kommt die Variable her (INPUT_POST, INPUT_GET, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV)
  2. wie heisst die Variable bzw. das Eingabefeld (in meinem Formular "coment" oder "mail")
  3. was soll der Filter tun (VALIDATE oder SANITISE)
  4. was wird erwartet (STRING, EMAIL, URL oder INT)

Mit print_r(filter_list()); erhalten wir eine Aufzählung der PHP Filter:

Array
(
    [0] => int
    [1] => boolean
    [2] => float
    [3] => validate_regexp
    [4] => validate_url
    [5] => validate_email
    [6] => validate_ip
    [7] => string
    [8] => stripped
    [9] => encoded
    [10] => special_chars
    [11] => full_special_chars
    [12] => unsafe_raw
    [13] => email
    [14] => url
    [15] => number_int
    [16] => number_float
    [17] => magic_quotes
    [18] => callback
)

Sanitize

filter_has_var(), filter_input()

<?php
// prüfen ob eine Variable existiert die per POST übermittelt wurde und 'mail' heisst
if(!filter_has_var(INPUT_POST,"mail")) {
  echo "Keine E-Mail Adresse eingegeben<br />";
  } else {
// falls da, Benutzereingabe entgegen nehmen (die per POST kam, 'mail' heisst, und nun geheilt wird als EMAIL)
  echo "E-Mail geheilt: <br />";
  $mail = filter_input(INPUT_POST, "mail", FILTER_SANITIZE_EMAIL);
  highlight_string ($mail);
}

if(!filter_has_var(INPUT_POST,"coment")) {
  echo "Kein Kommentar eingegeben<br />";
  } else {
// Unterschied zu oben: andderer Variablenname und geheilt wird als STRING
  echo "Kommentar geheilt: <br />";
  $coment = filter_input(INPUT_POST, "coment", FILTER_SANITIZE_STRING);
  highlight_string ($coment);
}
?>
Keine E-Mail Adresse eingegeben


Kein Kommentar eingegeben

isset(), is_string()

strip_tags(), htmlentities(), mysql_escape_string(), trim()

Das Filtern ist in etwa das Selbe, als würden (z.B. auf 'coment') eine Menge PHP-Funktionen angewandt:

<?php
if(!isset($_POST['coment'])) {
  echo "Kein Kommentar eingegeben
\n"; } else { if (is_string($_POST['coment'])){ $comentar = trim(mysql_escape_string(htmlentities(strip_tags($_POST['coment']), ENT_QUOTES))); echo "Kommentar geheilt: <br />\n"; highlight_string($comentar); } } ?>
Kein Kommentar eingegeben

Callback

filter_var($coment, FILTER_CALLBACK, array("options"=>"eigeneFunktion"));

Ich kann $coment (oder irgend eine Variable)) auch durch eine eigene Funktion einem Filter übergeben. Dazu muss die Funktion in einem Array zusammengefasst sein mit dem Schlüssel options.

Validate

filter_var($email, FILTER_VALIDATE_EMAIL)

Mit filter_var werden im Code bereits vorhandene Variablen gefiltert, durch VALIDATE wird nur auf Gültigkeit geprüft, und TRUE oder FALSE retourniert, die Variable wird nicht verändert.

 


Valid XHTML 1.0 Check den Code.

Sprachelemente: >> << Sicherheit:
Ich bin hier: > PHP Lehrling >>> Filter
 
HTML und XHTML | CSS | JavaScript und DHTML | PHP und MySQL | Andere Sprachen
Letzter Update: 15.12.2010