Apache Upload: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
Zeile 3: Zeile 3:
 
= Datei-Upload mit PHP unter Apache2 =
 
= Datei-Upload mit PHP unter Apache2 =
  
Diese Anleitung beschreibt die Einrichtung eines Upload-Skripts direkt im Web-Root /var/www/html/.
+
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 ==
 
== Systemvorbereitung ==
  
Die Berechtigungen werden so gesetzt, dass der Webserver-Nutzer Dateien im Zielverzeichnis ablegen kann.
+
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
 
  cd /var/www/html
Zeile 16: Zeile 16:
 
== Skript-Implementierung (index.php) ==
 
== Skript-Implementierung (index.php) ==
  
Der folgende Code wird direkt in /var/www/html/index.php gespeichert. Er verarbeitet den Upload und verschiebt die Datei in den Ordner uploads/.
+
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
+
<syntaxhighlight lang="php">
/**
+
<?php
* PHP-Skript für Datei-Uploads
+
/**
* Standort: /var/www/html/index.php
+
  * PHP-Skript für Datei-Uploads
*/
+
  * Pfad: /var/www/html/index.php
 +
  */
  
$upload_dir = 'uploads/';
+
$upload_dir = 'uploads/';
$status_message = "";
+
$status_message = "";
  
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file_upload'])) {
+
// Prüfung ob Formular gesendet wurde
 +
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file_upload'])) {
 
      
 
      
    $file = $_FILES['file_upload'];
+
    $file = $_FILES['file_upload'];
 
      
 
      
    if ($file['error'] === UPLOAD_ERR_OK) {
+
    // Validierung des PHP-Fehlercodes
        $filename = basename($file['name']);
+
    if ($file['error'] === UPLOAD_ERR_OK) {
        $target_path = $upload_dir . $filename;
+
        $filename = basename($file['name']);
 +
        $target_path = $upload_dir . $filename;
  
        if (move_uploaded_file($file['tmp_name'], $target_path)) {
+
        // Verschieben der temporären Datei in das Zielverzeichnis
            $status_message = "Datei erfolgreich hochgeladen.";
+
        if (move_uploaded_file($file['tmp_name'], $target_path)) {
        } else {
+
            $status_message = "Datei erfolgreich hochgeladen.";
            $status_message = "Fehler: Datei konnte nicht gespeichert werden.";
+
        } else {
        }
+
            $status_message = "Fehler: Datei konnte nicht gespeichert werden.";
    } else {
+
        }
        $status_message = "Upload-Fehler. Code: " . $file['error'];
+
    } else {
    }
+
        $status_message = "Upload-Fehler. Code: " . $file['error'];
}
+
    }
?>
+
}
 +
?>
  
<!DOCTYPE html>
+
<!DOCTYPE html>
<html lang="de">
+
<html lang="de">
<head>
+
<head>
    <meta charset="UTF-8">
+
    <meta charset="UTF-8">
    <title>Upload</title>
+
    <title>Datei-Upload Service</title>
</head>
+
    <style>
<body>
+
        body { font-family: sans-serif; padding: 20px; }
    <h3>Datei-Upload</h3>
+
        .upload-box { border: 1px solid #ccc; padding: 20px; width: fit-content; border-radius: 5px; }
   
+
        .msg { color: #d00; font-weight: bold; margin-bottom: 15px; }
    <?php if ($status_message): ?>
+
    </style>
        <p><strong><?php echo $status_message; ?></strong></p>
+
</head>
    <?php endif; ?>
+
<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">
+
        <form action="index.php" method="post" enctype="multipart/form-data">
        <input type="file" name="file_upload" required>
+
            <input type="file" name="file_upload" required>
        <input type="submit" value="Hochladen">
+
            <br><br>
    </form>
+
            <input type="submit" value="Hochladen">
</body>
+
        </form>
</html>
+
    </div>
 +
</body>
 +
</html>
 +
</syntaxhighlight>
  
== Sicherheitseinstellungen ==
+
== Sicherheit des Upload-Ordners ==
  
Um die Ausführung von Skripten im Upload-Verzeichnis zu verhindern, wird dort eine .htaccess-Datei erstellt.
+
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
 
  cd /var/www/html/uploads
 
  printf "php_flag engine off\nOptions -ExecCGI" > .htaccess
 
  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
  
 
[[Kategorie:Programmierung]]
 
[[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