Update descargar_orden.php
This commit is contained in:
+29
-12
@@ -1,29 +1,43 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* GET /api/lab/descargar_orden.php?file=nombre_archivo.pdf
|
* GET /api/lab/descargar_orden.php?file=ruta_relativa_o_nombre
|
||||||
* Sirve archivos de órdenes médicas con el Content-Type correcto.
|
* Sirve archivos de órdenes médicas con el Content-Type correcto.
|
||||||
|
*
|
||||||
|
* El parámetro 'file' puede ser:
|
||||||
|
* - Un nombre simple: orden_20240101_abcd.pdf
|
||||||
|
* - Una ruta relativa: uploads/media/2026/03/m_XXXX.bin
|
||||||
*/
|
*/
|
||||||
require_once __DIR__ . '/_helpers.php';
|
require_once __DIR__ . '/_helpers.php';
|
||||||
requireMethod('GET');
|
requireMethod('GET');
|
||||||
|
|
||||||
$filename = $_GET['file'] ?? '';
|
$fileParam = $_GET['file'] ?? '';
|
||||||
|
|
||||||
// Validar: solo nombre de archivo sin rutas (evitar path traversal)
|
// Rechazar inmediatamente rutas con ..
|
||||||
if (!$filename || $filename !== basename($filename) || strpos($filename, '..') !== false) {
|
if (!$fileParam || strpos($fileParam, '..') !== false) {
|
||||||
http_response_code(400);
|
http_response_code(400);
|
||||||
echo json_encode(['error' => 'Archivo inválido']);
|
echo json_encode(['error' => 'Archivo inválido']);
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Solo archivos con prefijo de orden (seguridad adicional)
|
$projectRoot = realpath(__DIR__ . '/../../');
|
||||||
if (!preg_match('/^orden_[a-zA-Z0-9_]+\.[a-zA-Z0-9]+$/', $filename)) {
|
$uploadsBase = realpath($projectRoot . '/uploads');
|
||||||
http_response_code(403);
|
|
||||||
echo json_encode(['error' => 'Acceso denegado']);
|
// Resolver la ruta completa:
|
||||||
|
// - Si ya empieza con uploads/ → resolver desde raíz del proyecto
|
||||||
|
// - Si es solo un nombre de archivo → buscar en uploads/media/
|
||||||
|
if (preg_match('#^uploads/#', $fileParam)) {
|
||||||
|
$path = realpath($projectRoot . '/' . $fileParam);
|
||||||
|
} else {
|
||||||
|
// Solo nombre: solo aceptar alfanumérico + guiones/puntos, sin slashes
|
||||||
|
if (!preg_match('/^[a-zA-Z0-9_\-\.]+$/', $fileParam)) {
|
||||||
|
http_response_code(400);
|
||||||
|
echo json_encode(['error' => 'Archivo inválido']);
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
$path = realpath($projectRoot . '/uploads/media/' . $fileParam);
|
||||||
|
}
|
||||||
|
|
||||||
$path = realpath(__DIR__ . '/../../uploads/media/' . $filename);
|
$base = $uploadsBase;
|
||||||
$base = realpath(__DIR__ . '/../../uploads/media');
|
|
||||||
|
|
||||||
// Verificar que el archivo esté dentro del directorio permitido
|
// Verificar que el archivo esté dentro del directorio permitido
|
||||||
if (!$path || !$base || strpos($path, $base) !== 0 || !is_file($path)) {
|
if (!$path || !$base || strpos($path, $base) !== 0 || !is_file($path)) {
|
||||||
@@ -38,7 +52,7 @@ $mime = finfo_file($finfo, $path);
|
|||||||
finfo_close($finfo);
|
finfo_close($finfo);
|
||||||
|
|
||||||
// Mapa de extensiones como fallback
|
// Mapa de extensiones como fallback
|
||||||
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
|
$ext = strtolower(pathinfo($fileParam, PATHINFO_EXTENSION));
|
||||||
$mimeMap = [
|
$mimeMap = [
|
||||||
'pdf' => 'application/pdf',
|
'pdf' => 'application/pdf',
|
||||||
'doc' => 'application/msword',
|
'doc' => 'application/msword',
|
||||||
@@ -69,7 +83,10 @@ $mimeToExt = [
|
|||||||
'image/webp' => 'webp',
|
'image/webp' => 'webp',
|
||||||
];
|
];
|
||||||
$downloadExt = ($ext === 'bin' && isset($mimeToExt[$mime])) ? $mimeToExt[$mime] : $ext;
|
$downloadExt = ($ext === 'bin' && isset($mimeToExt[$mime])) ? $mimeToExt[$mime] : $ext;
|
||||||
$downloadName = substr($filename, 0, strrpos($filename, '.') + 1) . $downloadExt;
|
$downloadName = basename($fileParam);
|
||||||
|
if ($ext === 'bin' && isset($mimeToExt[$mime])) {
|
||||||
|
$downloadName = substr($downloadName, 0, strrpos($downloadName, '.') + 1) . $downloadExt;
|
||||||
|
}
|
||||||
|
|
||||||
header('Content-Type: ' . $mime);
|
header('Content-Type: ' . $mime);
|
||||||
header('Content-Disposition: ' . $disposition . '; filename="' . rawurlencode($downloadName) . '"');
|
header('Content-Disposition: ' . $disposition . '; filename="' . rawurlencode($downloadName) . '"');
|
||||||
|
|||||||
Reference in New Issue
Block a user