Online Edit

V

Vankhon

Hey Ho,
Ich habe da ein kleines Problem ;)

Ich möchte es möglich machen, durch ein einfaches Script, das meine "Kunden" ein Teil ihres Scriptes halt Online editieren können. Dazu habe ich folgendes Script:

PHP:
<?php
include ("checkuser.php");
if (empty($gesendet)) {
    ob_start();
    readfile($_GET['file']);
    $file=ob_get_contents();
    ob_end_clean();

    echo '<html>
    <head>
    <title>'.$_GET['file'].' editieren</title>
    </head>
    <body>
    <form action="'.$_SERVER['SCRIPT_NAME'].'" method="post">
    <input type="hidden" name="filename" value="'.$_GET['file'].'" />
    <input type="hidden" name="gesendet" value="jo" />
    <textarea name="datei" cols="50" rows="10">'.htmlspecialchars($file).'
    </textarea>

    <input type="submit" name="ok" value="speichern">
    </form>
    </body>
    </html>';
} else {
    $write=fopen($_POST['filename'], "w");
    if(fwrite ($write, $_POST['datei'])) {
        echo "Änderung erfolgreich";
    } else {
        echo "Schreiben fehlgeschlagen. Sind die Rechte richtig gesetzt?";
    }
    fclose($write);
}
?>

Das checkuser.php dientdazu das man eingeloggt sein muss.
Nun aber folgendes, aufgerufen wird die Datei die zu editieren ist halt mit
http://www.domain.de/beispiel/edit?file=filename.php

Wenn ich dann allerdings auf speichern klicke wird wieder nur die normale
Edit Datei angezeigt und auch keine ändernung gemacht. Das gesamte Verzeichniss
hat 777 Rechte.

Grüße
 
Moin,

if (empty($gesendet)) {

Sollte bei dir register_globals auf off stehen, muss dies
Code:
if (empty($_POST['gesendet'])) {
...heissen, sonst wird die Variable immer nicht gefunden.

Sollte register_globals On sein, kann es auch nichts schaden, das so zu Schreiben.
 
Hey Danke für deine Antwort. Das hat schonmal geholfen, mehr oder weniger :D

Denn nun zerhaut es mir teilweise die PHP Codes wenn ich sie editiere.

Aus
include ("checkuser.php");

Wird:
include (\"checkuser.php\");

Aus:
BenutzerId: <?php echo $_SESSION["user_id"]; ?><br>

Wird:
BenutzerId: <?php echo $_SESSION[\"user_id\"]; ?><br>

Warum auch immer weden / gesetzt.
 
Du hast bei dir anscheinend die PHP-Option magic_quotes_gpc aktiviert.

In dem Fall werden in Daten, welche vom Benutzer kommen(GET,POST,COOKIE) bestimmte Zeichen "gequotet".
In diesem Fall müsstest du die Backslashes mit stripslashes() entfernen.

Mache dies aber nicht pauschal, prüfe vorher wirklich, ob magic_quotes_gpc aktiviert ist, ca so:
Code:
$var=(get_magic_quotes_gpc())
        ? stripslashes($_POST['var'])
        : $_POST['var']

Warum?
Momentan weisst du, dass magic_quotes_gpc On ist....dies muss aber nicht immer so bleiben.
Spätestens wenn der Server auf PHP6 geupdatet wird, müsstest du ohne diese Prüfung dein Skript umschreiben, weil es dann magic_quotes_gpc nicht mehr geben wird.
 
Oh nein tut mir leid.
Das Problem ist doch erst halb beoben. Ich war ein wneig voreilig.
Denn nun ist das Problem, das man in dem Editier Feld zwar die \ nicht mehr
sehen kann, sie aber dennoch gesetzt werden. Was ist falsch?

<?php
if (empty($_POST['gesendet'])) {
ob_start();
readfile($_GET['file']);
$file=ob_get_contents();
ob_end_clean();
if (get_magic_quotes_gpc())$file=stripslashes($file);

echo '<html>
<head>
<title>'.$_GET['file'].' editieren</title>
</head>
<body>
<form action="'.$_SERVER['SCRIPT_NAME'].'" method="post">
<input type="hidden" name="filename" value="'.$_GET['file'].'" />
<input type="hidden" name="gesendet" value="jo" />
<textarea name="datei" cols="75" rows="20">'.htmlspecialchars($file).'
</textarea>

<input type="submit" name="ok" value="speichern">
</form>
</body>
</html>';
} else {
$write=fopen($_POST['filename'], "w");
if(fwrite ($write, $_POST['datei'])) {
echo "Änderung erfolgreich";
} else {
echo "Schreiben fehlgeschlagen. Sind die Rechte richtig gesetzt?";
}
fclose($write);
}
?>

Bitte doch nochmal um letze Hilfe :)
 
Mh okay, verstehe ich, aber ich verstehe die Syntax dann nicht so ganz, jedes mal verhaue ich mir den Code.
Köntest du mir da ein wenig weiter helfen ? :)


Jetzt ist mir auch noch eine weitere Frage eingefallen.
Mit diesem Script kann ich halt die Files ändern, aber das soll so sein
das nur die Files änderbar sind, die im selben verzeichniss liegen. Denn anderenfalls habe
ich eben bemerkt ist es möglich im Moment auf den gesamten FTP zuzugreifen. Und wenn ich die
Rechte der anderen Datein das "Read" rausnehmne kommt Acces Denied.

Grüße
 
Sorry, das stripslashes() darfst/musst du nur verwenden, wenn du die Formulardaten verarbeitest, also nicht beim direkten Auslesen der Datei(hatte nicht genau betrachtet, ich bin davon ausgegangen, dass du die Formulardaten auch direkt wieder im <textarea> ausgibst).

Was die Rechte betrifft:
Du solltest da eingangs keiner Datei/Verzeichnis sonderliche Rechte einräumen.

Für das Verzeichnis sollte 0755 ausreichen, für die zu ändernden Dateien setze die Rechte vor dem Schreiben per [phpf]chmod[/phpf] auf 0777 und danach wieder zurück auf den Ausgangswert. (Sollte bei dir der safe_mode On sein, und du die zu ändernden Dateien per FTP erstellt/gespeichert haben, verwende statt [phpf]chmod[/phpf] die Funktion [phpf]ftp_site[/phpf] zum Ändern der Rechte)

Generell solltest du skriptseitig filtern, welche Datei änderbar sein darf.
Ob du das bspw. über einen Array machst, in dem du die Namen der änderbaren Dateien ablegst, oder den Pfad/Dateinamen nach einem bestimmten Muster untersuchst, ist dir überlassen und hängt vom Einzelfall ab.
 
Hey Danke für deine Antwort.
Ich habe mir mein Script nochal gross abgewandelt
ICh habe jetzt einfach nur auch in dem Script angeben, welche Datei
geändert werden kann und einfach per HTACCESS gescützt.

Ich danke für eure Hilfe :)
 
Zurück