Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Probleme mit htmlspecialchars

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Probleme mit htmlspecialchars

    Hallo Leute,

    ich hab ein Datenbankprogramm mit PHP-Frontend geschrieben. Für das Feld "Notizen" habe ich eine textarea eingefügt:

    PHP-Code:
    <textarea name="notizen" cols="88" rows="28" style="font-family:Arial,sans-serif; font-size:10pt;"><?php echo htmlspecialchars($data['notizen']); ?></textarea>
    Das Problem dabei ist, dass sich die Funktion htmlspecialchars etwas seltsam verhält. Wenn ich in das Feld eingebe:

    Code:
    <td>b</td>
    wird das offensichtlich korrekt behandelt, wenn ich den datensatz speichere, steht es genau so in der Datenbank drinne und wenn ich das Formular neu lade, wird es im Textfeld auch genau so angezeigt. Wenn ich allerdings eingebe:

    Code:
    <td></td>
    und speichern möchte, bekomme ich einen 403-Fehler:

    Forbidden

    You don't have permission to access zensiert/index.php on this server.
    Das gleiche passiert übrigens auch, wenn ich htmlspecialchars einfach weglasse. Ich bin ratlos. Hat jemand eine Idee, woran das liegen könnte?

    Tschö, Bastian


  • #2
    Hast du die Möglichkeit, in die Logfiles zu schauen? (Error Log, ggf. PHP-eigenes Logfile)

    Hast du ein „normales“ PHP auf dem Server laufen, oder Suhosin oder etwas ähnliches, was ggf. eigenmächtigt den Script-Input filtert?

    Kommentar


    • #3
      Zeig' mal den Code, der für das Eintragen zuständig ist.

      htmlspecialchars() solltest du nur bei der Ausgabe verwenden, nicht beim Eintragen in die Datenbank. Für Datenbankabfragen solltest du PHP: mysql_real_escape_string - Manual für Zeichenketten verwenden.
      http://hallophp.de

      Kommentar


      • #4
        Benutzt DU GET oder POST?
        --

        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


        --

        Kommentar


        • #5
          Hai Leute,

          Holla, drei Antworten in drei Minuten!!! Das nenn ich mal n aktives Forum!!! Danke für die Antworten, ich schau gleich mal was ich dazu find.

          Bis gleich!!!

          Kommentar


          • #6
            Hallo Leute, wie versprochen einige Antworten:

            @ChrisB: Logfiles habe ich auf dem Server keine sinnvollen gefunden, in der Error.log steht nichts darüber nur nicht gefundene Dateien o.ä. Laut phpinfo() habe ich PHP Version 5.2.13 auf dem Server laufen, allerdings steht ganz unten das:

            This server is protected with the Suhosin Patch 0.9.7
            Copyright (c) 2006 Hardened-PHP Project
            Hilft dir das weiter?

            @nikosch: Ich benutze POST, um die Daten des Formulars an die PHP-Datei zu schicken.

            @Asipak: Für das speichern der Daten in der Datenbank wird folgender Code verwendet:

            PHP-Code:
            //SQL-String fürs Update zusammensetzen
                        
            $sql 'UPDATE
                                    Kunden
                                SET
                                    '
            .$sql_felder.'
                                WHERE
                                    ID = '
            .$_POST['KundenID'];
                                    
                        
            $stmt=$db->prepare($sql);
                        if (!
            $stmt) {
                            
            $ret showInfo($db->error);
                            
            $ret['data']['goto']='zurück';
                            return 
            $ret;
                        }
                        
                        
            $stmt->bind_param('isssssssssssssssiiss',
                                          
            $AnredeID,
                                          
            $_POST['Titel'],
                                          
            $_POST['Vorname'],
                                          
            $_POST['Nachname'],
                                          
            $_POST['Strasse'],
                                          
            $_POST['PLZ'],
                                          
            $_POST['Ort'],
                                          
            $_POST['Land'],
                                          
            $_POST['Geburtsdatum'],
                                          
            $_POST['Tel_Festnetz'],
                                          
            $_POST['Tel_Mobil'],
                                          
            $_POST['email1'],
                                          
            $_POST['email2'],
                                          
            $_POST['Erreichbarkeit'],
                                          
            $eingetragen_am,
                                          
            $partner_geworden,
                                          
            $StatusID,
                                          
            $bearbeiterID,
                                          
            $_POST['sonstiges'],
                                          
            $_POST['notizen']);
                        if (!
            $stmt->execute()) {
                            
            $ret showInfo($stmt->error);
                            
            $ret['data']['goto']='zurück';
                            return 
            $ret;
                        }
                        
            $stmt->close(); 
            Die Variable $sql-Felder enthält natürlich die Namen der Felder der Datenbank. Der Inhalt des Feldes "Notizen" aus dem Formular wird direkt mit $_POST['notizen'] übernommen.

            Ich hoffe, das hilft euch Wissenden weiter. Ich finde das Verhalten der Funktion schon etwas merkwürdig. Übrigens, wenn ich den Quelltext meiner Seite aufrufe, wird angezeigt, dass der Inhalt der textarea sehr wohl umgewandelt wurde. Aus
            Code:
            <td>bla</td>
            im Textfeld wird im Quellcode
            Code:
            &lt;td&gt;bla&lt;/td&gt;
            Liebe Grüße,

            Bastian

            Kommentar


            • #7
              Der Fehler scheint ja auch im Folgescript zu liegen. Anscheinend wird unter bestimmten Umständen nach zensiert/index.php weitergeleitet. Vielleicht solltest Du Dein Script nach einer solchen Weiterleitung durchsuchen.
              --

              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


              --

              Kommentar


              • #8
                Suhosin hat einige Filter, die auf eingehende Parameter angewandt werden können - gut möglich, dass bestimmte Zeichenkombinationen als versuchte HTML-Injection angesehen und deshalb geblockt werden.

                Erstelle mal ein Testscript, das einfach nur per Formular die fragliche Zeichenkette übergeben bekommt, und den Inhalt von $_POST zur Kontrolle ausgibt - ohne Speichern, ohne sonstwas.
                Wenn das Problem dabei auch auftritt, dann liegt es m.E. wirklich an Suhosin. Dann wende dich an den Serverbetreiber.

                Kommentar


                • #9
                  Hai Leute,

                  @nikosh: Die Datei zensiert/index.php ist im prinzip die main-Datei, alle Unterseiten werden über ein template-System geladen, z.B. index.php?section=datenansicht lädt die Datei datenansicht.php als backend für die Verarbeitung der Daten, und die Datei datenansicht.tpl, die den html-Code zur Anzeige der Daten enthält. Daher nehme ich an, dass der versuchte Zugriff auf index.php schon richtig ist, er sollte nur nicht versuchen, dort html-code reinzuschreiben.

                  @ChrisB: Die Theorie klingt plausibel. Zur Entwicklung des Programms habe ich php und apache auf meinem Rechner installiert, um es lokal ausführen zu können, ohne immer auf den Server zuzugreifen. Ich probier mal aus, ob das Problem lokal auch aufauftaucht.

                  Danke für die Tipps, ich hab leider noch nicht so viel Ahnung von PHP.

                  Grüßle,

                  Bastian

                  Kommentar


                  • #10
                    Hallo nochmal,

                    die Theorie von ChrisB scheint zu stimmen. Das Testscript
                    PHP-Code:
                    <?php

                    if ('POST' == $_SERVER['REQUEST_METHOD']) {
                        echo 
                    'Post-Daten: '.$_POST['test'].'<br/>';
                        echo 
                    'mit htmlspecialhars: '.htmlspecialchars($_POST['test']).'<br/>';
                        echo 
                    '=======================================';
                    }
                    ?>
                    <form action="test.php" method="post">
                        <table>
                            <tr>
                                <td>Eingabe des Teststrings</td>
                                <td><input type="text" name="test"/></td>
                            </tr>
                        </table>    
                    </form>
                    liefert bei mir auf dem Rechner immer die richtige Ausgabe, also z.B. "<td></td>" liefert das Ergebnis:

                    Post-Daten:
                    mit htmlspecialhars: <td></td>
                    Die gleiche Eingabe der gleichen Datei auf dem Server liefert einen 403-Fehler:

                    Forbidden

                    You don't have permission to access zensiert/test.php on this server.
                    Da werd ich wohl mal mit meinem Serverbetreiber sprechen müssen. Vielen Dank für die schnelle Hilfe an euch alle. Dieses Forum ist echt klasse.

                    Schönen Abend noch,

                    Bastian

                    Kommentar

                    Lädt...
                    X