nils-hero: Sicherer PHP Code?

Beitrag lesen

Hallo wieder,

Im Allgemeinen ist es nicht notwendig, die Keys zu entslashen. Normalerweise verwendet man ja selbst solche kritischen Zeichen in den Keys nicht. Wenn irgendwer falsche Keys einschleust, hat das auch keine Auswirkungen, wenn man nur auf bekannte Keys zugreift. Mit foreach durch $_POST/$_GET durchzulaufen und ungeprüft alles zu übernehmen, ist auch nicht das, was man mit wachem Verstand und Problembewusstsein macht. Es reicht also die einfache Variante des Example#2 von Disabling Magic Quotes.

Alles gute Vorschläge, ich hab daher das Script nochmal umgeschrieben, s.u.

Da du das Ergebnis nun auswertest, kannst du fopen() mit einem @ "dekorieren".

Aha, war mir auch neu (Schreibe häufiger in Python).

Wenn der Text '<text></text>' in einem HTML-Kontext stehen soll, muss er wie von dir genannt notiert werden, damit der Browser ihn als Text und nicht als Code ansieht. HTML ist ja ebenso wie ein SQL-Statement eine Mischung aus Code und Daten.
Deshalb muss man da besondere Vorkehrungen treffen, um das eine von dem anderen zu unterscheiden.

Leider zeigt der Firefox auch ohne das Wrappen mit htmlspecialchars() Tags in einem Textfeld 'korrekt' an, was m.E. eher irritiert, als hilft, wenn man das lernt.

Wenn Daten vom Browser zum Server gesendet werden, kümmert sich der Browser um eine kontextgerechte Behandlung (Kontext ist nun HTTP). Du bekommst davon normalerweise nichts mit, denn PHP entfernt die "Transportsicherung", bevor es $_POST und $_GET befüllt (und anschließend gegebenenfalls mit Magic Quotes verhunzt).

Für's Archiv: Ich hab das gerade mit UrlParams getestet und da hab ichs kapiert (glaub ich zumindest):

Eine Zeichenkette in einem Textfeld (immer ohne die '') ...

1. '<a href="http://www.de.selfhtml.org">Selfhtml</a>'

... bzw. mit htmlspecialchars() maskiert ...

'&lt;a href=&quot;http://www.de.selfhtml.org&quot;&gt;Selfhtml&lt;/a&gt;'

... wird vom FF nach ...

2. '%3Ca+href%3D%22http%3A%2F%2Fwww.de.selfhtml.org%22%3ESelfhtml%3C%2Fa%3E'

...umgewandelt, über http an den Server geschickt, wo php es zurückwandelt nach...

3. '<a href="http://www.de.selfhtml.org">Selfhtml</a>'

... und es dann, *in die Tischkante beiß*, unter PHP 5 wie folgt, anders unter PHP 4 umwandelt in ...

4. '<a href="http://www.de.selfhtml.org">Selfhtml</a>'

... was ich dann im PHP-Script wieder zurückwandle nach ...

5. '<a href="http://www.de.selfhtml.org">Selfhtml</a>'

... und das war nur die Kommunikation von Client -> Server, *umfall*.

Ich glaub ich hab das jetzt gecheckt... Danke soweit für die Hilfe (:

---

Script, Version 3:

  
<?php  
  
echo '<?xml version="1.0" encoding="utf-8" ?>';  
  
$inhalt   = "";  
$quelle   = "text.xml";  
  
  
/*  
 * Taken from Example 2 at http://php.net/manual/en/security.magicquotes.disabling.php  
 *  
 * */  
if (function_exists("get_magic_quotes_gpc") and get_magic_quotes_gpc()) {  
  
    function stripslashes_deep($value)  
    {  
        $value = is_array($value) ?  
        array_map('stripslashes_deep', $value) :  
        stripslashes($value);  
  
        return $value;  
    }  
  
    $_POST = array_map('stripslashes_deep', $_POST);  
    $_GET = array_map('stripslashes_deep', $_GET);  
    $_COOKIE = array_map('stripslashes_deep', $_COOKIE);  
    $_REQUEST = array_map('stripslashes_deep', $_REQUEST);  
}  
  
  
  
try{  
    if (isset($_POST['textfeld'])){  
        if (trim($_POST['textfeld'])==""){  
            $inhalt = "Stille...";  
        }  
        else {  
            $inhalt = $_POST['textfeld'];  
            $dateihandler = @fopen($quelle, "w+");  
            if (!$dateihandler)  
            throw new Exception('konnte '.$quelle.' nicht zum Schreiben öffnen...');  
            if (!@fwrite($dateihandler, $inhalt))  
            throw new Exception('konnte nicht in '.$quelle.' schreiben...');  
            if (!@fclose($dateihandler))  
            throw new Exception('konnte '.$quelle.' nicht schließen...');  
        }  
    }  
  
  
    else {  
        $dateihandler = @fopen($quelle, "r");  
        if (!$dateihandler)  
        throw new Exception('konnte '.$quelle.' nicht zum Lesen öffnen...');  
        if (!$inhalt = @fread($dateihandler, filesize($quelle)))  
        throw new Exception('konnte nicht aus '.$quelle.' lesen...');  
    }  
}  
catch(Exception $e){  
    $inhalt = $e->getMessage();  
}  
  
$inhalt = htmlspecialchars($inhalt);  
  
?>  

  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  
       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
  
<html>  
  
<head>  
<title>XML aus Formular in Datei speichern</title>  
</head>  
  
<body>  
<form action="formular-xml-in-datei-v3.php" method="post">  
<textarea name="textfeld" rows="10" cols="50"><?php echo $inhalt; ?></textarea>  
<input type="submit" value="Abschicken" />  
</form>  
</body>  
  
</html>  

Gruß, Nils