Malcolm Beck´s: Sicherheit

Beitrag lesen

hi,

Effektiv benötigst du hier keinen ternären Operator, sondern ein echtes IF: Wenn die Testbedingung für "bösen Inhalt" zutrifft, willst du das Skript mit die() abtöten und stoppen. Hier den ternären Operator zu verwenden verschleiert diese Tatsache.

Im Grunde aber doch auch richtig oder? Es funktioniert ja so, wie es soll.

Ich habe es jetzt geändert:

  $query_request_check = preg_replace('|\?.+$|', '', $_SERVER['REQUEST_URI']);  
  
  if (  (!preg_match("#http|include|<|>|%3C|%3E|%22|\'|ftp|:|script|select|order|distinct|delete|drop|insert|update#i", $_SERVER['REQUEST_URI']))  
    AND (strlen($_SERVER['REQUEST_URI']) > 0 && strlen($_SERVER['REQUEST_URI']) < 90) )  
  {  
    $aufgerufene_url = array_pop (explode( "/", $query_request_check) );  
  }  
  else  
  {  
    $aufgerufene_url = '';  
    die('was wird das?');  
  }

Da hast du dir jetzt die klassische SQL-Injection geproggt. ESCAPING! IMMER! EGAL WO DER WERT HERKOMMT! Dass die Request-URI andernorts irgendeiner Prüfung unterzogen wird, die ggf. zum Skriptabbruch führt, ist bei dieser Betrachtung vollkommen egal.

Das war nur vorläufig zu Testzwecken, aber Danke, dass du mich drauf hinweist, hätte ich wirklich vergessen können.

Warum nicht sowas: $sql = "SELECT .... WHERE feld = '".$dat_verbindung->real_escape_string($aufgerufene_url)."' ...";

Das kannte ich nicht, Danke für den hinweis.

Error 404 weißt du eigentlich schon direkt zu Beginn, wenn du die Seite nicht findest, die verlangt wird

Da habe ich jetzt auch eine Idee zu, siehe unten.

Solch ein Array kommt auch direkt aus der Datenbank, wenn du z.B. "SELECT titel, headline, content FROM tabelle" abfragst und mit $db->fetch_assoc() abholst.

Das habe ich jetzt ein wenig geändert, meinst du sowas in der Art?

  if ($mySite = $dat_verbindung->query($seiten_abfrage))  
  {  
    while ($siteRow = $mySite->fetch_assoc())  
    {  
       $smartyArray = array  
                          (  
                            'titel_name'     => $siteRow['title_tag'],  
                            'my_description' => $siteRow['description'],  
                            'my_keywords'    => $siteRow['meta_tags'],  
                            'my_body_id'     => $siteRow['body_id'],  
                            'my_headline'    => $siteRow['inhalt_ueberschrift'],  
                            'my_content'     => My_bb_Object($siteRow['inhalt_text']),  
                            'my_marginalien' => My_marginalien_bb_Object($siteRow['marginalien']),  
                          );  
    }  
  }  
  
  $smarty = new Smarty;  
  
  if (!empty($smartyArray))  
  {  
    $smarty->assign  
    (  
       $smartyArray  
    );  
  }  
  else  
  {  
    // Error 404  
  }

Smarty bietet verschiedene Möglichkeiten, wie es mit nicht zugewiesenen Variablen im Template umgeht. Standard ist, sie durch Leerstring zu ersetzen.

Das hatte ich wohl nicht getestet, ich ging davon aus, das Smarty sich wie PHP verhält.

holla holla

--
Alle Angaben ohne Gewehr.
Hey, wenn's dir nicht gefällt, mach neu ...