2010-02-26 18 views
19

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

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

इस काम के लिए सबसे सरल तरीका यह होगा कि ब्राउज़र ने सहेजने के लिए "फ़ाइल सहेजा गया" ईवेंट का खुलासा किया ... संवाद जो डाउनलोड पेज पर एक जावास्क्रिप्ट फ़ंक्शन पर वायर्ड किया जा सकता है (जो वापस पोस्ट कर सकता है सर्वर)। लेकिन, अंतर्ज्ञान से पता चलता है कि यदि ब्राउज़र इस कार्यक्षमता का खुलासा करता है तो सुरक्षा छेद हो सकता है, क्योंकि यह सैंडबॉक्स के बाहर कुछ हद तक छिड़कता है। मुझे यकीन नहीं है कि यह भी संभव है।

रहा foundseveralotherquestionsin this area, लेकिन विशेष रूप से इस समस्या के बारे में कुछ भी नहीं है।

कोई विचार?

संपादित करें: मुझे मूल प्रश्न में "सुरक्षा" शब्द का उपयोग नहीं करना चाहिए था, लाल बालियां ट्रिगर करने के लिए खेद है।

संपादित करें 2: मेरे "सुरक्षा" शब्दों को गुमराह किया offtopic तकनीकी सुरक्षा के मुद्दों में लोगों, लेकिन तुम दोनों मेरे संदेह है कि इस बात की पुष्टि "नहीं, यह है कि के लिए कोई ब्राउज़र समर्थन करते हैं।" मैं जवाब के साथ पहली टिप्पणीकर्ता को चिह्नित कर रहा हूं क्योंकि उसकी पहली वाक्य में जो मैं खोज रहा था। सबको शुक्रीया।

+0

क्या यह भी काम करेगा? मेरा मतलब है कि उपयोगकर्ता सर्वर पर भेजे जाने से "अपूर्ण" अनुरोध को आसानी से अवरुद्ध कर सकता है और इस तरह की एक पूरी तरह से मामूली बदलाव हैक किसी दिए गए फ़ाइल की कई प्रतियां फसल कर सकता है। –

उत्तर

9

जावास्क्रिप्ट में ऐसा कोई ब्राउज़र ईवेंट नहीं है और यहां तक ​​कि यदि आप उपयोगकर्ता के ब्राउज़र पर विश्वास नहीं कर सकते हैं तो आप सुरक्षा प्रदान कर सकते हैं।

आप प्रत्येक डाउनलोड के लिए एक अद्वितीय यूआरएल उत्पन्न करने के लिए एक GUID का उपयोग बंद कर रहे हैं। इसके बाद आप उदाहरण के लिए कर सकते हैं:

  • यूआरएल केवल एक विशेष समय अवधि
  • केवल अद्वितीय URL
  • अपने सर्वर-साइड कोड का पता लगाने दें जब साथ जुड़े एक विशिष्ट आईपी पते से स्थानान्तरण की अनुमति देने के लिए मान्य हो एक अद्वितीय यूआरएल की सामग्री पूरी तरह से स्थानांतरित कर दी गई है और फिर यूआरएल को अमान्य कर दिया गया है।

मुझे अंतिम बुलेट को स्पष्ट करने दें। मान लें कि आप जावा का उपयोग कर रहे हैं - आप in.read(buffer) और out.write(buffer) ईओएफ तक लूप में करेंगे। यदि क्लाइंट डिस्कनेक्ट हो जाता है तो आपको के दौरान IOException प्राप्त होगा और एक बाधित से सफल डाउनलोड बताने में सक्षम होंगे। अन्य प्लेटफार्मों पर, मुझे यकीन है कि कनेक्शन खो गया है या नहीं, यह बताने के तरीके हैं।

संपादित करें: आप वास्तव में one of the questions you linked to के स्वीकृत उत्तर में उल्लिखित चाल का उपयोग करके एक ब्राउज़र ईवेंट को आग लगा सकते हैं। हालांकि डाउनलोड की संख्या को सीमित करने के लिए यह एक विश्वसनीय समाधान नहीं होगा।

+0

निश्चित रूप से, अभिगम नियंत्रण आपके द्वारा वर्णित तंत्र (और अन्य) द्वारा प्रदान किया जाएगा। हालांकि, यह एक अलग सवाल है। मैं जानबूझकर हमले के चेहरे पर क्लाइंट-साइड कोड पर भरोसा करने की अविश्वसनीयता के बारे में पूरी तरह से सहमत हूं; सौभाग्य से, मेरे पर्यावरण में मैं उस समस्या को स्वीकार कर सकता हूं। मेरा प्रश्न निर्णय लेने के लिए सर्वर पर भरोसा किए बिना एक सफल डाउनलोड (बाइट्स-ऑन-द-क्लाइंट) की गारंटी के बारे में है (आपका तीसरा बुलेट)। समस्या यह है कि सर्वर विश्वास कर सकता है कि उसने फ़ाइल को स्थानांतरित कर दिया है, क्लाइंट पर सफलतापूर्वक आने वाले सभी बाइट्स के बिना। –

+0

मैं निश्चित रूप से तीसरी गोली के लिए जाऊंगा, सर्वर के लिए यह निश्चित रूप से संभव है कि कनेक्शन खो गया है या नहीं। – Martin

+1

यदि आप एक "सुरक्षा" प्रणाली स्वीकार कर सकते हैं जो केवल जानबूझकर हमला नहीं करते हैं, तो उपयोगकर्ताओं को विश्वास करने के लिए भरोसा क्यों न करें? यह कोई समझ नहीं आता है ... –

1

यह क्यों महत्वपूर्ण है कि फ़ाइल "बिल्कुल एक बार" डाउनलोड की जा सके?फ़ाइल डाउनलोड होने के बाद इसे कॉपी किया जा सकता है, तो समान उपयोगकर्ता फ़ाइल को एक से अधिक बार डाउनलोड करने के साथ वास्तव में एक सुरक्षा समस्या है?

यदि नहीं

, तो आप कुछ इस तरह कर सकता है:

  1. किसी दिए गए फ़ाइल डाउनलोड करने के लिए एक अनूठा URL जेनरेट करें। (यदि आवश्यक हो तो अस्पष्ट करने के लिए एक GUID का उपयोग करें)
  2. उपयोगकर्ता जानकारी (ब्राउज़र प्रकार, आईपी पता, आदि) और एक समय विंडो के साथ यूआरएल संबद्ध करें। केवल उस उपयोगकर्ता से और विंडो के दौरान डाउनलोड की अनुमति दें।
  3. खिड़की हस्तांतरण को नोटिस करने में विफल होने के लिए खिड़की काफी लंबी होनी चाहिए और एक या दो बार फिर से प्रयास करने के लिए, लेकिन अब नहीं।

अंतिम परिणाम है:

  1. आप यथोचित सुनिश्चित करें कि फ़ाइल केवल इच्छित प्राप्तकर्ता द्वारा डाउनलोड किया जा रहा है हो सकता है।
  2. आप सुनिश्चित कर सकते हैं कि प्राप्तकर्ता केवल छोटी विंडो के दौरान फ़ाइल डाउनलोड कर सकता है।
  3. वही उपयोगकर्ता फ़ाइल को एक से अधिक बार डाउनलोड कर सकता है, लेकिन कौन परवाह करता है? यह पहली फ़ाइल की स्थानीय प्रति बनाने से अलग नहीं है।

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

+0

यह एक बाहरी संविदात्मक आवश्यकता है: एक दिया गया उपयोगकर्ता एक बार फ़ाइल डाउनलोड कर सकता है। समस्या यह तय कर रही है कि वह घटना कब हुई है। एक बार फ़ाइल डाउनलोड होने के बाद आप कॉपी करने की आसानी के बारे में सही हैं। आप यहां तर्क को बहुत कठोर रूप से लागू नहीं कर सकते हैं, यह पूरी तरह तकनीकी समस्या नहीं है। :) userinfo/timestamp के बारे में आपका सुझाव पहले से ही कुछ अन्य उपहारों के साथ डिजाइन का हिस्सा था। –

+0

@ डेविड: बमर। किसी भी अंतर्निर्मित सुविधा (जो मुझे नहीं लगता है) की अनुपस्थिति में आप क्लाइंट पर भरोसा कर रहे हैं कि यह कहने के लिए कि डाउनलोड कब समाप्त हो गया है, और यह स्वाभाविक रूप से अविश्वसनीय है; क्लाइंट के लिए प्रॉक्सी स्थापित करने के लिए यह बहुत मुश्किल नहीं होगा जो उस पुष्टिकरण को प्रेषित करने से रोकता है। क्या आपने एक पैकेट स्निफ़र या नेटवर्क मॉनीटरिंग टूल स्थापित करने के बारे में सोचा है जो आपको बता सकता है कि क्या सभी फाइल के पैकेट भेजे गए हैं? अभी भी इसका मतलब यह नहीं है कि वे सफलतापूर्वक _received_ थे, लेकिन यह "हे ब्राउजर से अधिक विश्वसनीय है, मुझे बताएं कि जब आप कर चुके हैं" :) –

+0

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

16

यह एक अच्छा समाधान है:

http://gruffcode.com/2010/10/28/detecting-the-file-download-dialog-in-the-browser/

यह मूल रूप से की प्रतिक्रिया हेडर में एक कुकी सेट कर काम करता है डाउनलोड की गई फ़ाइल, इसलिए जावास्क्रिप्ट समय-समय पर इस कुकी के अस्तित्व की जांच कर सकता है ...

+1

यह करने के लिए कोड के लिए यहां देखें http://stackoverflow.com/a/4168965/74585 –

संबंधित मुद्दे