Upload via GUI (335 Dateien)

This commit is contained in:
2026-10-24 20:14:54 +00:00
parent 65003aa37b
commit 9108a34774
15 changed files with 1111 additions and 152 deletions
+12 -6
View File
@@ -47,6 +47,13 @@ function check_honeypot(): void
}
}
/** Stimmt der Formular-Token mit dem der Sitzung überein? (ohne Abbruch, für Anmeldeseiten mit freundlicher Meldung) */
function csrf_valid(): bool
{
$token = $_POST['csrf_token'] ?? '';
return $token !== '' && hash_equals($_SESSION['csrf_token'] ?? '', $token);
}
function verify_csrf(): void
{
$token = $_POST['csrf_token'] ?? '';
@@ -1070,15 +1077,14 @@ function handle_ticket_upload(array $file): array
// Endung prüfen (nur letzte Endung – verhindert doppelte wie shell.php.jpg)
$ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
// Doppelte Endungen blockieren (z.B. evil.php.jpg)
$allParts = explode('.', strtolower($file['name']));
// Auch wenn ein Admin die Liste der erlaubten Endungen erweitert: Typen, die ein Browser auf unserer Domain
// als Seite/Skript ausführen würde (Uploads sind direkt abrufbar), und ausführbare Dateien bleiben gesperrt.
$dangerousExts = ['php','php3','php4','php5','php7','php8','phtml','phar','asp','aspx','jsp','jspx','sh','py','pl','cgi','exe',
'html','htm','xhtml','shtml','svg','svgz','xml','xsl','xslt','js','mjs','htc','swf','hta','jar','vbs','bat','cmd','ps1','msi','dll','com','scr','cer','crt'];
foreach ($allParts as $part) {
if (in_array($part, $dangerousExts, true)) {
return ['error' => 'Dieser Dateityp ist aus Sicherheitsgründen nicht erlaubt.'];
}
// Gespeichert wird unter einem Zufallsnamen mit nur der letzten Endung. Namen wie „www.example.com.pdf“ oder „scan.js.2024.jpg“
// sind daher harmlos und werden nicht abgelehnt; geprüft wird die tatsächliche Endung.
if (in_array($ext, $dangerousExts, true)) {
return ['error' => 'Dieser Dateityp (.' . $ext . ') ist aus Sicherheitsgründen nicht erlaubt: ' . $file['name']];
}
if (!in_array($ext, $allowed, true)) {
return ['error' => 'Dieser Dateityp ist nicht erlaubt (' . e($ext) . '). Erlaubt: ' . implode(', ', $allowed)];
@@ -1094,7 +1100,7 @@ function handle_ticket_upload(array $file): array
$mimeType = finfo_file($finfo, $file['tmp_name']);
finfo_close($finfo);
if (in_array($mimeType, $dangerousMimes, true)) {
return ['error' => 'Dieser Dateityp ist aus Sicherheitsgründen nicht erlaubt.'];
return ['error' => 'Der Inhalt der Datei „' . $file['name'] . '“ sieht nach einem Skript aus und ist aus Sicherheitsgründen nicht erlaubt.'];
}
}
// Sicherer, zufälliger Dateiname ohne ursprüngliche Extension-Inferenz