nils-hero: Sicherer PHP Code?

Beitrag lesen

Hallo,

Danke an alle für die Tips, ich fauler Kerl will jetzt nicht jedem einzeln antworten (:

Ich hab das Script erweitert, und eine flexiblere Funktion für die Backslashes hinzugefügt, entnommen dem PHP-Manual. Die Entfernung von Javascript Tags etc. hab ich der Übersichtlichkeit halber weggelassen, das mache ich dann, wenn ich das xml bearbeite oder mit nem regulären Ausdruck.

Ich kriege allerdings trotz des try-catch-Blockes ein 'Warning' wegen fopen, wenn die txt.xml fehlt und ich das Dokument frisch aufrufe (also ohne gesetztes $_POST["textfeld']), warum ?!

Ausserdem, ist folgendes korrekt? Text, der z.b. als '&lt;text&gt;&lt;/text&gt;' in der Textarea steht und dann abgeschickt wird, wird wieder zurückgewandelt in die eigentlichen Zeichen, entsprechend der im Dokument verwendeten Zeichencodierung und kommt dann beim verarbeitenden Script als z.B. '<text></text>' an.

Hier der Code, falls ihn jemand gebrauchen kann/bewerten will.

  
<?php  
  
echo '<?xml version="1.0" encoding="utf-8" ?>';  
  
$inhalt   = "";  
$quelle   = "text.xml";  
$post_sauber = transcribe($_POST);  
  
/*  
 * transcribe() is taken (and slightly changed) from http://de.php.net/get_magic_quotes_gpc,  
 * where php at kaiundina dot de postet it on 03-Feb-2005 01:18  
 *  
 * */  
  
function transcribe($aList, $aIsTopLevel = true) {  
  
    $t    = split("\.",phpversion(),2);  
    $version_php = $t[0];  
  
    switch ($version_php) {  
        case "4":  
            $gpcList = array();  
            $isMagic = get_magic_quotes_gpc();  
  
            foreach ($aList as $key => $value) {  
                $decodedKey = ($isMagic && !$aIsTopLevel)?stripslashes($key):$key;  
                if (is_array($value)) {  
                    $decodedValue = transcribe($value, false);  
                } else {  
                    $decodedValue = ($isMagic)?stripslashes($value):$value;  
                }  
                $gpcList[$decodedKey] = $decodedValue;  
            }  
            return $gpcList;  
  
        case "5":  
            $gpcList = array();  
            $isMagic = get_magic_quotes_gpc();  
  
            foreach ($aList as $key => $value) {  
                if (is_array($value)) {  
                    $decodedKey = ($isMagic && !$aIsTopLevel)?stripslashes($key):$key;  
                    $decodedValue = transcribe($value, false);  
                } else {  
                    $decodedKey = stripslashes($key);  
                    $decodedValue = ($isMagic)?stripslashes($value):$value;  
                }  
                $gpcList[$decodedKey] = $decodedValue;  
            }  
            return $gpcList;  
  
        case "6":  
            return $aList; // in PHP 6 gibt es keine magic-quotes mehr ...  
  
    }  
  
}  
  
  
  
  
try{  
    if (isset($post_sauber['textfeld'])){  
        if (trim($post_sauber['textfeld'])==""){  
            $inhalt = "Stille...";  
        }  
        else {  
            $inhalt = $post_sauber['textfeld'];  
            $dateihandler = fopen($quelle, "w+");  
            if (!$dateihandler) throw new Exception('konnte '.$quelle.' nicht zum Schreiben öffnen...');  
            else {  
                fwrite($dateihandler, $inhalt);  
                fclose($dateihandler);  
            }  
        }  
    }  
  
  
    else {  
        $dateihandler = fopen($quelle, "r");  
        if (!$dateihandler) throw new Exception('konnte '.$quelle.' nicht zum Lesen öffnen...');  
        else $inhalt = fread($dateihandler, filesize($quelle));  
    }  
}  
catch(Exception $e){  
    $inhalt = $e->getMessage();  
}  
  
  
?>
~~~~~~html
  
<!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-v2.php" method="post">  
<textarea name="textfeld" rows="10" cols="50"><?php echo htmlspecialchars($inhalt); ?></textarea>  
<input type="submit" value="Abschicken" />  
</form>  
</body>  
  
</html>  

Gruß, Nils