ilch Forum » Ilch Clan 1.1 » Allgemein » variablen überprüfung leicht gemacht

Geschlossen
  1. #1
    User Pic
    sCoRpIoN Mitglied
    Registriert seit
    03.03.2005
    Beiträge
    1.883
    Beitragswertungen
    0 Beitragspunkte
    tach leute,

    da ich gerade das backend von nem onlineshop umschreibe, wollte ich mal ein recht allgemeines problem ansprechen:
    die überprüfung von variablen bzw. arrays, welche von formularen übergeben werden;

    folgende problemstellung:
    ein formular, mit sagen wir mal 5 eingabefeldern (sehr einfaches formular mit nur 5 feldern), wird abgesendet;
    das ziel ist ein php-skript, welches mit den variablen diverse aktionen durchführen soll;

    nun zum problem: es gilt generell vor beginn jeglicher aktion das übergebene $_GET- bzw. $_POST-Array grob von möglichen schädlingen zu reinigen und es für evtl. abfragen vorzubereiten.

    hierzu findet man sehr häufig folgenden lösungsansatz:
    // Variablen Deklaration
    
    if (!isset($_POST['kategorie']))	$_POST['kategorie'] = "";
    if (!isset($_POST['name_k']))		$_POST['name_k'] = "";
    if (!isset($_POST['main_name']))	$_POST['main_name'] = "";
    if (!isset($_POST['sort']))			$_POST['sort'] = "";
    if (!isset($_POST['start']))		$_POST['start'] = "";
    
    $_POST['neu_kategorie']		= htmlentities($_POST['neu_kategorie'],ENT_QUOTES,'utf-8');
    $_POST['neu_artikelnummer']	= htmlentities($_POST['neu_artikelnummer'],ENT_QUOTES,'utf-8');
    $_POST['neu_name']			= htmlentities($_POST['neu_name'],ENT_QUOTES,'utf-8');
    $_POST['neu_beschreibung']	= htmlentities($_POST['neu_beschreibung'],ENT_QUOTES,'utf-8');
    $_POST['neu_preis']			= htmlentities($_POST['neu_preis'],ENT_QUOTES,'utf-8');


    das obige listing kann sich bei zunehmender anzahl von variablen und konstrollstrukturen natürlich drastisch vergrößern;

    da ja jeder programmierer generell schreibfaul ist, hier nun mein kleiner ansatz zur problemlösung:
    // Variablen Deklaration
    
    foreach ($_POST as $postkey => $postvalue){
    	if (!isset($postkey)){ 
    		$_POST[$postkey] = ""; 
    	}else{
    		htmlentities($_POST[$postkey],ENT_QUOTES,'utf-8');
    	}
    }


    analog natürlich erweiterbar mit diversen weiteren validierungsfunktionen.


    nun würde mich speziell noch interessieren, was ihr von einer solchen umsetzung haltet?


    gruss
    scorp

    betroffene Homepage: www.pixelmonster.eu
    0 Mitglieder finden den Beitrag gut.
  2. #2
    User Pic
    Mairu Coder
    Registriert seit
    16.06.2006
    Beiträge
    15.253
    Beitragswertungen
    366 Beitragspunkte
    Ich hab mir einiger Zeit auch mal solche Hilfsfunktionen geschrieben, allerdings auf Basis von ilch ->
    # moegliche typ vars
    # - integer
    # - string
    # - textarea
    # - checkbox
    function escape ($var, $type = 's') {
      switch ( $type ) {
    	  case 'integer' : case 'i' :
          $var = intval ($var);
          break;
        case 'string' : case 's' :
    			$var = (get_magic_quotes_gpc() ? stripslashes($var) : $var );
          $var = strip_tags ($var);
          $var = addslashes ($var);
    		break;
    		case 'textarea' : case 't' :
          $var = (get_magic_quotes_gpc() ? stripslashes($var) : $var );
    			$var = addslashes ($var);
    		break;
    		case 'checkbox' : case 'c' :
    		  if (strtolower($var) == 'on') {
            $var = 1;
          } else {
            $var = 0;  
          }
        break;		
    	}
    	return ( $var );
    }
    
    /**
     * Funktion um Formulardaten zu escapen und für das Eintragen in die Datenbank vorzubereiten
     * 
     * @param   array   Array mit den Formularfeldern und deren vorgesehen Inhalt in Form
     *                  array('integer_feld' => 'i', 'string_feld' => 's', 'textarea_feld' => 't', 'checkbox_feld' => 'c')
     * @return  array   Array mit den escapeten Felder aus dem Formular 
     */       
    function escape_form_to_array($ar)
    {
        $out = array();
        foreach ($ar as $k => $v) {
            $out[$k] = escape($_POST[$k],$v);   
        }
        return $out;
    }
    
    /**
     *Funktion um ein Array in die Datenbank per INSERT oder UPDATE einzutragen
     *
     * @param     string    Tabellenname in der Datenbank, wohin eingetragen werden soll
     * @param     array     Array mit Feldnamen und Inhalt, der in die Datenbank eingetragen werden soll
     *                      array('feldname' => 'inhalt',...)
     * @param     string    (optional) Updatebedingung, wenn angegeben, wird ein UPDATE mit dieser Bedingung durchgeführt
     *                      ansonsten wird ein INSERT durchgeführt
     * @return    bool      Eintrag war erfolgreich 
     */ 
    function array_to_db($table, $ar, $where = '')
    {
        $mode = empty($where) ? 'INSERT INTO' : 'UPDATE';
        $fields = '';
        foreach ($ar as $k => $v) {
            $fields .= ", `$k` = ".(is_null($v) ? 'NULL' : "'$v'");
        }
        $fields = substr($fields,2);
        $query = "$mode $table SET $fields $where;";
        if (db_query($query)) {
            return true;
        } else {
            return false;
        }
    }


    Ist gleich noch mit zum Eintragen in die Datenbank, was man ja meistens mit Formularfeldern macht.
    Und auch immer mal ein Blick auf die FAQ werfen. | Mairus Ilchseite
    0 Mitglieder finden den Beitrag gut.
  3. #3
    User Pic
    sCoRpIoN Mitglied
    Registriert seit
    03.03.2005
    Beiträge
    1.883
    Beitragswertungen
    0 Beitragspunkte
    jo auch sehr nett;
    für das db-eintragen hab ich mir allerdings auch schon seit langem ne schöne db_layer_klasse erstellt; von der ich alle benötigten child_klassen erben lasse.
    ist für meine fälle leichter wartbar, da ich hier meist nur die db_layer_klasse bearbeiten brauche.

    achja, es gibt soviel was man alles tun könnte, wenn man nur nicht so faul wäre lachen

    eine sehr nette und hilfreiche klasse verbirgt sich hier:
    PHPInputFilter
    phpclasses.php-start.de/browse/package/2189.html

    gruss
    scorp
    0 Mitglieder finden den Beitrag gut.
  4. #4
    User Pic
    Nero Hall Of Fame
    Registriert seit
    12.11.2005
    Beiträge
    987
    Beitragswertungen
    0 Beitragspunkte
    hm... wäre evt. auch nicht verkehrt wenn man ein framework benützen würde.

    Hier mal eine Funktion welche ich bei meinem CMS (Ableger von ilch-CMS) benutze für das escapen von Inhalten in einem $_POST, $_GET oder was auch immer für ein array zwinker.

    /**
     * Escaped nach vorgaben einen Wert
     *
     * @param string|integer $var
     * @param string $type
     * @return string|integer
     */
    function escape ($var, $type = 'integer') {
      switch ( $type ) {
        case 'integer' :
          $var = intval ($var);
          break;
        case 'string' :
          $var = (get_magic_quotes_gpc() ? stripslashes($var) : $var );
          $var = strip_tags ($var);
          $var = addslashes ($var);
          break;
        case 'textarea' :
          $var = (get_magic_quotes_gpc() ? stripslashes($var) : $var );
          $var = addslashes ($var);
          break;
        case 'template':
          $var = strtr($var,array('{'=>'{','}'=>'}'));
          break;
        case 'tpl_lang':
          $var = preg_replace('/\{_lang_([^\}]+)\}/','{_lang_\\1}',$var);
          break;
      }
      return ( $var );
    }
    /**
     * Escaped ein Array nach vorgaben, welche im array $check gespeichert sind.
     * Mit $pos kann man bei einem Mehrdimensionalen Array noch die Pos angeben, wird vorallem 
     * beim escapen von $_POST array verwendet
     *
     * @param array $ar
     * @param array $check
     * @param integer|bool $pos
     * @return array
     */
    function escape_arrays($ar,$check,$pos = false){#-> Escaped nach vorgaben Arrays
      if($pos !== false){$trash = $ar;$ar = array();}
      $return = array();
      foreach($check as $k=>$v){
        $vAr = explode('&',$v);
        if ($pos !== false){$ar[$k] = isset($trash[$k][$pos])?$trash[$k][$pos]:'';
        }elseif (!isset($ar[$k])){$ar[$k] = '';}
        for($i=0;$i<count($vAr);$i++){
          switch($vAr[$i]){
            case 'str': $ar[$k] = $return[$k] = trim(escape($ar[$k],'string'));break;
            case 'txt': $ar[$k] = $return[$k] = trim(escape($ar[$k],'textarea'));break;
            case 'tpl': $ar[$k] = $return[$k] = trim(escape($ar[$k],'template'));break;
            case 'lang':$ar[$k] = $return[$k] = trim(escape($ar[$k],'tpl_lang'));break;
            default:    $ar[$k] = $return[$k] = trim(escape($ar[$k],'integer'));break;
          }      
        }
      }
      return $return;
    }


    das benützen der funktion escape_arrays() ist ansich recht einfach:
    foreach($_POST['install'] as $k=>$v){
      $insert = escape_arrays($_POST,array('name'=>'str&tpl', 'path'=>'str&tpl','loc'=>''),$k);
      $insert['id'] = escape($v,'integer');
      if (0==db_count_query("SELECT COUNT(id) FROM `prefix_module` WHERE (path = '{$insert['path']}' OR name = '{$insert['name']}') AND loc = {$insert['loc']}")){
        db_query("INSERT INTO `prefix_module` (name,path,loc) VALUES ('{$insert['name']}','{$insert['path']}',{$insert['loc']})");
      }
    }


    oder

    $insert = escape_arrays($_POST,array('name'=>'str&tpl', 'email'=>'str&tpl', 'lang'=>'str&tpl', 'recht'=>'', 'grp'=>''));


    Mfg Nero


    Zuletzt modifiziert von Nero am 19.02.2008 - 22:16:14
    ilch-Portal coming soon lachen

    0 Mitglieder finden den Beitrag gut.
  5. #5
    User Pic
    sCoRpIoN Mitglied
    Registriert seit
    03.03.2005
    Beiträge
    1.883
    Beitragswertungen
    0 Beitragspunkte
    wobei der einsatz von magic_quotes an sich keine wirkliche sicherheit bietet; hierzu auch folgendes buch empfehlenswert:
    www.amazon.de/Professionelle-5-Programmierung-Entwicklerleitfaden-Webprojekte-Library/dp/3827323819

    gruss
    scorp


    Zuletzt modifiziert von sCoRpIoN am 19.02.2008 - 22:19:34
    0 Mitglieder finden den Beitrag gut.
Geschlossen

Zurück zu Allgemein

Optionen: Bei einer Antwort zu diesem Thema eine eMail erhalten