php - फ़ाइल डाउनलोड को सीमित करना




file download (6)

आप मूल रूप से उपयोगकर्ताओं को फाइल में सीधे यूआरएल नहीं देते हैं। सर्वर आधारित अनुमतियों का यहां कुछ नहीं है

कहें कि आपके पास /data/files/file.pdf में सहेजे जाने वाली आवश्यक फाइल (फाइलें) है (फाइल को आपके वेब रूट से बाहर रखने के लिए अच्छा अभ्यास)। आप उपयोगकर्ताओं को डाउनलोड करने के लिए एक लिंक प्रदान कर सकते हैं जो /download.php?auth=32 जैसा दिखता है

जब कोई उपयोगकर्ता लिंक पर क्लिक करता है, तो download.php जांच करेगा कि क्या सत्र / कुकी प्रमाणीकृत है और यदि डाउनलोड आईडी मान्य है (यदि आपके पास समय आधारित डाउनलोड समाप्ति है) तो डाउनलोड करें.एफ़पीपी आवश्यक स्थान को उसके स्थान से पढ़ें और भेजें यह डाउनलोड करने के लिए मजबूर करने के लिए उपयुक्त शीर्ष लेख वाले ब्राउज़र पर है

मैं वर्तमान में एक क्लाइंट के लिए वेबसाइट बना रहा हूं जो मूल रूप से विभिन्न फाइलों को बेचने में शामिल होगा I यह स्पष्ट रूप से करने के लिए एक सामान्य बात है, जो मुझे ऐसा करने के लिए एक विधि के बारे में नहीं सोचने के लिए बेवकूफ लग रहा है।

एक बार खरीदार हो जाने पर ग्राहक को डाउनलोड लिंक वाले पृष्ठ पर ले जाया जाना चाहिए, साथ ही ईमेल प्राप्त करना चाहिए जिसमें डाउनलोड लिंक और एक ईमेल शामिल है, जो उस खाते के बारे में जानकारी है जिसे उनके लिए बनाया जाएगा (वे भी सक्षम होंगे अपने खाते के नियंत्रण कक्ष से डाउनलोड करें) मैं क्या पता लगाने की कोशिश कर रहा हूं कि मैं अपने सर्वर पर फाइल के स्थान को छुपाने / अस्पष्ट कैसे कर सकता हूं ताकि एक व्यक्ति जो इसे खरीदता है, वह कहीं और फाइल में सीधे लिंक को कॉपी और पेस्ट नहीं कर सकता। यहां तक ​​कि अगर मैं फ़ाइल को http://example.com/blah/download/454643 प्रारूप के एक लिंक को डाउनलोड करने का अनुरोध करता हूं, तो एक यूआरएल जो फ़ाइल के वास्तविक स्थान से मेल नहीं खाता है, मुझे लगता है कि यह अभी भी संभव हो सकता है सर्वर पर फाइल का पता लगाने के लिए? मैं वास्तव में बहुत ज्यादा नहीं जानता कि मेरे सर्वर पर अनुमति कैसे काम करती है, इसलिए मैं पूछता हूं अग्रिम में धन्यवाद :)


खरीदार के लिए यूआरएल एक प्राधिकरण कोड हो सकता है आप उसे फिर से लॉग इन करने के लिए मिलता है, चेक करें कि कोड किस फाइल के लिए है, फिर उसके पास फ़ाइल पाइप करें यहाँ osCommerce से PHP कोड का एक उदाहरण है (मैंने लिखा है कि एक लंबे समय पहले)।

// Now send the file with header() magic
  header("Expires: Mon, 26 Nov 1962 00:00:00 GMT");
  header("Last-Modified: " . gmdate("D,d M Y H:i:s") . " GMT");
  header("Cache-Control: no-cache, must-revalidate");
  header("Pragma: no-cache");
  header("Content-Type: Application/octet-stream");
  header("Content-disposition: attachment; filename=" . $downloads['orders_products_filename']);

  if (DOWNLOAD_BY_REDIRECT == 'true') {
// This will work only on Unix/Linux hosts
    tep_unlink_temp_dir(DIR_FS_DOWNLOAD_PUBLIC);
    $tempdir = tep_random_name();
    umask(0000);
    mkdir(DIR_FS_DOWNLOAD_PUBLIC . $tempdir, 0777);
    symlink(DIR_FS_DOWNLOAD . $downloads['orders_products_filename'], DIR_FS_DOWNLOAD_PUBLIC . $tempdir . '/' . $downloads['orders_products_filename']);
    if (file_exists(DIR_FS_DOWNLOAD_PUBLIC . $tempdir . '/' . $downloads['orders_products_filename'])) {
      tep_redirect(tep_href_link(DIR_WS_DOWNLOAD_PUBLIC . $tempdir . '/' . $downloads['orders_products_filename']));
    }
  }

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

एक अतिरिक्त विकल्प यह सुनिश्चित करने के लिए होगा कि उपयोगकर्ता को आगे बढ़ने की अनुमति देने से पहले लॉग इन किया गया है जो सुरक्षा की अतिरिक्त परत प्रदान करेगा।


फाइल को अपने वेब रूट के बाहर कीजिए, लेकिन फिर सुनिश्चित करें कि जिस फ़ोल्डर में आप उन्हें स्टोर करते हैं वह "php.ini" फ़ाइल में "open_basedir" निर्देश में है, यह आपको उन्हें PHP स्क्रिप्ट से एक्सेस करने देगा। उन्हें वेब रूट के बाहर संग्रहीत करने का अर्थ है कि वे कभी भी HTTP के जरिये सीधे पहुंच नहीं पाएंगे।

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

फ़ोल्डर में एक .htacces उस स्क्रिप्ट के साथ रखें जो उस फ़ोल्डर से अनुरोधित फ़ाइल को एक चर में लिखता है। इससे ऐसा दिखाई देता है जैसे कि वे सीधे फाइल तक पहुंच रहे हैं, जबकि ऐसा नहीं है। निजी तौर पर मैं केवल इस पटकथा को इस फ़ोल्डर में ही रखूँगा, ताकि चीजें सरल रह सकें। इसलिए:

http://www.yourdomain.com/files/expensive_song.mp3

वास्तव में इसे पुनर्लेखित करता है:

http://www.yourdomain.com/files/download_file.php?filename=expensive_song.mp3

सौभाग्य।


यहां कुछ नमूने कोड दिए गए हैं जो मैंने काफी समान किए हैं:

// $mimeType is the mime type of the file
header('Content-type: ' . $mimeType);
// this will get the size of the file
// (helps for giving the size to the browser so a percent complete can be shown)
header('Content-length: ' . (string) (filesize($path)));
// disposition is either attachment (for binary files that can't be read by the browser) 
// or inline (for files that can be read by the browser
// some times you have play with this to get working so users get the download window in all browsers
// original filename is the name you want to users to see 
// (shouldn't have any special characters as you can end up with weird issues)
header('Content-Disposition: ' . $disposition . '; filename=' . $originalFilename);
// the next 2 lines try to help the browser understand that the file can't be cached
// and should be downloaded (not viewed)
header('Pragma: Public');
header('Cache-control: private');
// this will output the file to browser
readfile($path);

आप इस बात को सुनिश्चित करने के लिए किसी भी लॉगिन जाँच और लॉगिंग में जोड़ सकते हैं कि यह बहुत बार डाउनलोड नहीं किया गया है।

इसके अलावा, जैसा कि पहले कहा गया है, सुनिश्चित करें कि आप फ़ाइल को (या ऊपर) वेब सर्वर दस्तावेज़ रूट के पास डाल दें ताकि लोग पथ को समझ सकें। या आप यहां तक ​​कि डायरेक्टरी पर एक पासवर्ड भी डाल सकते हैं ताकि केवल आंतरिक लोग फाइल सूची में और आसानी से पहुंच सकें, लेकिन इससे इसकी अनुशंसा नहीं की जाएगी (केवल ऐसा करें अगर आप दस्तावेज़ रूट के बाहर कुछ डाल सकते हैं।)


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

फ़ाइल एक गैर वेब-पहुंच योग्य स्थान (यह 301 रीडायरेक्ट नहीं है) में हो सकती है और क्योंकि आपका ऐप हेडर की सेवा कर रहा है, आप पहले प्राधिकरण कर सकते हैं

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

इसके बारे में यहां काफी अच्छा ब्लॉग पोस्ट है:

http://blog.zacharyvoase.com/2009/09/08/sendfile/

Lighttpd / PHP निर्देश यहां पाये जा सकते हैं:

http://redmine.lighttpd.net/wiki/1/X-LIGHTTPD-send-file

NGINX निर्देश यहां पाये जा सकते हैं:

http://wiki.nginx.org/XSendfile

यह भी एक प्रारंभिक रिलीज अपाचे आधुनिक प्रतीत होता है जो एक ही काम करता है:

https://tn123.org/mod_xsendfile/





download