Ankündigung

Einklappen
Keine Ankündigung bisher.

Sonderzeichencodierung in der DB wieder zurück in normale Ausgabe

Einklappen

Neue Werbung 2019

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

  • Sonderzeichencodierung in der DB wieder zurück in normale Ausgabe

    Hello,

    ich habe eine Frage bzgl. der Umwandlung von Sonderzeichen zurück in "Normalform".

    Wenn ich beispielsweise folgenden Text in die DB schreibe:

    "Hallo ein Zeilenumbruch <br /> und ein Umlaut mit Anführungszeichen "ä" " und dabei alle Sonderzeichen in die entsprechende Codierung umwandele, dass das Ganze so aussieht:

    "Hallo ein Zeilenumbruch &amp;lt;br /&amp;gt;und ein Umlaut mit Anf&amp;uuml;hrungszeichen &amp;quot;&amp;auml;&amp;quot;;"

    So, wenn ich mir diesen Eintrag jetzt ausgeben lasse, sieht er so kryptisch aus, wie als zweites geschrieben und die Sonderzeichen werden nicht wieder in die Normalform umgewandelt.
    Wie kann ich das veranlassen, dass alles wieder "normal" ausgegeben wird und auch z.B. die break, also <br /> wieder als Zeilenumbruch vom Browser gehandhabt wird?

    Liebe Grüße, Toeb

  • #2
    Ganz einfach, du solltest Daten nicht so verstümmelt in der Datenbank speichern, dann musst du sie nicht hinterher reparieren.

    Kommentar


    • #3
      Das Problem deine "Sonderzeichen" wieder in "Normalform" umwandeln zu müssen hast du nur weil du Zeichen beim Schreiben in die Datenbank verstümmelst. Arbeite konsequent mit UTF-8 und setze den richtigen Verbindungstyp zur Datenbank. Heutige Datenbanken haben keine Probleme mit "Sonderzeichen".

      Kommentar


      • #4
        Zitat von Toeb Beitrag anzeigen
        Hello,

        ich habe eine Frage bzgl. der Umwandlung von Sonderzeichen zurück in "Normalform".

        Wenn ich beispielsweise folgenden Text in die DB schreibe:

        "Hallo ein Zeilenumbruch <br /> und ein Umlaut mit Anführungszeichen "ä" " und dabei alle Sonderzeichen in die entsprechende Codierung umwandele, dass das Ganze so aussieht:

        "Hallo ein Zeilenumbruch &amp;lt;br /&amp;gt;und ein Umlaut mit Anf&amp;uuml;hrungszeichen &amp;quot;&amp;auml;&amp;quot;;"

        So, wenn ich mir diesen Eintrag jetzt ausgeben lasse, sieht er so kryptisch aus, wie als zweites geschrieben und die Sonderzeichen werden nicht wieder in die Normalform umgewandelt.
        Wie kann ich das veranlassen, dass alles wieder "normal" ausgegeben wird und auch z.B. die break, also <br /> wieder als Zeilenumbruch vom Browser gehandhabt wird?

        Liebe Grüße, Toeb
        wie gibst du das denn wieder aus?
        sorry, shift-taste kaputt

        Kommentar


        • #5
          Ich dachte, dass ist ein Sicherheitsaspekt, das man keine Sonderzeichen zulässt, wie z.B. {} oder & oder <>...

          Kommentar


          • #6
            Die Sicherheit z.B. gegen SQL-Injektion erreichst du durch Prepared Statements.

            Kommentar


            • #7
              Zitat von Toeb Beitrag anzeigen
              Ich dachte, dass ist ein Sicherheitsaspekt, das man keine Sonderzeichen zulässt, wie z.B. {} oder & oder <>...
              Dafür muss man die Daten nicht verstümmeln, sondern einfach nur den Kontextwechsel beachten. Am besten so wie bereits gesagt mit Prepared Statements.

              Kommentar


              • #8
                Einträge laufen alle über pdo->prepare... ist dann auch htmlspecialchars überflüssig?
                Ok danke für die Info.

                Dazu mal eine Frage, wenn ich einen Benutzer erlauben lasse einen Text mit Zeilenumbrüchen zu schreiben und in der db steht dann z.B. Hallo<br />nächste Zeile; wenn ich das ausgebe, wird kein Zeilenumbruch erzeugt, sondern mal sieht den HTML Tag.
                Wie kann ich erreichen, dass der "Tag" ausgeführt und nicht als Code dargestellt wird?
                Dann natürlich das Problem, der Benutzer sollte nicht anderweitige HTML Tags in die db schreiben können, wie kann man das dann ausschließen??

                Kommentar


                • #9
                  Zitat von Toeb Beitrag anzeigen
                  Einträge laufen alle über pdo->prepare... ist dann auch htmlspecialchars überflüssig?
                  Für die Einträge in die DB sind htmlspecialchars nicht nur überflüssig sondern verursacht auch Probleme. Ein '<br>' ist für die Datenbank ein String wie jeder andere. Bei der Ausgabe must du jedoch den Kontextwechsel nach HTML beachten. Dort ist dann dein htmlspecialchars einzusetzen und nicht irgendwo zwischendurch. Schau dir dazu auch den Beitrag Kontextwechsel hier in der Wissenssammlung an.

                  Kommentar


                  • #10
                    Das verstehe ich. Da bleibt nur die Frage, wie lasse ich <br> dann bei der Ausgabe zu und alles andere nicht?

                    Kommentar


                    • #11
                      Ich denke du hast da schon ein Konzeptfehler. Warum speicherst du Dinge in die Datenbank, die du gar nicht ausgeben möchtest? Wenn du nur bestimmte HTML-Elemente zulassen möchtest, ist HTML Purifier ein gutes Werkzeug. Aber wenn es dir nur darum geht Zeilenumbrüche zu speichern, brauchst du gar kein HTML. Normaler Text kann auch Zeilenumbrüche enthalten.

                      Kommentar


                      • #12
                        Zitat von Toeb Beitrag anzeigen
                        Wie kann ich erreichen, dass der "Tag" ausgeführt und nicht als Code dargestellt wird?
                        Das <br> hat in der Datenbank überhaupt nichts zu suchen, da sollte in dem Text einfach nur ein Zeilenumbruch stehen. Bei der Ausgabe wird dann der Kontextwechsel nach HTML behandelt und dann noch nl2br() angewendet damit der Browser die Zeilenumbrüche auch darstellt.

                        Kommentar


                        • #13
                          Verstanden.
                          Ich habe eine Vorschau über ein Modal und JQ, da stelle ich die Umbrüche über replace her und habe das dann bei Bestätigung in die db übernommen.
                          Richtig ist dann, nicht die Vorschau zu übernehmen, sondern den ursprünglichen Text, dann sollte es auch ordentlich funktionieren.

                          Ich danke dir. Manchmal sieht man den Wald vor lauter Bäumen nicht mehr.

                          Kommentar


                          • #14
                            Ich hätte nochmal eine Frage zu htmlspecialchars. Wenn man viele Seiten hat auf denen wiederum viele Daten ausgeben werden, die User eingeben haben, müsste man jede Variable mit htmlspecialchars absichern, was ein ziemlich
                            großer Aufwand ist und auch nicht sonderlich schön aussieht.
                            Gibt es eine "globale" Variante für eine ganze Datei? Also, dass ich zu Begin einer Datei alles Ausgegebene htmlspezialisiere?

                            Kommentar


                            • #15
                              Zitat von Toeb Beitrag anzeigen
                              Ich hätte nochmal eine Frage zu htmlspecialchars. Wenn man viele Seiten hat auf denen wiederum viele Daten ausgeben werden, die User eingeben haben, müsste man jede Variable mit htmlspecialchars absichern, was ein ziemlich
                              großer Aufwand ist und auch nicht sonderlich schön aussieht.
                              Gibt es eine "globale" Variante für eine ganze Datei? Also, dass ich zu Begin einer Datei alles Ausgegebene htmlspezialisiere?
                              Nein, du musst den Kontextwechsel genau dort behandeln, wo er passiert. Nämlich bei der HTML-Ausgabe. Wenn du das global machst, ist es falsch und du verstümmelst dir deine Daten.

                              Du kannst allerdings eine Template-Engine verwenden, die das bereits für dich macht.

                              Kommentar

                              Lädt...
                              X