Files
deskhub/DeskHub-Webseite/tests/upload_names.php
T
2026-10-24 20:14:43 +00:00

42 lines
1.9 KiB
PHP

<?php
declare(strict_types=1);
/**
* Prüft die Dateinamen-Regeln beim Upload: gefährliche Endungen bleiben gesperrt, harmlose Namen mit Punkten
* (zum Beispiel „www.example.com.pdf“) werden nicht mehr abgelehnt.
*/
putenv('DESKHUB_TESTING=1');
putenv('DESKHUB_SQLITE_PATH=:memory:');
require_once dirname(__DIR__) . '/includes/bootstrap.php';
$failures = [];
$check = function (bool $ok, string $what) use (&$failures): void {
if (!$ok) $failures[] = $what;
};
get_db();
set_setting('upload_allowed_extensions', 'png,jpg,jpeg,gif,pdf,txt,log,docx,xlsx,zip,doc,exe,php');
$tmp = tempnam(sys_get_temp_dir(), 'up');
file_put_contents($tmp, 'harmlos');
$try = fn(string $name): string => (string) (handle_ticket_upload(['name' => $name, 'type' => '', 'tmp_name' => $tmp, 'error' => UPLOAD_ERR_OK, 'size' => 7])['error'] ?? '');
// Weiter als bis zum Verschieben kommt der Test nicht (move_uploaded_file geht nur bei echten Uploads): diese Meldung heißt „alle Prüfungen bestanden“
$passed = 'Die Datei konnte nicht gespeichert werden.';
foreach (['www.example.com.pdf', 'scan.js.2024.jpg', 'Bericht v1.2.final.pdf', 'foto.cmd.png', 'IMG_2024.07.01.JPG', 'notizen.xml.txt'] as $ok) {
$check($try($ok) === $passed, 'harmloser Name wird akzeptiert: ' . $ok . ' → ' . $try($ok));
}
foreach (['shell.php', 'start.exe', 'seite.html', 'bild.svg', 'x.php.exe', 'a.sh'] as $bad) {
$check(str_contains($try($bad), 'aus Sicherheitsgründen nicht erlaubt'), 'gefährliche Endung bleibt gesperrt: ' . $bad);
}
$check(str_contains($try('shell.php'), 'shell.php'), 'die Meldung nennt die Datei');
$check(str_contains($try('.htaccess'), 'Dateiname'), '.htaccess bleibt gesperrt');
$check(str_contains($try('datei.dwg'), 'nicht erlaubt'), 'nicht freigegebene Endung bleibt abgelehnt');
@unlink($tmp);
if ($failures) {
fwrite(STDERR, "Fehlgeschlagen:\n - " . implode("\n - ", $failures) . "\n");
exit(1);
}
echo 'Upload name checks passed.' . "\n";