2012-06-27 15 views
5

मैं वास्तव में read() ऑपरेशन से डरता हूं क्योंकि यह स्मृति का उपयोग करता है। उदाहरण के लिए, कोई भी 1 जीबी फ़ाइल अपलोड करके मेरे सर्वर को डीडीओएस कर सकता है, सही?बोतल में सुरक्षित रूप से अपलोड की गई फ़ाइल का आकार कैसे जांचें?

name = request.forms.get('name') 
data = request.files.get('data') 
if name and data.file: 
    raw = data.file.read() # This is dangerous for big files 
    filename = data.filename 
    return "Hello %s! You uploaded %s (%d bytes)." % (name, filename, len(raw)) 

क्या अपलोड किया गया फ़ाइल आकार प्राप्त करने के लिए कोई सुरक्षित समाधान है? एक अनुमान फाइल सिस्टम से फाइल आकार प्राप्त करना होगा; request.files.get('data') शायद कहीं temp फ़ाइल में संग्रहीत है?

+0

यदि आप apache जैसे कुछ के तहत wsgi के माध्यम से बोतल चलाते हैं, तो अपाचे अपलोड आकार को सीमित कर सकता है। – jordanm

+1

बोतल स्टोर अनुरोध। किसी और अस्थायी फ़ाइलों में सभी अपलोड की गई फ़ाइलें (या बाइटियो बफर पर्याप्त होने पर) जैसे ही आप उनमें से किसी तक पहुंचते हैं। यदि सर्वर सभी काम करता है, तो आप अपलोड आकार को प्रतिबंधित करना चाहते हैं, request.content_length की जांच करें। यदि आप बस यह सुनिश्चित करना चाहते हैं कि सब कुछ स्मृति में फिट बैठता है, तो अपलोड किए गए फ़ाइलों को छोटे उत्तरों में पढ़ें/कॉपी करें जैसा कि उनके उत्तर में pyfunc द्वारा वर्णित है। – defnull

उत्तर

2

क्या आप जांच सकते हैं कि आप एक समय में डेटा के हिस्सों को पढ़ सकते हैं या नहीं।

अगर यह संभव है:

name = request.forms.get('name') 
data = request.files.get('data') 
raw = "" 
if name and data.file: 
    while True: 
     datachunk = data.file.read(1024) 
     if not datachunk: 
      break 
     raw = raw + datachunk 

    filename = data.filename 
    return "Hello %s! You uploaded %s (%d bytes)." % (name, filename, len(raw)) 

यदि यह संभव है, तो आप भी कैसे एक बड़े फ़ाइल आप पढ़ना चाहते हैं पर एक ट्रैकिंग प्रणाली को जोड़ने में सक्षम हैं और इस आपरेशन को निरस्त करता है, तो पार कर किया जाना चाहिए।

यह कभी भी डीडीओएस के संभावित तरीकों में से एक को हल करता है।

+0

क्या आप अपना कोड ठीक कर सकते हैं? आकार = हटा दिया जाना चाहिए। यह TypeError उत्पन्न करता है: पढ़ें() कोई कीवर्ड तर्क नहीं लेता है, अगर केवल 1024 निर्दिष्ट यह – holms

+0

@holms काम करता है: सुधार के लिए धन्यवाद। मैंने माना कि पास करने के लिए एक नामित तर्क होगा। कोड को देखने का प्रयास करें, इसे कुछ और नाम दिया जा सकता है। – pyfunc

-3

यह एक दिलचस्प सवाल है। आम तौर पर आप या तो फ़ाइल ऑब्जेक्ट पर आंकड़े प्राप्त करेंगे या आकार प्राप्त करने के लिए os.path का उपयोग करेंगे। This question पहले कवर किया गया है।

लेकिन आप इसे अपलोड करने में समय बिताने से पहले सर्वर से क्लाइंट साइड फ़ाइल आकार को कैसे बताने के बारे में पूछ रहे हैं। मुझे लगता है कि ऐसा करने का सबसे अच्छा तरीका with JavaScript है। This question आप अपने बोटलपी एप्लिकेशन में कुछ जावास्क्रिप्ट कोड कैसे प्राप्त करें इस पर शुरू कर सकते हैं।

अपने इनपुट को सत्यापित करने के लिए जावास्क्रिप्ट का उपयोग करें ताकि आप अपने सर्वर कोड में यह मान सकें कि फ़ाइल आपकी सीमाओं के भीतर है। एक बार जब आप इसे समझ लेंगे, तो मेरा सुझाव है कि आप बोटलपी लोगों से सीधे इसके लिए बेसरक्वेट.फाइल समर्थन पर समर्थन जोड़ने के लिए कहें।

+0

'लेकिन आप इस बारे में पूछ रहे हैं कि सर्वर से क्लाइंट साइड फ़ाइल आकार को कैसे बताना है, इससे पहले कि हम इसे अपलोड करने में समय व्यतीत करें। '<- वास्तव में? मुझे यह लिखना याद नहीं है। आप उस फ़ील्ड को उस आकार में बदल सकते हैं जो सत्यापन पास करता है, और 1 जीबी फ़ाइल पास करता है तो क्या ..? – holms

+0

ओह, शायद मैं गलत समझा। मैंने सोचा था कि आप डीडीओएस को खुद को उजागर किए बिना फ़ाइल का आकार प्राप्त करना चाहते थे ... शायद मैं वहां कुछ ग्रहण कर रहा था। ऐसा करने का एकमात्र तरीका फ़ाइल अपलोड को वास्तव में अपलोड करने से पहले जांचना है, अन्यथा बिंदु क्या है। बड़ी फ़ाइल पहले ही अपलोड हो चुकी है, इसलिए आपने डीडीओएस को नहीं रोका। दूसरा विकल्प pyfunc की तरह है, लेकिन आप कुछ सीमा पर तोड़ने के लिए एक चेक जोड़ते हैं। आखिरी विकल्प यह है कि आप सुझाव देते हैं और temp फ़ाइल पर आंकड़े प्राप्त करते हैं। – ChipJust

+0

@holms "आप उस फ़ील्ड को उस आकार में बदल सकते हैं जो सत्यापन पास करता है, और 1 जीबी फ़ाइल पास करता है तो क्या ..?" मुझे तुम्हारा मुद्दा नहीं मिला। आप क्लाइंट साइड सत्यापन कोड को नियंत्रित करते हैं, ताकि आप जो भी आकार चाहते हैं उसे अनुमति दे सकें ... – ChipJust

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