2016-07-21 8 views
9

का उपयोग कर मैं उनके निष्कर्षण बिना एक संग्रह, अंदर फ़ाइलों की सूची चाहते हैं।सूची फ़ाइलें और .tar अभिलेखागार पीएचपी

  • .7z (7-पिन)
  • .rar (WinRAR)
  • .tar (इसे POSIX, उदा जीएनयू टार):

    अभिलेखागार के प्रकार मैं में दिलचस्पी है।

  • ज़िप (आईएसओ मानक, उदा WinZip)

For .zip files, मैं इस लक्ष्य को हासिल करने में सक्षम है:

<?php 
    $za = new ZipArchive(); 
    $za->open('theZip.zip'); 
    for ($i = 0; $i < $za->numFiles; $i++) { 
     $stat = $za->statIndex($i); 
     print_r(basename($stat['name']) . PHP_EOL); 
    } 
?> 

हालांकि, मैं .7z फ़ाइलों के लिए भी ऐसा ही करने में कामयाब नहीं किया है। परीक्षण नहीं किया है। आरएआर और .tar, लेकिन उन्हें भी आवश्यकता होगी।

+2

यह एक बाहरी कार्यक्रम के 'सूची' उत्पादन पर कब्जा करने के लिए एक विकल्प होगा जैसे [7z] (http://linux.die.net/man/1/7z) ? (लिनक्स मानते हैं) – Arnauld

+0

@ अर्ननाल्ड: उपयोगकर्ता द्वारा फ़ाइल अपलोड करने के बाद शायद ही किया जाना है। –

+0

@ एमएम क्या यह स्वीकार करने के लिए मेरे उत्तर से कुछ याद आ रही है, या आप एक ऐसे उत्तर की प्रतीक्षा कर रहे हैं जिसमें शुद्ध PHP LZMA कार्यान्वयन शामिल है? – Leith

उत्तर

9

यह कुछ ऐसा है अप this और this और जैसे विभिन्न कारणों के लिए (से पहले आ गया है है:

यहाँ जिप बम के बारे में कुछ लिंक है the one with broken links in the answer)।

आम तौर पर इस समय प्रचलित राय एक आवरण (या तो DIY या a library का उपयोग करें) बनाने के लिए जो एक 7 जिप बाइनरी (निष्पादन) सर्वर पर सुलभ हो और exec() का उपयोग कर द्विआधारी के लिए कॉल रैप करने के लिए होने पर निर्भर करता है, एक शुद्ध PHP समाधान के बजाय।

7zip format supports a variety of compression algorithms के बाद से, मुझे लगता है कि आप शायद LZMA प्रारूप को पढ़ने/डिकंप्रेस करने का शुद्ध PHP कार्यान्वयन चाहते हैं। जबकि LZMA SDKs available for C, C++, C# and Java हैं और किसी ने PHP Extension for LZMA2 (और fork for LZMA) बना दिया है, भले ही यहां तक ​​कि थोड़ी देर के लिए on the 7-zip forums ब्याज भी है, लेकिन किसी ने इसे एक व्यापक पीईसीएल एक्सटेंशन या शुद्ध PHP के रूप में अभी तक बंद नहीं किया है।

अपनी आवश्यकताओं & प्रेरणा के आधार पर यह आप के साथ छोड़ देता है:

  • अपने सर्वर पर 7-ज़िप द्विआधारी जोड़ने के लिए, और एक आवरण पुस्तकालय का उपयोग करें, यह अपनी खुद की है या someone else's
  • स्थापित करने और उपयोग एक अनौपचारिक PECL extension
  • बहादुरी बंदरगाह LZMA एसडीके खुद के PHP के लिए (और उम्मीद है कि इसे वापस योगदान स्रोत को खोलने के लिए!)

अन्य प्रारूपों के लिए आप उदाहरण के लिए पीएचपी दस्तावेज और उपयोग के विवरणों के लिए देख सकते हैं:

चूंकि इनमें से सभी में पीईसीएल एक्सटेंशन शामिल हैं, यदि आप किसी भी तरह से अपने वेबहोस्ट द्वारा सीमित हैं और इसके लिए शुद्ध PHP समाधान की आवश्यकता है, तो बस एक और अधिक सक्षम वेबहोस्ट में स्थानांतरित करना आसान हो सकता है।

रूप this answer ने सुझाव दिया जिप बम के खिलाफ की रक्षा करने का प्रयास करने के लिए, आप संपीड़न अनुपात देख सकते हैं (पैक आकार पैक आकार से विभाजित और अमान्य के रूप में एक निश्चित सीमा से अधिक कुछ भी इलाज), हालांकि जिप बम answer to one of the linked questions के बारे में बात करेंगे इंगित करें कि यह बहु-स्तरित ज़िप बम के खिलाफ अप्रभावी हो सकता है। उन लोगों के लिए आपको यह देखने की आवश्यकता होगी कि आपके द्वारा सूचीबद्ध फाइलें संग्रहित हैं या नहीं, यह सुनिश्चित करना कि आप किसी भी तरह का रिकर्सिव निष्कर्षण नहीं कर रहे हैं और फिर उन अभिलेखागारों का इलाज करें जिनमें अभिलेखागार अमान्य हैं।

पूर्णता के लिए

, सरकारी PECL एक्सटेंशन के कुछ उपयोग के उदाहरण:

RAR:

<?php 
// open the archive file 
$archive = RarArchive::open('archive.rar'); 
// make sure it's valid 
if ($archive === false) return; 
// retrieve a list of entries in the archive 
$entries = $archive->getEntries(); 
// make sure the entry list is valid 
if ($entries === false) return; 
// example output of entry count 
echo "Found ".count($entries)." entries.\n"; 
// loop over entries 
foreach ($entries as $e) { 
    echo $e->getName()."\n"; 
} 
// close the archive file 
$archive->close(); 
?> 

टीएआर:

<?php 
// open the archive file 
try { 
    $archive = new PharData('archive.tar'); 
} 
// make sure it's valid 
catch (UnexpectedValueException $e) { 
    return; 
} 
// make sure the entry list is valid 
if ($archive->count() === 0) return; 
// example output of entry count 
echo "Found ".$archive->count()." entries.\n"; 
// loop over entries (PharData is already a list of entries in the archive) 
foreach ($archive as $entry) { 
    echo $entry."\n"; 
} 
// no need to close a PharData 
?> 

ज़िप (ओ पी के सवाल से अनुकूलित जो here से है):

<?php 
// open the archive file 
$archive = new ZipArchive; 
$valid = $archive->open('archive.zip'); 
// make sure it's valid (if not ZipArchive::open() returns various error codes) 
if ($valid !== true) return; 
// make sure the entry list is valid 
if ($archive->numFiles === 0) return; 
// example output of entry count 
echo "Found ".$archive->numFiles." entries.\n"; 
// loop over entries 
for ($i = 0; $i < $archive->numFiles; $i++) { 
    $e = $archive->statIndex($i); 
    echo $e['name']."\n"; 
} 
// close the archive file (redundant as called automatically at the end of the script) 
$archive->close(); 
?> 

जीजेड:

चूंकि gz (gnu zlib) एक संग्रह प्रारूप की बजाय संपीड़न तंत्र है, यह PHP में भिन्न है। यदि आप .gz फ़ाइल को स्वयं 0 (.tar की तरह व्यवहार करने के बजाय) gzopen() के साथ खोलते हैं, तो इसके किसी भी पाठ को पारदर्शी रूप से डिकंप्रेस किया जाता है। चूंकि यह आमतौर पर .tar.gz है, इसलिए आप इसे .tar जैसे उपरोक्त के रूप में देख सकते हैं (this answer on another question भी देखें)। या आप के साथ this answer on another question में टैर निकालें।

2

Arnuld की टिप्पणी समस्या को हल करने सबसे व्यावहारिक तरीका है के रूप में एक सुराग है। यहां तक ​​कि यदि आप सभी संभावित संग्रह प्रकारों के कार्यान्वयन को पा सकते हैं, जिन्हें आप PHP के लिए स्वीकार्य समर्थन देना चाहते हैं, तो केवल ज़िप और gzip को PHP एक्सटेंशन द्वारा समर्थित रूप से समर्थित किया जाता है। बाकी स्टैंडअलोन बाइनरी का आह्वान करने के लिए या तो मूल PHP कोड या खोल होगा। पूर्व प्रदर्शन/संसाधन बाधा का थोड़ा सा होगा जबकि बाद वाला आपके अंतर्निहित मंच पर निर्भर होगा।

(बीटीडब्लू, जब तक कि आप उपयोगकर्ताओं को पूरी तरह से अपने सर्वर तक पहुंच के साथ भरोसा नहीं करते हैं, या अपेक्षाकृत अच्छे प्रोग्रामर हैं, तो आपको अपलोड किए गए संग्रह के अंदर जो कुछ सूचीबद्ध है, उससे सामग्री का अधिक निरीक्षण करना होगा)।

एक बार जब आप यूटिलिटीज का रैगटाग वर्गीकरण एकत्र कर लेते हैं, और उचित स्तर पर कोड का ऑडिट करते हैं, तो आपको यह सुनिश्चित करने के लिए एक समान एपीआई के साथ कार्यान्वयन को सजाया जाना चाहिए कि आपका गोंद कोड स्पेगेटी में नहीं बदलता है।

तो यह मेरे थे, मैं खरोंच कि स्टैंडअलोन बाइनरी आसपास PHP के लिए ज़िप के लिए की तरह एक अंतरफलक को लागू करने से शुरू होता; PHP, आखिरकार, एक पटकथा भाषा है। आप अपलोड की गई है एक मौजूदा, मूल कोड कार्यान्वयन का उपयोग नहीं करने का कोई कारण नहीं उपयोगकर्ता को यह लागू करने की जाएगी कि फ़ाइलें, वास्तव में, सुरक्षा को ध्यान इस तरह के दृष्टिकोण के लिए एक मजबूत तर्क है।

ज़िप बम outfor देखने के लिए याद रखें।

+0

+1 महान सलाह, क्या आपको कोई विचार है कि ज़िप बम से कैसे बचें? मैंने पाया [यह] (http://stackoverflow.com/questions/13279418/how-to-detect-a-zip-bomb-using-php) लेकिन ऐसा लगता है कि –

+0

अधिकतर संग्रह प्रारूप/कोड कार्यान्वयन के लिए साधन प्रदान करते हैं एक संग्रह की सामग्री को सूचीबद्ध करना, जिसमें असम्पीडित आकार शामिल है, ये आम तौर पर एक मैनिफेस्ट पढ़कर काम करते हैं। एकमात्र सुरक्षित समाधान जिसे मैं जानता हूं फ़ाइल को एक बाधित फ़ाइल सिस्टम (उदा।एक रैम डिस्क या लूपबैक फाइल सिस्टम) अभ्यास में आप शायद प्रबंधित पूल में ऐसे कई डिवाइस लागू करेंगे। – symcbean

3

मुझे लगता है कि इस class लिंक से आपको

कोड का नमूना मदद कर सकता है

// Open an archive. 
$archive = new SevenZipArchive('docs.7z'); 

// Show number of contained files: 
print $archive->count() . " file(s) in archive\n"; 

// Show info about the first contained file: 
$entry = $archive->get(0); 
print 'First file name: ' . $entry['Name'] . "\n"; 

// Iterate over all the contained files in archive, and dump all their info: 
foreach ($archive as $entry) { 
    print_r($entry); 
} 

अद्यतन
के रूप में मेरी टिप्पणी में वादा किया था और ओ पी एक तरह से अपलोड की गई फ़ाइलों की जाँच करने के लिए कहा बम के खिलाफ, यहां एक link है जो इसका वर्णन करता है। यह एक ClamAV® ट्रोजन, वायरस, मैलवेयर & अन्य दुर्भावनापूर्ण खतरों स्रोत एंटीवायरस पता लगाने के लिए एक खुला स्रोत एंटीवायरस इंजन है।

ClamavNet साइट से मैं this जानकारी मिली

जब भी एक फ़ाइल से अधिक है ArchiveMaxCompressionRatio (clamd.conf आदमी को देखने के पेज), यह एक तर्क बम माना जाता है और Oversized.zip के रूप में चिह्नित है। अपने ArchiveMaxCompressionRatio सेटिंग को बढ़ाने का प्रयास करें।

यह कहा गया कि फाइल अपलोड करने के साथ मेरा अनुभव आम तौर पर विश्वसनीय उपयोगकर्ताओं से आता है। ज़िप बम या किसी भी अन्य खतरे, यदि मैं आप थे, तो मैं इसे पहले खोजूंगा और पता लगाऊंगा कि एक ज़िप बम/कोई अन्य खतरे कैसे काम करता है, इससे आपको अतिरिक्त कोडिंग या समाधान के माध्यम से इसे रोकने में मदद मिलेगी।

आगे आपके व्यवसाय के आकार, बजट और आपके वेब-ऐप की कितनी आलोचना के आधार पर, आपकी साइट पर एक प्रकार की रणनीति, नीति और भूमिकाएं बनाना एक अच्छा विचार है, जो आपके वेब-ऐप के उपयोग का वर्णन करता है । इसका एक हिस्सा फाइल अपलोड करने की नीति है, जैसे कि किस प्रकार की फाइलें अपलोड करने की अनुमति है, अधिकतम आकार क्या है, जो आपके अस्वीकरण को अपलोड और स्वीकार कर सकता है जहां आप इन सामानों का जिक्र करते हैं आदि। नीति को आपके द्वारा उपयोग किए जाने वाले दर्शकों के दिशानिर्देश के रूप में प्रतिबिंबित किया जाना चाहिए वेब-ऐप सेवाएं।

+2

+1, मैं अभी तक इसका परीक्षण नहीं कर रहा हूं लेकिन यह पहेली के एक टुकड़े की तरह लगता है। क्या आपको ज़िप बम से बचने के बारे में कोई जानकारी है? –

+2

+1 प्रश्न पसंद आया। टिप्पणी में आपके अन्य प्रश्न के बारे में, ज़िप बम, अपलोड के साथ मेरा अनुभव भरोसेमंद उपयोगकर्ताओं से आता है, लेकिन यदि मैं आप थे तो मैं पहले शोध करूँगा और पता लगाऊंगा कि एक ज़िपबॉम्ब कैसे काम करता है http://stackoverflow.com/questions/1459673/how-does -ऑन-मेक-ए-ज़िप-बम और http://stackoverflow.com/questions/1459080/how-can-i-protect-myself-from-a-zip-bomb और देखें कि मैं इसे कोड के माध्यम से कैसे रोक सकता हूं । –

+1

यदि मुझे ज़िप बम के बारे में अधिक जानकारी मिलती है तो मैं अपने उत्तर में जोड़ दूंगा। –

3

प्रयास करें इस

<?php 

$x = exec("7z l ./test.zip | awk '/^[0-9]{4}-/{print}'", $l); 
foreach($l as $r) 
{ 
    $e = explode(" ", $r); 
    $c = count($e)-1; 
    echo $e[$c]."\n"; 
} 
?> 
संबंधित मुद्दे