Ajax success funktioniert nicht

  • Moin,


    ich habe über Ajax die Funktion gemacht das man Ordner die auf einem Webserver sind löschen kann.

    Leider ist das so das der Ordner zwar gelöscht wird, aber beim Success Teil die Weiterleitung bzw der Refresh nicht funktioniert.


    Ich habe das ganze auch für Dateien gemacht. Dort funktioniert das mit Success Teil.
    (Hab das alles Kopiert und nur alles geändert für das Löschen des Ordners)


    Hier ist einmal das Script:


    Und hier einmal die deleteFolder.php


    Hat jemand eine Idee woran das liegen kann?
    Mir wurde mal gesagt, dass wenn der Status 200 eintritt, er wohl im Success Teil ist. Habe mal nachgeschaut. Also in dem Status 200 ist er.


    Wie gesagt, die Weiterleitung funktioniert nur bei dem Ordner Löschen nicht. Beim ganz normalen Datei Löschen funktioniert es.



    Würde mich über Antworten freuen :)




    Gruß

  • Zitat

    Mir wurde mal gesagt, dass wenn der Status 200 eintritt, er wohl im Success Teil ist. Habe mal nachgeschaut. Also in dem Status 200 ist er.

    Ja, Status 200 sagt, dass die Anfrage an den Server erfolgreich war. Sie sagt jedoch nichts darüber aus ob der Inhalt der Antwort sinnvoll ist oder nicht. Die Antwort kannst Du dir im Netzwerk-Tab der Entwicklerwerkzeuge ansehen und prüfen ob das drin steht was Du brauchst.


    Wichtiger als deleteFolder.php wäre der Code von userFiles.php denn dadurch wird ja die Anzeige aufgefrischt. Insofern ist bei den Antworten vom Server auch nur die auf das jQuery-load interessant.

  • Also in der userList.php ist soweit eig nur meine Tabelle mit dem Inhalt. Und halt sonst alles andere, was aber nicht direkt mit dem Refresh Zutun hat.


    Die ist in einem <div> drin.

    Code
    1. <div id="refreshData>
    2. // Hier halt nur die ganz normale Tabelle
    3. </div>

    Und wie gesagt, habe halt den selben Code auch für Dateien gemacht und dort funktioniert der Refresh ja.

    Kann den Code davon gerne auch noch einmal Posten

    Hab bei dem Script von einen Parameter mit übergeben. Hab das ganze auch mal beim Ordner Löschen hinzugefügt, aber auch keine Änderung.


    Habe mal bei den Entwicklertools bei Netzwerk geguckt, während ich eine Datei Lösche.

    Beim Datei löschen kommt bei Netzwerk noch eine Extra "Zeile" wo dann die Weiterleitung drin steht. Wenn ich den Ordner Lösche, steht dies nicht drin.


    Hier einmal wenn ich eine Datei Lösche:

    Datei Löschen.PNG


    Hier einmal wenn ich einen Ordner lösche:

    Ordner löschen.PNG

    Hab dazu noch was anderes bemerkt. (Ist mir beim Testen aufgefallen)
    Bei dem Ajax Call hole ich mir ja die ID und übergebe die dann per POST an meine deleteFolder.php

    Das ist der deleteButton

    PHP
    1. <button type="submit" class="deleteFolder btn btn-info btn-fill pull-right btn-sm" id="<?php echo $verzeichnis . $ausgabeDatei ?>" name="<?php echo $ausgabeDatei ?>">Löschen</button>

    ID ist in dem fall das Verzeichnis mit Ausgabedatei (Ordner Name).
    Also id="../../../../media/Mitarbeiter/Admin/Test

    Das wird ja dann übergeben und in den ssh2 Befehl eingefügt. Der dann rein theoretisch so aussehen müsste:

    (Habe $folder mal ersetzt)

    $output1 = ssh2_exec($connection, 'rm -r ' . escapeshellarg('/media/Mitarbeiter/../../../../media/Mitarbeiter/Admin/Test/'));


    Das macht ja irgendwie wenig sinn. Habe also mal bei dem Ajax Call anstatt der ID den Namen genommen, der ja eig nur den Ordnernamen enthält.

    Also würde per POST ja nur der Ordner Name übergeben werden, dann wäre der Befehl ja eigentlich so:

    $output1 = ssh2_exec($connection, 'rm -r ' . escapeshellarg('/media/Mitarbeiter/Test/'));

    Nur funktioniert das irgendwie nicht .... Also er löscht die Datei wirklich nur mit der "id". Also mit diesem Befehl:

    $output1 = ssh2_exec($connection, 'rm -r ' . escapeshellarg('/media/Mitarbeiter/../../../../media/Mitarbeiter/Admin/Test/'));



    Kommt mir nicht richtig vor. Oder täusche ich mich da?
    Wenn nicht, könnte es daran liegen, dass der success Teil nicht ausgeführt wird?

  • Da fällt sofort auf, dass in dem zweiten Bild nur eine Anfrage zu sehen ist. D. h. userFiles.php wird gar nicht abgerufen. Ich habe auch eine Vermutung warum: Im Success-Callback fragst Du ja auf den Inhalt der Antwort ab:

    Code
    1. $.ajax({
    2. type: "POST",
    3. url: "includes/deleteFile.php",
    4. data: {del_id:del_id},
    5. success: function(data) {
    6. if(data) {
    7. $("#refreshData").load("userFiles.php?user=" + benutzerID + " #refreshData");
    8. }
    9. }
    10. });

    Jetzt ist deleteFolder.php doch interessant, denn dort erkennt man, dass überhaupt nichts ausgegeben wird.

    Lass einfach die Abfrage weg und hole die Refresh-Daten unbedingt:

  • Das wird ja dann übergeben und in den ssh2 Befehl eingefügt. Der dann rein theoretisch so aussehen müsste:

    (Habe $folder mal ersetzt)

    $output1 = ssh2_exec($connection, 'rm -r ' . escapeshellarg('/media/Mitarbeiter/../../../../media/Mitarbeiter/Admin/Test/'));


    Das macht ja irgendwie wenig sinn.

    Jein. Der Pfad wird vom System dann entsprechend übersetzt und es wird das richtige Verzeichnis gelöscht. Aber warum übergibst du überhaupt eine vollständigen Pfad wenn du eigentlich nur einen Teil brauchst? Und warum die ganzen »../« davor wenn »/media/Mitarbeiter/Admin/Test« das gleiche bewirken würde ohne dass die Gefahr bestünde dass man sich mit den Ebenen (und damit den »../«) verzählt?


    Aber unabhängig davon, ich habe es dir schon mal in einem anderen Thread geschrieben (warum hat in diesem niemand darauf hingewiesen?!): du hast immernoch eine gravierende Sicherheitslücke in deinem Code wenn du relative Pfadangaben zulässt und den kompletten Pfad angibst. Die Gefahr dass dir jemand das komplette System platt macht besteht durch das weglassen von sudo nicht mehr, du darfst aber trotzdem nur den Pfad unterhalb von »/media/Mitarbeiter« übergeben und darfst in dem übergebenen Wert auf keinen Fall »../« zulassen, damit nicht beliebige Verzeichnisse gelöscht werden können (halt alle die der verwendete Benutzer löschen darf).


    Evtl. wäre es auch sinnvoll bei der SSH-Verbindung (bei der mir ohnehin nicht ganz klar ist wofür die notwendig ist, liegen die Daten nicht auf dem Rechner auf dem der Apache läuft?) keine Verbindungen mit Passwort zuzulassen sondern nur welche über Public Keys.

  • Die ganzen ../../../../ führen halt vom Webserver zum jeweiligen Speicher Ort. Ich hätte halt keine Idee wie ich das anders lösen könnte.


    Und das mit der SSH2 Verbindung habe ich gemacht, damit ich auch Ordner Löschen kann mit Inhalt und später beim erstellen von Ordner, ebenfalls die Rechte für die Ordner vergeben kann.


    //edit

    Habe das mit den ganzen "../../../../" mal entfernt. Hatte ja das Problem das er das nur mit dem Ordner Namen nicht gelöscht hat. Es lag daran das der falsche Pfad angegeben war. Klappt jetzt jedenfalls.