Big Binary Files Upload (PostgreSQL)
Objetos grandes de PostgreSQL
PostgreSQL ofrece una estructura conocida como objetos grandes, accesible a través de la tabla pg_largeobject
, diseñada para almacenar tipos de datos grandes, como imágenes o documentos PDF. Este enfoque es ventajoso sobre la función COPY TO
ya que permite la exportación de datos de vuelta al sistema de archivos, asegurando que se mantenga una réplica exacta del archivo original.
Para almacenar un archivo completo dentro de esta tabla, se debe crear un objeto en la tabla pg_largeobject
(identificado por un LOID), seguido de la inserción de fragmentos de datos, cada uno de 2KB de tamaño, en este objeto. Es crucial que estos fragmentos sean exactamente de 2KB de tamaño (con la posible excepción del último fragmento) para asegurar que la función de exportación funcione correctamente.
Para dividir tus datos binarios en fragmentos de 2KB, se pueden ejecutar los siguientes comandos:
Para codificar cada archivo en Base64 o Hex, se pueden usar los siguientes comandos:
Importante: Al automatizar este proceso, asegúrese de enviar fragmentos de 2KB de bytes en texto claro. Los archivos codificados en hex requerirán 4KB de datos por fragmento debido a la duplicación en tamaño, mientras que los archivos codificados en Base64 siguen la fórmula ceil(n / 3) * 4
.
El contenido de los objetos grandes se puede ver con fines de depuración utilizando:
Usando lo_creat
y Base64
Para almacenar datos binarios, primero se crea un LOID:
En situaciones que requieren un control preciso, como la explotación de una Inyección SQL Ciega, lo_create
es preferido para especificar un LOID fijo.
Los fragmentos de datos se pueden insertar de la siguiente manera:
Para exportar y potencialmente eliminar el objeto grande después de su uso:
Usando lo_import
y Hex
La función lo_import
se puede utilizar para crear y especificar un LOID para un objeto grande:
Después de la creación del objeto, los datos se insertan por página, asegurando que cada fragmento no exceda 2KB:
Para completar el proceso, los datos se exportan y el objeto grande se elimina:
Limitaciones
Se observa que los objetos grandes pueden tener ACLs (Listas de Control de Acceso), lo que puede restringir el acceso incluso a los objetos creados por tu usuario. Sin embargo, los objetos más antiguos con ACLs permisivas pueden seguir siendo accesibles para la exfiltración de contenido.
Last updated