2008-10-20 16 views
29

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

तो, इससे बचने के तरीके क्या हैं? मैं कुछ लोगों के बारे में सोच सकता हूं - मैंने अतीत में कुछ उपयोग किए हैं - लेकिन मैं यह देखना चाहता हूं कि इस से निपटने के तरीके पर कोई "सर्वोत्तम अभ्यास" है या नहीं। मैं PHP का उपयोग कर रहा हूं लेकिन मुझे अवधारणाओं में अधिक दिलचस्पी है।

संपादित करें: मैं टोकन तकनीक के बारे में पता कर रहा हूँ और यह क्या मैं अतीत में प्रयोग किया गया है, इस सवाल का कम या ज्यादा अगर मेरे दृष्टिकोण क्या तुम ठीक प्रोग्रामर के बाकी का उपयोग के साथ कतार में है देखने के लिए है।

+0

आम सहमति निश्चित रूप से प्रतीत होती है कि हममें से बाकी लोग ठीक प्रोग्रामर (और मुझे!) का उपयोग करते हैं :-) यह एक शक्तिशाली और मजबूत तकनीक है, जिसमें अधिकांश अनुप्रयोगों में सुरक्षा लाभ होते हैं। –

+0

मेरे लिए अच्छा लगता है। :) –

+0

यह How do you prevent a user from posting data multiple times on a website प्रश्न के समान है। – Rontologist

उत्तर

27

अनुरोध के साथ एक टोकन जमा करने और प्रयुक्त टोकन की एक सूची रखने का एक वास्तव में प्रभावी तरीका है। यदि टोकन मान्य नहीं है, या टोकन पहले ही संसाधित हो चुका है, तो निरस्त करें।

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

+1

आप बैक बटन दबाकर उपयोगकर्ता को कैसे प्रबंधित करते हैं (अधिकांश ब्राउज़र फिर से अनुरोध नहीं करते हैं), फ़ॉर्म में डेटा बदलते हैं, और उसी टोकन को दोबारा सबमिट करते हैं? – JeremyWeir

+0

@jayrdub मुझे पता है कि यह क्यू आरबी के लिए था, लेकिन मैं एक त्रुटि देता हूं, कह रहा है कि सत्र समाप्त हो गया है, फिर उन्हें फॉर्म में वापस ले जाएं, उपयोगकर्ता असुविधा को कम करने के लिए सत्र में सहेजे गए डेटा के साथ फॉर्म फ़ील्ड्स लोड करना – abel

9

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

यह एक आम तौर पर अच्छा विचार है क्योंकि यह आपको एक्सएसएस हमलों के खिलाफ भी बचाव में मदद करता है।

+0

मैं यही कर रहा हूं मेरी साइट पर; जावास्क्रिप्ट एक छिपे हुए क्षेत्र को यादृच्छिक 32-वर्ण वाली स्ट्रिंग के साथ पॉप्युलेट करता है और मैं यह देखने के लिए जांच करता हूं कि इसे पहले सबमिट किया गया है या नहीं। यह जेएस अक्षम होने पर भी काम करता है क्योंकि मैं जांचता हूं कि फ़ील्ड खाली है या नहीं। हालांकि, किसी व्यक्ति को तत्व की जांच करने और 32-वर्ण वाली स्ट्रिंग में पेस्ट करने से रोकता है? – Matthew

3

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

टोकन कर सकते हैं, जैसा कि अन्य लोगों ने कहा है, एक वृद्धिशील पूर्णांक (+ उपयोगकर्ता नाम), या एक GUID हो सकता है।

7

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

-3

अद्वितीय टोकन और जैज़ को उत्पन्न करने की कोई आवश्यकता नहीं है। फॉर्म सत्यापन पास होने के बाद, विज़िटर को किसी अन्य पृष्ठ पर रीडायरेक्ट करें जो कुछ कहता है "आपका क्रेडिट कार्ड संसाधित हो रहा है"। यदि विज़िटर पृष्ठ को फिर से लोड करता है तो वे रीडायरेक्ट किए गए पृष्ठ को पुनः लोड कर रहे हैं, न कि पोस्ट सबमिशन।

+3

गलत। अगर मैं सबमिट बटन पर बेतरतीब ढंग से क्लिक करता हूं, तो आपको सबमिट किए गए कई POST अनुरोध प्राप्त होंगे। –

+0

क्या आपने किसी को क्लिक करने के बाद सबमिट बटन को अक्षम करने पर विचार किया है लेकिन फॉर्म सबमिट करने से पहले? इससे किसी के लिए वास्तव में बटन को एक से अधिक बार क्लिक करना असंभव हो जाएगा। एकमात्र तरीका यह है कि वे जानबूझ कर क्रोम देव उपकरण या फायरबग का उपयोग कर क्लाइंट साइड एचटीएमएल और स्क्रिप्ट को एक से अधिक बार सबमिट करने के इरादे से बदलने के लिए जानबूझ कर इस्तेमाल कर रहे थे। सामान्य उपयोगकर्ता को ऐसा करने का ज्ञान या इच्छा नहीं होगी। –

+2

क्लाइंट-साइड महत्वपूर्ण त्रुटियों को रोकने के लिए पर्याप्त नहीं है, जैसे क्लाइंट को दो बार चार्ज करना (या अधिक)। क्या होगा यदि जेएस फाइलों के अंतिम तैनात संस्करण में कोई त्रुटि है, और बटन अक्षम नहीं है, क्योंकि त्रुटि के कारण कोई जावास्क्रिप्ट निष्पादित नहीं किया गया है? जो लोग जावास्क्रिप्ट को अक्षम करते हैं, वे हमेशा पसंद नहीं करते हैं, जैसे दृष्टिहीन लोगों की तरह (http://stackoverflow.com/a/2905104/135494 देखें)। "वह जैज़" औसत वेबसाइट के लिए काफी अच्छा हो सकता है, लेकिन ओपी ने कहा कि "* यह बिल्कुल महत्वपूर्ण है कि एक फॉर्म केवल एक बार भेजा जाए *", और "जैज़" के बिना, तो यह पर्याप्त नहीं है। –

0

मुझे एक ही समस्या है। इसे पढ़ने के बाद, मुझे लगता है कि टोकन जाने का रास्ता हो सकता है। This post कार्यान्वयन का एक अच्छा उदाहरण दिखाता है।

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