Page 2 of 3

Re: Online Backup-Script

Posted: Wed Nov 22, 2017 12:58 pm
by cmss
Nach Entfernung der color-Einträge erhalte ich (diesmal xampp 7.0.18)

Invalid or uninitialized Zip object - für die Zeilen mit
$archive->close();
$archive->addFile($it->key(), $it->getSubPathName());
$archive->close();

Es ist doch ../../Backup/Sicherung-{$date} definiert - also eine Dateiname ' Sicherung-Datum.zip' - wo muss ich was eintragen ?

Hat das nicht etwas mit $archive = new ZipArchive(); zu tun ? Bitte mal ein Beispiel.

Re: Online Backup-Script

Posted: Wed Nov 22, 2017 4:00 pm
by cmb
cmss wrote:Es ist doch ../../Backup/Sicherung-{$date} definiert - also eine Dateiname ' Sicherung-Datum.zip' - wo muss ich was eintragen ?
Wenn die CMSimple_XH Installation im Webroot installiert ist, dann bedeutet ../../ zwei Verzeichnisse weiter hoch. Das dürfte i.d.R. nicht funktionieren – manchmal kann man nicht mal ein Verzeichnis nach oben, oder aber eben nur eines. Probiere es im Zweifel mal mit einem Punkt ("./Sicherung-{$date}_$part.zip"). Das sollte die ZIP-Datei(en) im CMSimple_XH Installationsverzeichnis ablegen. Auf Dauer macht das aber keinen Sinn, da sonst die Sicherungen immer wieder mitgesichert werden.

Re: Online Backup-Script

Posted: Wed Nov 22, 2017 4:10 pm
by cmss
Mit ./Backup ( statt ../../Backup ) geht es zwar , und eine Sicherung (in mehreren Teilen) inclusive .htaccess liegt im Verzeichnis /Backup. Ich erhalte aber die Fehlermeldung
Fatal error: Maximum execution time of 30 seconds exceeded in H:\Xampp718\x718\htdocs\xh1610clea2_\cmsimple\userfuncs.php on line 79 --- Dort steht : $part++;
<IfModule mod_php5.c> php_value max_execution_time 100 </IfModule> zur htaccess hinzugefügt hilft bei Xampp manchmal(bei php7 <IfModule mod_php7.c) .

Das Verzeichnis /backup wird danach leider mitverpackt... Irgendwie müsste man die Absicherung dieses Verzeichnisses ausschliessen - evtl. über getSubPathName
(Die von mir gesuchte Klasse ZipArchive() ist im PHP definierthttps://secure.php.net/manual/de/class.ziparchive.php?)

Re: Online Backup-Script

Posted: Wed Nov 22, 2017 4:48 pm
by cmb
cmss wrote:Fatal error: Maximum execution time of 30 seconds exceeded in H:\Xampp718\x718\htdocs\xh1610clea2_\cmsimple\userfuncs.php on line 79 --- Dort steht : $part++;
<IfModule mod_php5.c> php_value max_execution_time 100 </IfModule> zur htaccess hinzugefügt hilft bei Xampp manchmal(bei php7 <IfModule mod_php7.c) .
Ggf. muss die maximale Ausführungszeit noch größer angesetzt werden.
cmss wrote:Das Verzeichnis /backup wird danach leider mitverpackt... Irgendwie müsste man die Absicherung dieses Verzeichnisses ausschliessen - evtl. über getSubPathName
Eleganter ist es, wenn eben das bzw. die Backups oberhalb des Webroot abgelegt werden. Das sorgt dann auch gleich dafür, dass niemand per HTTP(S) auf diese Datei(en) zugreifen kann. Unter XAMPP also ../Backup ö.ä. Wenn das auf dem Webspace ebenfalls möglich ist, umso besser.

Re: Online Backup-Script

Posted: Wed Nov 22, 2017 8:29 pm
by cmss
php_value max_execution_time 100 reicht schon (bei manchen Servern evtl. nicht)

Das ../Backup geht im Web nicht. Ausserdem kann man dann schlecht per Plugin herunterladen. Man könnte natürlich über einer Servervariable arbeiten , die den Pfad /.../.../htdocs/ bzw var/www beinhaltet ($bk = $_SERVER['DOCUMENT_ROOT']) und dann /Backup - was einige CMSsse schon bei der Installation fordern(statt selbst zu erstellen)

Man müsste bei Verwendung von /Backup einen Code zwischenschalten, der das Verzeichnis Backup auslässt : if SubPathName backup then..
Der Angreifer kennt doch den Namen wegen des Datums gar nicht. Ausserdem kann man über 644 die Rechte einschränken.

Man könnte alternativ im ./userfiles abspeichern. Dann kann man im Filemanager oben auf 'Dateien' klicken und herunterladen und über das x löschen. Das ist wohl am einfachsten.

Re: Online Backup-Script

Posted: Fri Nov 24, 2017 2:02 pm
by cmb
cmss wrote:Man müsste bei Verwendung von /Backup einen Code zwischenschalten, der das Verzeichnis Backup auslässt : if SubPathName backup then..
Ja, das könnte man machen.

Re: Online Backup-Script

Posted: Mon Nov 27, 2017 2:36 pm
by cmss
Hier mal ein funktionierendes Script für 'userfiles' . Aufruf mit ?backup , herunterladen im Menü über 'Datei'.

Code: Select all

  function fullBackup()
      {
          global $pth, $o;
          
          $maxsize = 200000000;
          $part = 1;
      
          $date = date('Y-m-d');
          $archive = new ZipArchive();
          $archive->open(
              "./userfiles/Sicherung-{$date}_$part.zip",
              ZipArchive::CREATE
          );
      
          $totalSize = 0;
          $it = new RecursiveIteratorIterator(
              new RecursiveDirectoryIterator($pth['folder']['base'])
          );
          $it->rewind();
          while ($it->valid()) {
              if (!$it->isDot() && $it->key() != $pth['folder']['base'] . 'backup.zip') {
                  $size = filesize($it->key());
                  if ($totalSize + $size > $maxsize) {
                      $archive->close();
                      $part++;
                      $archive->open(
                          "./userfiles/Sicherung-{$date}_$part.zip",
                          ZipArchive::CREATE
                      );
                      $totalSize = 0;
                  }
                  $archive->addFile($it->key(), $it->getSubPathName());
                  $totalSize += $size;
              }
              $it->next();
          }
      
          $archive->close();
      }
      
    if (XH_ADM && isset($_GET['backup'])) {
          fullBackup();
           $GLOBALS['o'] .= XH_message('success', 'Backup beendet');
      }
PS. Neu : Abschlussmeldung angehängt.

Re: Online Backup-Script

Posted: Sun Jul 22, 2018 1:49 pm
by cmb
cmss wrote:
Mon Nov 27, 2017 2:36 pm
Hier mal ein funktionierendes Script für 'userfiles' . Aufruf mit ?backup , herunterladen im Menü über 'Datei'.
Hier ist zu beachten, dass beliebige User das Backup herunter laden können, wenn sie den Dateinamen erraten, was natürlich äußerst problematisch ist. Will man zwecks bequemem Download die Backups unbedingt in userfiles/ speichern, dann sollte man entweder ein verschlüsseltes Archiv erstellen, was allerdings erst ab PHP 7.2.0 und libzip 1.2.0 (die vorhandenen Versionen können unter Einstellungen → Info → PHP-Info überprüft werden) unterstützt wird (siehe http://php.net/manual/de/ziparchive.set ... word-notes), oder aber dafür sorgen, dass der Dateiname nicht erraten werden kann (z.B. indem man einen kryptographischen Zufallswert einbaut).

Hier einmal eine Variante, die ein verschlüsseltes Archiv erstellet. Aufzurufen per ?backup=<password> (also z.B. ?backup=test, wobei just dieses Passwort keine gute Idee ist):

Code: Select all

<?php

function fullBackup($password)
{
    global $pth, $o;
    
    $maxsize = 200000000;
    $part = 1;

    $date = date('Y-m-d');
    $archive = new ZipArchive();
    $archive->open(
        "./userfiles/Sicherung-{$date}_$part.zip",
        ZipArchive::CREATE | ZipArchive::OVERWRITE
    );
    $archive->setPassword($password);

    $totalSize = 0;
    $it = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($pth['folder']['base']),
        RecursiveIteratorIterator::SELF_FIRST
    );
    $it->rewind();
    while ($it->valid()) {
        if (!$it->isDot() && !preg_match('/Sicherung-\d{4}-\d{2}-\d{2}_\d+.zip$/', $it->key())) {
            $size = filesize($it->key());
            if ($totalSize + $size > $maxsize) {
                $archive->close();
                $part++;
                $archive->open(
                    "./userfiles/Sicherung-{$date}_$part.zip",
                    ZipArchive::CREATE
                );
                $totalSize = 0;
            }
            if (is_dir($it->key())) {
                $archive->addEmptyDir($it->getSubPathName());
            } else {
                $archive->addFile($it->key(), $it->getSubPathName());
            }
            $archive->setEncryptionName($it->getSubPathName(), ZipArchive::EM_AES_256);
            $totalSize += $size;
        }
        $it->next();
    }

    $archive->close();
}

if (XH_ADM && !empty($_GET['backup'])) {
    fullBackup($_GET['backup']);
    $o .= XH_message('success', 'Backup beendet');
}

Re: Online Backup-Script

Posted: Sun Jul 22, 2018 4:17 pm
by Der Zwerch
Hallo,
nach langer Zeit melde ich mich auch mal wieder :-)

Eine dumme Frage, aber wenn die Backups in "userfiles"gespeichert werden, wird dann dieses Verzeichnis beim Erstellen komplett ausgeklammert?
Wäre da ein Verzeichnis, welches ausserhalb der "Homepage" liegt nicht sinniger, bzw ein direktes Verschieben auf ein lokales NAS?

Re: Online Backup-Script

Posted: Sun Jul 22, 2018 6:36 pm
by cmb
Der Zwerch wrote:
Sun Jul 22, 2018 4:17 pm
Eine dumme Frage, aber wenn die Backups in "userfiles"gespeichert werden, wird dann dieses Verzeichnis beim Erstellen komplett ausgeklammert?
userfiles/ ist im Backup enthalten, und nachdem ich am obigen Skript noch etwas nachgebessert habe, werden vorhandene Sicherungen aber nicht noch einmal gesichert.
Der Zwerch wrote:
Sun Jul 22, 2018 4:17 pm
Wäre da ein Verzeichnis, welches ausserhalb der "Homepage" liegt nicht sinniger, bzw ein direktes Verschieben auf ein lokales NAS?
Ja, das ist IMHO besser (Script siehe viewtopic.php?f=16&t=12191#p56515). Allerdings kann ich verstehen, wenn User eben eine bequeme Downloadmöglichkeit für die Sicherungen haben möchten, und da ein kürzlich erstellter Knowledge-Base-Eintrag auf cmsss Skript verweist, wollte ich die Sicherheitsproblematik aufzeigen (außerdem wollte ich verschlüsselte Zips schon länger mal ausprobieren).