php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2009

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 23.02.2009, 12:02  
Benutzer
 
Benutzerbild von ElaWeb
 
Registriert seit: 21.02.2009
Beiträge: 45
ElaWeb befindet sich auf einem aufstrebenden Ast
Standard Formulardaten bereinigen

Hallo zusammen,
was haltet ihr von der folgenden Methode Formulardaten zu verarbeiten?

Methode 1
PHP-Code:
# Formulareingaben filtern
function clean_postvars($var)
{
  if(!empty(
$var))
  {
    
$var trim($var);
    
$var strip_tags($var);
    
$var htmlspecialchars($var,ENT_QUOTES,'UTF-8');
    
$var stripslashes($var);
  }

  return 
$var;
}

# $_POST Array durchlaufen und überschreiben
foreach($_POST as $key => $value)
{
  
$content clean_postvars($value);
  
$_POST[$key] = $content;

Methode 2
PHP-Code:
# $_POST Array durchlaufen und in Variablen packen
foreach($_POST as $key => $value)
{
  
$content clean_postvars($value);
  ${
$key} = $content;

Wenn die übergebenen Post-Keys gegen eine Whitelist geprüft werden, spricht dann noch etwas gegen diese Vorgehensweise?

Ich finde es optimal, habe aber gelesen es würde register_globals nachbilden. Klingt auch logisch, zumindest bei der zweiten Variante. Was meint ihr dazu? Gibt es eventuell noch bessere Möglichkeiten?

Geändert von ElaWeb (23.02.2009 um 12:16 Uhr).
ElaWeb ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 23.02.2009, 12:16  
Moderator
 
Registriert seit: 06.06.2008
Beiträge: 4.945
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer Anblick
Wolla eine Nachricht über ICQ schicken
Standard

Das Umwandeln in die Entities mit htmlspecialchars ist an dieser Stelle falsch. Eine Usereingabe :

Mein Name ist "Klein"

wird so vor dem Speichern in Mysql verstümmelt. Richtig ist es, die Sonderzeichen abzuspeichern und diese erst vor dem Ausgeben im HTML-Context mit htmlspecialchars zu bearbeiten.

Ansonsten kannst du die beiden Codeteile auch zusammenfassen:
PHP-Code:
# $_POST Array durchlaufen und überschreiben 
foreach($_POST as $key => $var

    
$var trim($var); 
    
$var strip_tags($var); 
    
$var stripslashes($var); 
  
$_POST[$key] = $var

Der zweite Ansatz ist unnütz. man hat alles im superglobalen $_POST-Array.
Wolla ist offline  
Alt 23.02.2009, 12:22  
Erfahrener Benutzer
 
Benutzerbild von serious-cool
 
Registriert seit: 12.09.2008
Beiträge: 154
PHP-Kenntnisse:
Fortgeschritten
serious-cool befindet sich auf einem aufstrebenden Ast
Standard

Hallo,

wenn du die formular daten in eine DB wegspeicherst würde ich dir zu
noch zu mysql_real_escape_string() raten.

ich verwende derzeit folgende function:
PHP-Code:

function makeSave($usereingabe){
     if(
get_magic_quotes_gpc()) {
         
$usereingabe stripslashes($usereingabe);
     }
     
$usereingabemysql_real_escape_string(trim($usereingabe));
     
$usereingabe=strip_tags($usereingabe);
return 
$usereingabe;

ob meine funktion alleine ausreicht weiss ich jedoch auch nicht sicher
__________________
Ein Klauenhammer ist kein Schraubendreher, auch wenn beide das Problem ,,Schraube-Wand" bidirektional lösen können.
serious-cool ist offline  
Alt 23.02.2009, 12:26  
Benutzer
 
Benutzerbild von ElaWeb
 
Registriert seit: 21.02.2009
Beiträge: 45
ElaWeb befindet sich auf einem aufstrebenden Ast
Standard

Ja, mysql_real_escape_string ist schon klar, ich arbeite übrigens mit mysqli. Das aber direkt mit einzubauen anstatt einzeln aufzurufen ist keine schlechte Idee.

Mir geht es bei meiner Frage hauptsächlich um die Sache mit dem Umschreiben des Post-Arrays um die gefilterten Daten so auch zur weiteren Verarbeitung im Script und Ausgabe auf dem Bildschirm sicher verwenden zu können.
ElaWeb ist offline  
Alt 23.02.2009, 12:39  
Erfahrener Benutzer
 
Benutzerbild von serious-cool
 
Registriert seit: 12.09.2008
Beiträge: 154
PHP-Kenntnisse:
Fortgeschritten
serious-cool befindet sich auf einem aufstrebenden Ast
Standard

Dazu verwende ich normal noch ein Listen Array um nur gewollte $_POST zu verarbeiten. so ist die anzahl der verarbeiteten variabelen begrenzt.

PHP-Code:
$list = array('var1','var2','var3');
// teste alle Werte
foreach ($list as $value) {
    
$_POST[$value]=makeSave($_POST[$value]); 
so bauste auch keine register globals nach
__________________
Ein Klauenhammer ist kein Schraubendreher, auch wenn beide das Problem ,,Schraube-Wand" bidirektional lösen können.
serious-cool ist offline  
Alt 23.02.2009, 12:56  
Benutzer
 
Benutzerbild von ElaWeb
 
Registriert seit: 21.02.2009
Beiträge: 45
ElaWeb befindet sich auf einem aufstrebenden Ast
Standard

Auch eine nette Variante. Danke für die Tipps!

Ich prüfe normal alle übergebenen Array-Keys vom Post-Array mit einer Whitelist.

PHP-Code:
if(isset($_POST['send']))
{
  
$allowed = array('field1','field2','field3','send');
  
$check array_keys($_POST);

  if(
$check === $allowed)
  {
    require(
'process.php');
  }
  else
  {
    die(
'Ungülte Daten übertragen');
  }  

So kommen erst gar keine ungewollten Post-Werte durch.

Geändert von ElaWeb (23.02.2009 um 12:59 Uhr).
ElaWeb ist offline  
Alt 23.02.2009, 15:11  
Moderator
 
Registriert seit: 06.06.2008
Beiträge: 4.945
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer Anblick
Wolla eine Nachricht über ICQ schicken
Standard

Es ist ebenso unsinnig, die eingegebenen Daten erstmal komplett mit mysql_real_escape_string() zu bearbeiten. Das mach man erst im Querystring.

Wenn du z.B. ein Formular verifizierst und einen Eingabefehler feststellst, dann gibst du das Formular mit den schon vorhandenen Daten zusammen wieder aus, und dann hast du in den Eingabefeldern misshandelte Daten.

PHP-Code:
  $allowed = array('field1','field2','field3','send'); 
  
$check array_keys($_POST); 
Dieser Code scheitert bei nicht-angeklickten Checkboxen oder nicht angeklickten Select-Boxen, weil dann nichts übertragen wird.

Geändert von Wolla (23.02.2009 um 15:15 Uhr).
Wolla ist offline  
Alt 23.02.2009, 19:42  
Benutzer
 
Benutzerbild von ElaWeb
 
Registriert seit: 21.02.2009
Beiträge: 45
ElaWeb befindet sich auf einem aufstrebenden Ast
Standard

Ja, das ist absolut korrekt, die Erfahrung habe ich auch schon gemacht. Als Workaround habe ich in dem Fall wo es erforderlich war eben erst überprüft ob dieser Post-Key gesetzt ist.

Das mit mysql_real_escape_string habe ich bislang auch immer im query gemacht, dachte aber daran dass man da ebenso eine Schleife für machen könnte. Für mich persönlich ist es jedoch unsinnig da ich mit Prepared Statements arbeite.

Zitat:
Zitat von Wolla
Das Umwandeln in die Entities mit htmlspecialchars ist an dieser Stelle falsch. Eine Usereingabe :

Mein Name ist "Klein"

wird so vor dem Speichern in Mysql verstümmelt. Richtig ist es, die Sonderzeichen abzuspeichern und diese erst vor dem Ausgeben im HTML-Context mit htmlspecialchars zu bearbeiten.
Wie sieht es in dem Fall aus wenn man die übermittelten Daten dierekt im Formular wiedergeben möchte im Fehlerfall damit der Nutzer nicht alle Eingaben neu machen muss?

Habe da jetzt gegensätzliche Meinungen zu. Bislang dachte ich es wäre gut.
ElaWeb ist offline  
Alt 23.02.2009, 20:16  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.989
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Faustregel:

- Vor Speichern in DB - mysql_real_escape_string (ausser bei. P.S.)
- Vor Ausgabe als HTML - htmlentities

Mehr nicht.
Allenfalls generell einmal strip_slashes auf alle Parameterdaten, wenn magic_quotes an ist.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 23.02.2009, 21:58  
Benutzer
 
Benutzerbild von ElaWeb
 
Registriert seit: 21.02.2009
Beiträge: 45
ElaWeb befindet sich auf einem aufstrebenden Ast
Standard

Das mit htmlentities leuchtet mir ja noch halbwegs ein, aber warum hälst du es für unnötig Tags und Leerstellen zu entfernen?

Ich persönlich finde es sinnvoll und möchte verhindern das Schadcode von meinem Script ausgeführt wird. Darum die ganze Filterung, insbesondere die Prüfung von übertragenen Daten ob diese so in einen vorgegebenen Rahmen passen.
ElaWeb ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Formulardaten senden funktioniert nicht blacksektor PHP Tipps 2008 5 25.05.2008 20:42
Fremde Seiten (Formulardaten) in iFrames ansprechen kostas PHP Tipps 2008 2 26.03.2008 20:00
Formulardaten bei "zurück" nicht verlieren ruferp PHP Tipps 2006 11 21.04.2006 15:22
Formulardaten bleiben bestehen! Sonja PHP Tipps 2006 2 19.04.2006 19:40
probleme mit: formulardaten mit php auswerten p23h43p PHP Tipps 2006 2 22.03.2006 08:35
Problem mit Formulardaten in MySql-DB speichern karl Datenbanken 2 05.12.2005 23:49
Verarbeitung von Formulardaten PHP Tipps 2005-2 4 09.08.2005 19:40
Problem bei der Übergabe von Formulardaten Datenbanken 5 08.08.2005 23:17
POST Problem: Übergabe von Formulardaten Asipak PHP Tipps 2005-2 19 19.07.2005 11:12
formulardaten ohne button senden janni PHP Tipps 2005 3 05.05.2005 13:29
[Erledigt] php iund cgi: Formulardaten prüfen und per cgi senden? PHP Tipps 2004-2 1 11.12.2004 10:29
Formulardaten an Faxgerät Beitragsarchiv 1 06.12.2004 22:42
Formulardaten an Fax PHP Tipps 2004-2 1 05.12.2004 18:51
Weiterleiten von Formulardaten PHP-Fortgeschrittene 5 28.09.2004 11:08
[Erledigt] Formulardaten sammeln, und in Datenbank verteilen. PHP Tipps 2004 1 14.08.2004 20:35

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php daten bereinigen, php formulardaten bereinigen, php formulareingaben bereinigen, php usereingaben filtern, php code bereinigen, php array bereinigen, php formular schadcode, php sonderzeichen bereinigen, formulareingaben bereinigen php, php formular daten bereinigen, formulardaten bereinigen, php post daten bereinigen, http://www.php.de/php-einsteiger/52160-formulardaten-bereinigen.html, php übergebene variablen bereinigen, php post bereinigen, php formulareingaben filtern, php formulardaten filtern, schadcode über formular, php sicherheit $_post array bereinigen, register_globals nachbilden

Alle Zeitangaben in WEZ +2. Es ist jetzt 20:20 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum