Apache Upload: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „Kategorie: Administration = Saubere Installation der Apache2-PHP-Umgebung = Für einen stabilen Betrieb unter Debian-basierten Systemen (Debian, Ubuntu) wird…“)
 
 
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt)
Zeile 1: Zeile 1:
Kategorie: Administration
+
Kategorie: PHP
  
= Saubere Installation der Apache2-PHP-Umgebung =
+
= Datei-Upload mit PHP unter Apache2 =
  
Für einen stabilen Betrieb unter Debian-basierten Systemen (Debian, Ubuntu) wird die Installation über die offiziellen Repositorys empfohlen. Dies stellt Sicherheitsupdates und die korrekte Integration der Dienste sicher.
+
Diese Dokumentation beschreibt die Einrichtung eines funktionalen Datei-Uploads auf einem Apache2-Webserver. Die Lösung umfasst die Systemkonfiguration, die Verzeichnisrechte und das PHP-Skript.
  
== Paketinstallation ==
+
== Systemvorbereitung ==
  
Die Installation erfolgt mit Root-Rechten über den Paketmanager apt.
+
Damit der Webserver (User: www-data) Dateien entgegennehmen und speichern kann, müssen die Verzeichnisse angelegt und die Berechtigungen korrekt gesetzt werden.
  
  apt update
+
  cd /var/www/html
  apt install apache2 php libapache2-mod-php
+
  mkdir uploads
 
+
chown -R www-data:www-data /var/www/html/
Nach der Installation sind die Dienste automatisch aktiv. Der Status kann wie folgt kontrolliert werden:
+
chmod -R 755 /var/www/html/
  
systemctl status apache2
+
== Skript-Implementierung (index.php) ==
  
== Berechtigungen und Pfade ==
+
Der folgende Quellcode wird in der Datei /var/www/html/index.php gespeichert. Das Skript verarbeitet den POST-Request, validiert den Upload-Status und verschiebt die Datei in den Zielordner.
  
Standardmäßig liegt das Dokumentenverzeichnis unter /var/www/html/. Damit PHP-Skripte Dateien schreiben dürfen (Uploads), muss der Besitzer auf den Webserver-Nutzer angepasst werden.
+
<syntaxhighlight lang="php">
 +
<?php
 +
/**
 +
  * PHP-Skript für Datei-Uploads
 +
  * Pfad: /var/www/html/index.php
 +
  */
  
  cd /var/www/html
+
  $upload_dir = 'uploads/';
mkdir uploads
+
  $status_message = "";
chown -R www-data:www-data /var/www/html/
 
  chmod -R 755 /var/www/html/
 
  
== Konfiguration prüfen ==
+
// Prüfung ob Formular gesendet wurde
 +
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file_upload'])) {
 +
   
 +
    $file = $_FILES['file_upload'];
 +
   
 +
    // Validierung des PHP-Fehlercodes
 +
    if ($file['error'] === UPLOAD_ERR_OK) {
 +
        $filename = basename($file['name']);
 +
        $target_path = $upload_dir . $filename;
  
Ob das PHP-Modul korrekt in Apache geladen wurde, lässt sich über die Modul-Liste verifizieren:
+
        // Verschieben der temporären Datei in das Zielverzeichnis
 +
        if (move_uploaded_file($file['tmp_name'], $target_path)) {
 +
            $status_message = "Datei erfolgreich hochgeladen.";
 +
        } else {
 +
            $status_message = "Fehler: Datei konnte nicht gespeichert werden.";
 +
        }
 +
    } else {
 +
        $status_message = "Upload-Fehler. Code: " . $file['error'];
 +
    }
 +
}
 +
?>
  
  apache2ctl -M | grep php
+
  <!DOCTYPE html>
 +
<html lang="de">
 +
<head>
 +
    <meta charset="UTF-8">
 +
    <title>Datei-Upload Service</title>
 +
    <style>
 +
        body { font-family: sans-serif; padding: 20px; }
 +
        .upload-box { border: 1px solid #ccc; padding: 20px; width: fit-content; border-radius: 5px; }
 +
        .msg { color: #d00; font-weight: bold; margin-bottom: 15px; }
 +
    </style>
 +
</head>
 +
<body>
 +
    <div class="upload-box">
 +
        <h2>Upload</h2>
 +
       
 +
        <?php if ($status_message): ?>
 +
            <div class="msg"><?php echo htmlspecialchars($status_message); ?></div>
 +
        <?php endif; ?>
  
Sollte das Modul nicht gelistet sein, muss es manuell aktiviert und der Dienst neu gestartet werden:
+
        <form action="index.php" method="post" enctype="multipart/form-data">
 +
            <input type="file" name="file_upload" required>
 +
            <br><br>
 +
            <input type="submit" value="Hochladen">
 +
        </form>
 +
    </div>
 +
</body>
 +
</html>
 +
</syntaxhighlight>
  
a2enmod php8.x  # Version entsprechend der Installation (z.B. php8.2)
+
== Sicherheit des Upload-Ordners ==
systemctl restart apache2
 
  
== Sicherheitsrelevante PHP-Einstellungen ==
+
Um zu verhindern, dass hochgeladene Skripte (z. B. Schadsoftware) auf dem Server ausgeführt werden können, muss die Ausführung im Ordner uploads/ deaktiviert werden.
  
Die Konfiguration der Datei-Uploads erfolgt in der Datei /etc/php/8.x/apache2/php.ini. Relevante Parameter für den stabilen Betrieb:
+
cd /var/www/html/uploads
 +
printf "php_flag engine off\nOptions -ExecCGI" > .htaccess
 +
chown www-data:www-data .htaccess
  
; Maximale Größe einer hochgeladenen Datei
+
== Fehlerbehebung ==
upload_max_filesize = 16M
 
  
; Maximale Größe der gesamten POST-Daten (muss >= upload_max_filesize sein)
+
Sollte der Upload fehlschlagen, sind die PHP-Limits in der Konfigurationsdatei (z. B. /etc/php/8.x/apache2/php.ini) zu prüfen:
post_max_size = 20M
 
  
; Maximale Zeit in Sekunden, die ein Skript laufen darf
+
* file_uploads = On
max_execution_time = 60
+
* upload_max_filesize = 10M
 +
* post_max_size = 12M
  
Nach Änderungen an der php.ini ist ein Neustart des Apache-Dienstes zwingend erforderlich.
+
Nach Änderungen an der Konfiguration muss der Dienst neu gestartet werden:
  
 
  systemctl restart apache2
 
  systemctl restart apache2
  
[[Kategorie:Debian]]
+
[[Kategorie:Programmierung]]
 
[[Kategorie:Apache]]
 
[[Kategorie:Apache]]
 
[[Kategorie:PHP]]
 
[[Kategorie:PHP]]

Aktuelle Version vom 17. März 2026, 12:05 Uhr

Kategorie: PHP

Datei-Upload mit PHP unter Apache2

Diese Dokumentation beschreibt die Einrichtung eines funktionalen Datei-Uploads auf einem Apache2-Webserver. Die Lösung umfasst die Systemkonfiguration, die Verzeichnisrechte und das PHP-Skript.

Systemvorbereitung

Damit der Webserver (User: www-data) Dateien entgegennehmen und speichern kann, müssen die Verzeichnisse angelegt und die Berechtigungen korrekt gesetzt werden.

cd /var/www/html
mkdir uploads
chown -R www-data:www-data /var/www/html/
chmod -R 755 /var/www/html/

Skript-Implementierung (index.php)

Der folgende Quellcode wird in der Datei /var/www/html/index.php gespeichert. Das Skript verarbeitet den POST-Request, validiert den Upload-Status und verschiebt die Datei in den Zielordner.

 <?php
 /**
  * PHP-Skript für Datei-Uploads
  * Pfad: /var/www/html/index.php
  */

 $upload_dir = 'uploads/';
 $status_message = "";

 // Prüfung ob Formular gesendet wurde
 if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file_upload'])) {
    
     $file = $_FILES['file_upload'];
    
     // Validierung des PHP-Fehlercodes
     if ($file['error'] === UPLOAD_ERR_OK) {
         $filename = basename($file['name']);
         $target_path = $upload_dir . $filename;

         // Verschieben der temporären Datei in das Zielverzeichnis
         if (move_uploaded_file($file['tmp_name'], $target_path)) {
             $status_message = "Datei erfolgreich hochgeladen.";
         } else {
             $status_message = "Fehler: Datei konnte nicht gespeichert werden.";
         }
     } else {
         $status_message = "Upload-Fehler. Code: " . $file['error'];
     }
 }
 ?>

 <!DOCTYPE html>
 <html lang="de">
 <head>
     <meta charset="UTF-8">
     <title>Datei-Upload Service</title>
     <style>
         body { font-family: sans-serif; padding: 20px; }
         .upload-box { border: 1px solid #ccc; padding: 20px; width: fit-content; border-radius: 5px; }
         .msg { color: #d00; font-weight: bold; margin-bottom: 15px; }
     </style>
 </head>
 <body>
     <div class="upload-box">
         <h2>Upload</h2>
        
         <?php if ($status_message): ?>
             <div class="msg"><?php echo htmlspecialchars($status_message); ?></div>
         <?php endif; ?>

         <form action="index.php" method="post" enctype="multipart/form-data">
             <input type="file" name="file_upload" required>
             <br><br>
             <input type="submit" value="Hochladen">
         </form>
     </div>
 </body>
 </html>

Sicherheit des Upload-Ordners

Um zu verhindern, dass hochgeladene Skripte (z. B. Schadsoftware) auf dem Server ausgeführt werden können, muss die Ausführung im Ordner uploads/ deaktiviert werden.

cd /var/www/html/uploads
printf "php_flag engine off\nOptions -ExecCGI" > .htaccess
chown www-data:www-data .htaccess

Fehlerbehebung

Sollte der Upload fehlschlagen, sind die PHP-Limits in der Konfigurationsdatei (z. B. /etc/php/8.x/apache2/php.ini) zu prüfen:

  • file_uploads = On
  • upload_max_filesize = 10M
  • post_max_size = 12M

Nach Änderungen an der Konfiguration muss der Dienst neu gestartet werden:

systemctl restart apache2