HTML Datei zum bearbeiten in Textarea laden
Raffi
- php
0 Christian Seiler0 Raffi0 Christian Seiler0 Raffi
Hallo Leute ich möchte eine Datei in eine TExtarea laden um Änderungen am HTML Quelltext online vorzunehmen.
Habe das so versucht:
<?
$file = $edit_file;
readfile($file);
?>
Geht aber irgendwie nicht ganz - Da einzelne Teile des HTML Files ausserhalb der Textarea ausgeführ werden (z.B. Background Color).
Benutze ich den falschen Befehl?
Gruss
Raffi
Hallo Raffi,
Benutze ich den falschen Befehl?
Ja. Du musst HTML-Sonderzeichen maskieren:
<?php
$inhalt = implode ('', file ($edit_file));
echo htmlspecialchars ($inhalt);
?>
Sonst wird HTML-Quelltext direkt in die Seite geschrieben.
Viele Grüße,
Christian
Und wie mach ich das dann beim zurückschreiben?
Habe bei php.net keinen entsprechenden "Gegenbefehl" zu htmlspecialchars gefunden.
gruss
raffi
Hallo Raffi,
Und wie mach ich das dann beim zurückschreiben?
Wenn die Daten per POST kommen, sind diese nicht mehr kodiert. Denn die HTML-Kodierung wird vom Browser beim Auslesen der Datei automatisch dekodiert.
Viele Grüße,
Christian
Das heisst wenn ich das File per Post an einen Save-Script übergebe ist alles ok?
Mit welchem Befehl würdest Du saven? Die ganze Datei (Inhalt) soll ja ersetzt werden.
Danke und Gruss
Raffi
Hallo Raffi,
Das heisst wenn ich das File per Post an einen Save-Script übergebe ist alles ok?
Ja.
Mit welchem Befehl würdest Du saven? Die ganze Datei (Inhalt) soll ja ersetzt werden.
fopen -> fwrite -> fclose
Viele Grüße,
Christian
Hallo Christian
Herzlichen Dank für Deine Hilfe. Das funktioniert soweit...das Einzige Problem ist, dass der Inhalt am Ende angehängt wird. Wie kann ich zuerst den ganzen Inhalt des Files löschen?
Gruss
Raffi
Hallo Raffi,
das Einzige Problem ist, dass der Inhalt am Ende angehängt wird. Wie kann ich zuerst den ganzen Inhalt des Files löschen?
?? Wie öffnest Du denn Deine Datei?
Wenn dort
$handle = fopen ($dateiname, 'w');
steht, (mit den entsprechend anderen Variablennamen) dann wird automatisch der komplette Inhalt überschrieben. Wenn Du natürlich statt 'w' ein 'a' dort stehen haben solltest, dann brauchst Du Dich nicht zu wundern. Das ganze steht aber in der Dokumentation zu fopen.
Viele Grüße,
Christian
Das mit dem Löschen des Inhalts hab ich gerade gefunden....aber irgendwie speichert der einen völligen mist:
<body>
<form name="form1" method="post" action="">
<textarea name="textarea" cols="200" rows="20">
Test bla bla bla
</textarea>
</form>
</body>
</html>
Muss ich das noch irgendwie filtern damit er keine \ vor die " macht?
Hier mein Script:
<?php
$filename = $edit_file;
$somecontent = $htmledit;
// Sichergehen, dass die Datei existiert und beschreibbar ist
$filename = substr($edit_file, 2);
$filename = "/home/focusnet/public_html".$filename;
print $filename;
print '<br>';
if (is_writable($filename)) {
// Wir öffnen $filename im "Anhänge" - Modus.
// Der Dateizeiger befindet sich am Ende der Datei, und
// dort wird $somecontent später mit fwrite() geschrieben.
if (!$handle = fopen($filename, "w+")) {
print "Kann die Datei $filename nicht öffnen";
exit;
}
// Schreibe $somecontent in die geöffnete Datei.
if (!fwrite($handle, $somecontent)) {
print "Kann in die Datei $filename nicht schreiben";
exit;
}
print "Fertig, in Datei $filename wurde geschrieben";
fclose($handle);
} else {
print "Die Datei $filename ist nicht schreibbar";
}
?>
Gruss
Raffi
Hallo Raffi,
Muss ich das noch irgendwie filtern damit er keine \ vor die " macht?
*argh* (das gilt jetzt nicht Dir sondern PHP) Es gibt eine Einstellung in der php.ini, die magic_quotes_gpc heißt. Diese Einstellung bewirkt, dass vor ", \ und ' automatisch \ gestellt wird, damit Variablen sicher in Datenbankabfragen verwendet werden können. Die Tatsache, dass die wenigsten Variablen auch in eine Datenbank kommen, ist anscheinend nicht berücksichtigt worden.
Ich verwende am Anfang meiner Scripte immer folgenden Code, um diese Ärgernis zu umgehen:
// needed for disabling magic quotes gpc which is sometimes activated
function recursive_stripslashes ($value) {
if (is_array ($value)) {
return array_map ('recursive_stripslashes', $value);
} else {
return stripslashes ($value);
}
}
// make sure that we have got magic_quotes_gpc disabled
// (and beg that this script is not subject of a DoS-attac)
if (get_magic_quotes_gpc ()) {
$_GET = recursive_stripslashes ($_GET);
$_POST = recursive_stripslashes ($_POST);
$_COOKIE = recursive_stripslashes ($_COOKIE);
}
// deactivate other magic quote stuff
set_magic_quotes_runtime (0);
Du musst dann halt aufpassen, wenn Du Sachen in einer Datenbankabfrage verwendest, dann musst Du mit mysql_escape_string für MySQL u.ä. für andere Datenbanken diese Escape-Zeichen wieder hinzufügen, sonst hast Du eine Sicherheitslücke.
Viele Grüße,
Christian
Hallo Christian
Geht leider immernoch nicht:
<?php
// needed for disabling magic quotes gpc which is sometimes activated
function recursive_stripslashes ($value) {
if (is_array ($value)) {
return array_map ('recursive_stripslashes', $value);
} else {
return stripslashes ($value);
}
}
// make sure that we have got magic_quotes_gpc disabled
// (and beg that this script is not subject of a DoS-attac)
if (get_magic_quotes_gpc ()) {
$_GET = recursive_stripslashes ($_GET);
$_POST = recursive_stripslashes ($_POST);
$_COOKIE = recursive_stripslashes ($_COOKIE);
}
// deactivate other magic quote stuff
set_magic_quotes_runtime (0);
$filename = $edit_file;
$somecontent = $htmledit;
// Sichergehen, dass die Datei existiert und beschreibbar ist
$filename = substr($edit_file, 2);
$filename = "/home/focusnet/public_html".$filename;
print $filename;
print '<br>';
if (is_writable($filename)) {
// Wir öffnen $filename im "Anhänge" - Modus.
// Der Dateizeiger befindet sich am Ende der Datei, und
// dort wird $somecontent später mit fwrite() geschrieben.
if (!$handle = fopen($filename, "w")) {
print "Kann die Datei $filename nicht öffnen";
exit;
}
// Schreibe $somecontent in die geöffnete Datei.
if (!fwrite($handle, $somecontent)) {
print "Kann in die Datei $filename nicht schreiben";
exit;
}
print "Fertig, in Datei $filename wurde geschrieben";
fclose($handle);
} else {
print "Die Datei $filename ist nicht schreibbar";
}
?>
Habe ich das falsch eingebunden?
Gruss
Raffi
Hallo Raffi,
Habe ich das falsch eingebunden?
Nein. Allerdings gehe ich davon aus, dass niemand mehr register_globals verwendet, sondern stattdessen $_GET, $POST und $_COOKIE verwendet. Du verwendest aber immernoch register_globals. Wenn es Dir nur um diese eine Script geht, dann kannst Du mit einem
if (get_magic_quotes_gpc ()) {
$somecontent = stripslashes ($somecomment);
}
anstelle meines anderen Codes das Problem lösen.
Viele Grüße,
Christian
Muss ich das noch irgendwie filtern damit er keine \ vor die " macht?
*argh* (das gilt jetzt nicht Dir sondern PHP) Es gibt eine Einstellung in der php.ini, die magic_quotes_gpc heißt. Diese Einstellung bewirkt, dass vor ", \ und ' automatisch \ gestellt wird, damit Variablen sicher in Datenbankabfragen verwendet werden können. Die Tatsache, dass die wenigsten Variablen auch in eine Datenbank kommen, ist anscheinend nicht berücksichtigt worden.
es ist m.e. vielmehr die tatsache berücksichtigt worden, dass viele DAUs einfach alles ungeprüft in ihre (my)sql-query reinschreiben, was vom browser übergeben wird, und danach jammern, wenn jemand ihre tabellen gedropped hat...
Hallo wahsaga,
es ist m.e. vielmehr die tatsache berücksichtigt worden, dass viele DAUs einfach alles ungeprüft in ihre (my)sql-query reinschreiben, was vom browser übergeben wird, und danach jammern, wenn jemand ihre tabellen gedropped hat...
Genau deswegen würde ich diese Einstellung NICHT aktivieren. Denn sonst werden die DAUs immer DAUs bleiben, wenn man ihnen alles sicherheitskritisches abnimmt. Wir sehen es ja bei den GUI-Anwendungen - wenn auf die falsche Weise versucht wird, zu vereinfachen, dann setzen sich Irrgläuben in den Köpfen fest, die nicht so leicht wieder wegzubekommen sind. Und diese führen dann hinterher zu größeren Problemen.
Meiner Ansicht nach wäre es viel sinnvoller, wenn man die Tutorials für Anfänger so schreibt, dass genau dieser Sachverhalt auch erklärt wird.
Viele Grüße,
Christian