42 lines
1.9 KiB
PHP
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";
|