• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Von HTML zu MySQL und zurück

Mark

Neues Mitglied
Ich möchte (authorisierten) Usern erlauben HTML Code in ein Eingabeformular zu tippen, will dies in MySql speichern und später wieder zurück holen um den Code zu bearbeiten und auf einer Seite anzuzeigen.
Sicherheit ist kein Problem, weil nur vertrauenswürdige User Zugriff auf die Funktion bekommen, das Problem liegt im Escapen, oder anders gesagt, ich verliere völlig die Übersicht.

Ich beginne mit einem HTML Formular

Code:
<form action="save.php" method="post">
<textarea name="meintext">
...

Der User soll jetzt beliebigen Text eingeben dürfen, also auch CSS, JavaScript, usw., mit sämtlichen Sonderzeichen, Anführungszeichen und sonstwas.
Dann wird das Formular gesendet, ich bekomme den Text und will ihn in MySql speichern:

Code:
$content = mysql_real_escape_string($_POST['meintext']);
mysql_query("INSERT INTO `texte` (`content`) VALUES ('".$content."')");

Das geht natürlich nicht so einfach, weil da alle möglichen Sonderzeichen, insbesondere Anführungszeichen, drin stehen können, die Probleme machen.

Frage 1: Wie muss ich den Code ändern oder ergänzen, damit immer ganz exakt das was der User eingetippt hat in MySql landet?
Reicht mysql_real_escape_string() oder brauche ich noch addslashes() stripslashes() oder was sonst?


Jetzt das Ganze rückwärts, und da wirds kompliziert, weil ich 2 verschiedene Versionen brauche.

1.) Anzeige in einem Formularfeld zum bearbeiten des Codes.

Code:
$data = mysql_fetch_object(mysql_query("SELECT `content`FROM `texte` WHERE `id` = 1"));
print <<<END
<form action="update.php" method="post">
<textarea name="meintext">
$data->content
</textarea>
...
END;

Hier fehlt mir die Konvertierung, die den Text so anzeigt wie er ist, inkl. aller Sonderzeichen, und so, dass ich den Text nach dem Senden im update.php auch wieder 1:1 in MySql eintragen kann.
Mache ich gar nichts, setzt er in der textarea Sonderzeichen um, statt &quot; macht er ein Anführungszeichen.
Mache ich htmlspecialchars($data->content), zeigt er zwar in der Textarea alles richtig an, aber beim Senden bekomme ich statt Anführungszeichen halt &quot;

Frage 2: Wie bekomme ich den Text aus MySql so in die textarea, als ob der User es gerade eingetippt hätte.

2) Anzeige auf einer Seite

Code:
$data = mysql_fetch_object(mysql_query("SELECT `content` FROM `texte` WHERE `id` = 1"));
print $data->content;

Frage 3: Wie bekomme ich den Text aus MySql so in die Seite wie er in MySql steht, völlig egal aus was für einer wilden Mischung aus JavaScript, CSS und sonstwas der Text besteht?

Dass es geht weiss ich, weil PHPMyAdmin damit keinerlei Probleme hat, aber wie macht der das?
 
Folgendes könnte die Lösung für dein Problem darstellen:

PHP: serialize - Manual

Durch diese Funktion wird dein Eintrag in ein Inhalt gewandelt, welches ohne Problem gespeichert werden kann.

Diese kann man dann per folgenden Code auch wieder zurück wandeln:

PHP: unserialize - Manual

Die Ausgabe machst du dann innerhalb der "<pre>" Tags mithilfe folgendem Code:

PHP: htmlspecialchars - Manual

Hoffentlich konnte ich dir weiter helfen.

Gruß
 
Zuletzt bearbeitet:
Ich möchte (authorisierten) Usern erlauben HTML Code in ein Eingabeformular zu tippen, will dies in MySql speichern und später wieder zurück holen um den Code zu bearbeiten und auf einer Seite anzuzeigen.
Sicherheit ist kein Problem, weil nur vertrauenswürdige User Zugriff auf die Funktion bekommen, das Problem liegt im Escapen, oder anders gesagt, ich verliere völlig die Übersicht.
Das sind Kontexwechsel, es gibt bei selfhtml ein Artikel dazu Artikel:Kontextwechsel ich weiß aber nicht ob er dir wirklich weiter hilft.

Das was du dir klar machen musst ist, dass du nur dann eine Funktion einsetzt, wenn ein Wechsel nötig ist. In deinem Fall sieht das leicht verkürzt so aus:

User Eingabe => Datenbank - hier reicht mysql_real_escape_string(), denn der Datenbank sind HTML Tags o.ä. egal
Datenbank => Ausgabe - hier kommt es drauf an wohin die Ausgabe soll.
HTML Seite: Hier kommt es drauf an, wenn der Code, den der User eingibt, 100% HTML ist, d.h. ein Zeilenumbruch gibt er als <br> ein, dann musst du nichts mehr machen.
Formularelement: Hier musst du im Prinzip nur das < in &lt; umwandeln, beim absenden wird es wieder als < gesendet, ist also kein Problem.
 
Vielen Dank für die Antworten, da habe ich eine Menge zu Lesen.

@struppi
Wo ich mir nicht sicher bin, ist die Sache mit dem &lt;
Ein < kann ein HTML TAG sein, oder ein Operand in JavaScript, es könnte sogar beides in derselben Zeile vorkommen und dann könnte es ja auch noch sein, dass der User &lt; eintippt, was beim re-import ins Formular dann nicht mehr richtig angezeigt würde.

Ganz dummes Beispiel, der User will ein Tutorial schreiben, wo er den Gebrauch von < und &lt; erklärt.
Er würde also ins Eingabefeld tippen (mit dem entsprechenden HTML drumrum):

In HTML kann ein <b>&lt;</b> auch als <b>&amp;lt;</b> geschrieben werden,<br>ein <b>&gt;</b> entspricht <b>&amp;gt;</b>

Wenn das Formularelement das so umsetzt wie du sagst, habe ich nach 2 oder 3 updates nur noch Murks.
 
Du könntest dir auch ,zu dem was ich bereits gepostet habe, deine Eigene Sprache einrichten, so dass "<" in "#[0001]#" unbenannt wird, bzw. in etwas das -Garantiert- nicht Plaintext eingetragen wird. "&lt;" in "#[012]#" usw..
Mit deiner eigenen Sprachtabelle, kannst du das dann Intelligent handlen lassen und solltest dein erwünschtes Ergebniss erhalten.
 
@struppi
Wo ich mir nicht sicher bin, ist die Sache mit dem &lt;
Ein < kann ein HTML TAG sein, oder ein Operand in JavaScript, es könnte sogar beides in derselben Zeile vorkommen und dann könnte es ja auch noch sein, dass der User &lt; eintippt, was beim re-import ins Formular dann nicht mehr richtig angezeigt würde.
Nein, dann machst du etwas falsch. Wenn ich ein &lt; in ein Formularfeld schreibe wird es als < (bzw. dess URL Kodierten Variante) übertragen. Wie gesagt, du musst lediglich Kontextwechsel beachten, aber in dem Fall macht das bereits der Browser und PHP von alleine.
 
HTML:
<!DOCTYPE HTML>
<html>
<head></head>

<body>
<form action="" method="get"><input type="submit" value="einfuegen" >
<textarea name="t"><b>&gt;</b></textarea>
</form>
<script>
</script>
</body>
</html>
So siehst du auch was übertragen wird. Die größer und kleiner als Zeichen, werden sogar unkodiert übertragen.
 
Mehr als mysql_real_escape_string und htmlspecialchars braucht es nicht. (Zumindest nicht bei UTF-8.)

zorndyuke schrieb:
PHP: serialize - Manual

Durch diese Funktion wird dein Eintrag in ein Inhalt gewandelt, welches ohne Problem gespeichert werden kann.

Nein. Das ist falsch.

Du könntest dir auch ,zu dem was ich bereits gepostet habe, deine Eigene Sprache einrichten, so dass "<" in "#[0001]#" unbenannt wird, bzw. in etwas das -Garantiert- nicht Plaintext eingetragen wird. "&lt;" in "#[012]#" usw..
Mit deiner eigenen Sprachtabelle, kannst du das dann Intelligent handlen lassen und solltest dein erwünschtes Ergebniss erhalten.

Und sowas ist – sorry – praktisch immer Unsinn. Es existieren üblicherweise Mechanismen, die sämtliche „manuellen“ Escaping-Tricks unnötig machen.
 
Zurück
Oben