Online Backup-Script

Ein CMSimple Support Forum für deutsch sprechende Nutzer und Entwickler
cmss
Posts: 244
Joined: Mon Jan 02, 2017 6:15 pm

Re: Online Backup-Script

Post by cmss » Wed Nov 22, 2017 12:58 pm

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.

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: Online Backup-Script

Post by cmb » Wed Nov 22, 2017 4:00 pm

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.
Christoph M. Becker – Plugins for CMSimple_XH

cmss
Posts: 244
Joined: Mon Jan 02, 2017 6:15 pm

Re: Online Backup-Script

Post by cmss » Wed Nov 22, 2017 4:10 pm

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?)

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: Online Backup-Script

Post by cmb » Wed Nov 22, 2017 4:48 pm

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.
Christoph M. Becker – Plugins for CMSimple_XH

cmss
Posts: 244
Joined: Mon Jan 02, 2017 6:15 pm

Re: Online Backup-Script

Post by cmss » Wed Nov 22, 2017 8:29 pm

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.

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: Online Backup-Script

Post by cmb » Fri Nov 24, 2017 2:02 pm

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.
Christoph M. Becker – Plugins for CMSimple_XH

cmss
Posts: 244
Joined: Mon Jan 02, 2017 6:15 pm

Re: Online Backup-Script

Post by cmss » Mon Nov 27, 2017 2:36 pm

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.

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: Online Backup-Script

Post by cmb » Sun Jul 22, 2018 1:49 pm

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');
}
Last edited by cmb on Tue Jul 24, 2018 11:47 am, edited 2 times in total.
Reason: Fix script to include also empty folders
Christoph M. Becker – Plugins for CMSimple_XH

Der Zwerch
Posts: 608
Joined: Sat Jul 28, 2012 11:38 am
Location: Perle der Grafschaft > 127.0.0.1

Re: Online Backup-Script

Post by Der Zwerch » Sun Jul 22, 2018 4:17 pm

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?

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: Online Backup-Script

Post by cmb » Sun Jul 22, 2018 6:36 pm

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).
Christoph M. Becker – Plugins for CMSimple_XH

Post Reply