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

शोध समस्या
शुरू करने के लिए, हमें कैप्चा की समस्या पर वापस (एक बार फिर से) आने दें। कैप्चा की जटिलता शोर और विरूपण को जोड़कर प्राप्त की जाती है। लेकिन यह एक दोधारी तलवार है, क्योंकि जितना अधिक आप शोर और विरूपण जोड़ते हैं, उतना ही मुश्किल होता है किसी व्यक्ति के लिए पात्रों का अनुमान लगाना। यदि आपने इनपुट में कोई गलती की है - फिर से शुरू करें। अक्सर, उसे बस छवि को कई बार अपडेट करना पड़ता है ताकि कम से कम किसी तरह से अपने अनुमान लगाने के कार्य को सरल बनाया जा सके।
यदि हम वर्तमान कार्यान्वयन के ढांचे के भीतर ही समस्याओं के समाधान के लिए संपर्क करते हैं, तो अगले क्लोन के अलावा कुछ भी नहीं किया जा सकता है। और इस क्लोन में "माता-पिता" की सभी वंशानुगत समस्याएं होंगी। मेरा एक नियम कुछ इस तरह से है: "यदि आप समस्या को सरल तरीके से हल नहीं कर सकते हैं, तो आपको कार्य की स्थिति को बदलने की आवश्यकता है ताकि यह सरल तरीके से हल हो जाए।"
आपको कैप्चा की आवश्यकता क्यों है? सर्वर को डेटा भेजने की स्वचालित खरपतवार के लिए। उपयोगकर्ता इसे क्या करता है? रूप का उपयोग करना। लेकिन क्या होगा अगर आप फॉर्म को वही कैप्चा बनाते हैं?
एक प्रपत्र नामित फ़ील्ड का संग्रह है। एब्रकाडबरा के साथ फील्ड नामों की जगह कुछ भी नहीं करेगा, क्योंकि आप नोड ट्री में एक तत्व की स्थिति की गणना कर सकते हैं, मैप फ़ील्ड, मैपिंग के अनुसार सर्वर को डेटा भेज सकते हैं। समस्या हल नहीं होती है, लेकिन हम विचार को और विकसित करते हैं। खेतों को कोडित नामों के साथ यादृच्छिक क्रम में आने दें। फ़ॉर्म भरने से पहले, उपयोगकर्ता पहले फ़ील्ड के सही क्रम को पुनर्स्थापित करता है, और उसके बाद ही फ़ॉर्म भरता है और इसे सबमिट करता है। इस कैप्चा का रहस्य सही फ़ील्ड ऑर्डर प्राप्त करना होगा। यह कैसे पता करें कि आदेश सही है? आप फ़ील्ड्स और इनपुट फ़ील्ड्स के नाम खुद ही छवियों, रंगों, आकृतियों, जो भी हो, के साथ चिह्नित कर सकते हैं, और फिर कुछ एल्गोरिथ्म का उपयोग करके पहेली को एक साथ रखने के लिए कार्य सेट कर सकते हैं।
एल्गोरिथ्म
शुरू करने के लिए, हम संदर्भ क्रम में सामान्य फ़ील्ड नामों की एक सरणी बनाते हैं। मैं वर्णन करने के लिए एक अमूर्त भाषा का उपयोग करूंगा।
formData = [ { name: "first_name" }, { name: "last_name" }, { name: "nick" } ]
नाम के आधार पर बनाई गई संरचना में हैश जोड़ें, साथ ही बाद में काम आने वाले सूचकांक भी।
formData = [
{
name: "first_name",
hash: "0947fh27",
index: 0
},
{
name: "last_name",
hash: "82jj2n4lE2",
index: 1
},
{
name: "nick",
hash: "jf12sjfjI9",
index: 2
}
]
अब गलत पदों के साथ तीन धोखाधड़ी एरे बनाएँ। मैं इसे अनुक्रमित करने के लिए सरल करूंगा।
fake = [ [ 2, 1, 0 ], [ 2, 0, 1 ], [ 1, 0, 2 ] ]
और सही पदों के साथ एक सामान्य सरणी के बीच में जोड़ें। यह महत्वपूर्ण है कि यह पहली जगह में नहीं है, ताकि व्यक्ति समझता है कि भेजने से पहले उसे कुछ करने की आवश्यकता है। हां, और झूठी सकारात्मकता को कम किया जा सकता है।
fake = [ [ 2, 1, 0 ], [ 2, 0, 1 ], [ 0, 1, 2 ] , [ 1, 0, 2 ] ]
यह सब अच्छा है, लेकिन अब एक पहेली कैसे बनाएं? प्रदर्शन के लिए, मैंने विभिन्न रंगों में ज्यामितीय आकृतियों के साथ एक सरल पहेली को चुना। आपको उनके हिस्सों को इकट्ठा करने की आवश्यकता है। सामान्य डेटा के लिए, मैंने कुछ यादृच्छिक आकृति का एक आधा जोड़ा, मैंने पहले झूठे सरणी के सूचकांकों के अनुसार जोड़े रखे।
formData = [
{
name: "first_name",
hash: "0947fh27",
index: 0,
picture: "red_circle_left"
},
{
name: "last_name",
hash: "82jj2n4lE2",
index: 1,
picture: "yellow_triangle_left"
},
{
name: "nick",
hash: "jf12sjfjI9",
index: 2,
picture: "green_circle_left"
}
]
fake [0] = [
{
hash: "jf12sjfjI9",
index: 2,
picture: "green_circle_right"
}
{
hash: "82jj2n4lE2",
index: 1,
picture: "yellow_triangle_right"
},
{
hash: "0947fh27",
index: 0,
picture: "red_circle_right"
}
]
हम इन संरचनाओं को सत्र में सहेजते हैं और HTML भाग बनाना शुरू करते हैं। ग्राफिक्स खींचने के लिए, मैंने सीएसएस कक्षाओं का उपयोग किया, जिसे मैंने इंडेक्स द्वारा चित्रों की लिंक की पृष्ठभूमि के रूप में निर्दिष्ट किया, और हैश द्वारा नहीं, ताकि सही आदेश के बारे में पटाखा के लिए कोई संकेत न हो।
यह कुछ इस तरह से निकला:
.lp0 { background: url( /img/get/?type=l&pos=0) ... }
.lp1 { background: url( /img/get/?type=l&pos=1) ... }
.lp2 { background: url( /img/get/?type=l&pos=2) ... }
.rp0 { background: url( /img/get/?type=r&pos=0) ... }
.rp1 { background: url( /img/get/?type=r&pos=1) ... }
.rp2 { background: url( /img/get/?type=r&pos=2) ... }
स्क्रिप्ट सत्र से डेटा पढ़ता है और सामान्य सरणी से फ़ील्ड के पाठ विवरण (प्रकार = l) के लिए छवि नाम प्रदर्शित करता है, और स्वयं फ़ील्ड के लिए (टाइप = r) मिश्रित सरणी से।
हम सामान्य क्रम में फ़ील्ड के पाठ विवरण के साथ बाएं भाग को आकर्षित करते हैं, और फ़ील्ड स्वयं नकली सरणी में, जबकि नोड्स की कक्षाओं को बाएं और दाएं भाग के लिए सामान्य क्रम में व्यवस्थित किया जाता है। फील्ड के नाम हैश से लिए जाएंगे।
आगे सब कुछ जेएस खेलने में आता है। मैंने एक उदाहरण के रूप में स्टेटकंट्रोलर का उपयोग किया, जिसने खेतों के चक्रीय क्रमांकन और बाद में, डेटा एकत्र करने का एक उत्कृष्ट काम किया।
उपयोगकर्ता "इकट्ठे" फॉर्म के बाद, वह इसे भर सकता है।
लेकिन हमें यह सुनिश्चित करने की आवश्यकता है कि खेत सही क्रम में निकल जाएं। इसके लिए, json सबसे उपयुक्त है। हम उस संरचना में डेटा एकत्र करते हैं, जिसकी हमें आवश्यकता होती है, प्रत्येक क्षेत्र की स्थिति को बनाए रखते हुए, और AJAX अनुरोध के साथ सर्वर पर भेजते हैं।
सर्वर एकल जॅसन फ़ील्ड में डेटा प्राप्त करता है, सही डेटा संरचना के बारे में सत्र से अपने "पुराने" रिकॉर्ड उठाता है, और हैश का उपयोग करके दो सरणियों की तुलना करना शुरू करता है। यदि सब कुछ ठीक है, तो तत्वों के मूल्यों और नामों को मैप किया जाता है, और फिर इस जानकारी को बाद के कार्यों के लिए प्रसंस्करण के लिए भेजा जाता है। यदि सब कुछ खराब है, तो हम उपयोगकर्ता को अनुचित व्यवहार के बारे में सूचित करते हैं, और अगर खुद को एनुमरेटिंग विकल्पों से बचाने की इच्छा है, तो हम इस आईपी और इस तरह की जानकारी प्राप्त करने के बीच अंतराल में वृद्धि के साथ प्रशासनिक उपाय लागू करते हैं।
देखा!
कार्यात्मक डेमो देखेंसमस्याओं
उनके बिना कहाँ। मैं सबसे महत्वपूर्ण सूची दूंगा:
- कार्यान्वयन की जटिलता पारंपरिक कैप्चा की तुलना में थोड़ी अधिक है। शुरुआती लोगों के लिए एकीकरण मुश्किल होगा।
- डेटा की स्थिति की गारंटी देने के लिए, केवल JSON में डेटा को नियमित POST या GET अनुरोधों में नहीं भेजा जा सकता है।
- मैं कल्पना नहीं कर सकता कि सामान्य तरीके से डेटा कैसे भेजा जाए, और AJAX का उपयोग न किया जाए।
- स्वत: पूर्ण एन्क्रिप्टेड फ़ील्ड नामों के रूप में काम नहीं करेगा।
- फार्म तत्वों की न्यूनतम संख्या तीन है। फिर आपको खाली ब्लीच फ़ील्ड शुरू करके बाहर निकलना होगा
सुरक्षा बढ़ाने के तरीके
आप लंबे समय तक उनके बारे में सोच सकते हैं, और मुख्य दिशा, जैसा कि मैं देख रहा हूं, विभिन्न प्रकार की आरा पहेलियाँ बनाने में है। आप विभिन्न पहेलियों, विभिन्न आंकड़ों, संयोजन के विभिन्न सिद्धांतों के माध्यम से सॉर्ट कर सकते हैं। पहेली पाठ को पार्स न करने के लिए, आप चित्र के रूप में प्रश्न पाठ बना सकते हैं। लेकिन यह एक और कहानी है ...