Harden attachment deletion and template CRUD validation
- delete_attachment.php: add realpath() path traversal check before unlink() — mirrors the defense-in-depth already in download_attachment.php; also cast ticket_id to int when building the path - manage_templates.php: add input validation to POST and PUT handlers: required field checks, max length caps (name 100, title 255, desc 64KB), allowlist validation for category/type, priority clamped to 1-5 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -80,12 +80,17 @@ try {
|
||||
ResponseHelper::forbidden('You do not have permission to delete this attachment');
|
||||
}
|
||||
|
||||
// Delete the file
|
||||
$uploadDir = $GLOBALS['config']['UPLOAD_DIR'] ?? dirname(__DIR__) . '/uploads';
|
||||
$filePath = $uploadDir . '/' . $attachment['ticket_id'] . '/' . $attachment['filename'];
|
||||
// Delete the file — use realpath() to prevent path traversal
|
||||
$uploadDir = realpath($GLOBALS['config']['UPLOAD_DIR'] ?? dirname(__DIR__) . '/uploads');
|
||||
$filePath = $uploadDir . '/' . (int)$attachment['ticket_id'] . '/' . $attachment['filename'];
|
||||
$realPath = realpath($filePath);
|
||||
|
||||
if (file_exists($filePath)) {
|
||||
if (!unlink($filePath)) {
|
||||
if ($realPath !== false) {
|
||||
// Ensure the resolved path is still inside the upload directory
|
||||
if (strncmp($realPath, $uploadDir . DIRECTORY_SEPARATOR, strlen($uploadDir) + 1) !== 0) {
|
||||
ResponseHelper::forbidden('Access denied');
|
||||
}
|
||||
if (!unlink($realPath)) {
|
||||
ResponseHelper::serverError('Failed to delete file');
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user