2010-06-06 18 views
7

हम पंजीकरण फॉर्म में कैप्चा नियंत्रण का उपयोग करते हैं कि हम सर्वर सत्यापन के बगल में जावास्क्रिप्ट (JQuery) के सभी क्षेत्रों के लिए पूर्ण ग्राहक सत्यापन करते हैं ..
मैंने कई तरीकों की कोशिश की लेकिन सभी जावास्क्रिप्ट में कैप्चा मान लिखेंगे जिन्हें एक्सेस किया जा सकता है किसी को भी :(इनके द्वारा
मैं खोज अगर वहाँ किसी भी तरह से है कि मुझे ग्राहक के पक्ष में कैप्चा मूल्य को मान्य सुरक्षित तरीके से JQuery का उपयोग कर या यह नहीं किया जा सकता अनुमति देते हैं?क्या मैं जावास्क्रिप्ट से कैप्चा डेटा को सुरक्षित तरीके से पढ़ सकता हूं?

उत्तर

8

यह नहीं किया जा सकता।

जावास्क्रिप्ट है क्लाइंट-साइड, जैसा कि आप जानते हैं, और किसी भी कोड क्लाइंट-साइड को संभावित रूप से समझौता किया जाना चाहिए क्योंकि आपके पास इसका नियंत्रण नहीं है।

सबसे अच्छा, आप नमक के साथ मूल्य के नमकीन हश को भेजने का सहारा ले सकते हैं, लेकिन यहां तक ​​कि वास्तव में इसे प्रस्तुत करने से पहले अनुमानित मूल्यों का परीक्षण करने के लिए भी इस्तेमाल किया जा सकता है।

बाकी सब कुछ सर्वर पर कॉल पर निर्भर करता है।

सबसे पहले, सर्वर पर, एक यादृच्छिक स्ट्रिंग नमक के रूप में प्रयोग की जाने वाली गणना:


टिप्पणी अनुरोध के अनुसार, यहां एक सामान्य उपाय है। यह हर अनुरोध लगभग मोटा होना चाहिए। इस स्ट्रिंग का उद्देश्य rainbow table attacks को रोकने के लिए है।

अब, इस स्ट्रिंग को अलग से सहेजते हुए, लेकिन एक और स्ट्रिंग भी बनाएं जो यादृच्छिक स्ट्रिंग और कैप्चा उत्तर का संगतता है। इस नई संयुक्त स्ट्रिंग में से आप हैश उत्पन्न करते हैं (उदाहरण के लिए, SHA-1)।

using System.Web.Security; 
... 
string hashVal = FormsAuthentication.HashPasswordForStoringInConfigFile(combined, "SHA1"); 

यादृच्छिक स्ट्रिंग और हैश मान दोनों पेज में रखा जा रहा जावास्क्रिप्ट को पढ़ने में सक्षम होने के लिए की जरूरत है।

ग्राहक पक्ष पर, जब कोई उपयोगकर्ता कैप्चा का उत्तर देता है, तो यादृच्छिक स्ट्रिंग लें और इसे उत्तर के साथ संयोजित करें (यहां विचार प्राप्त करें?)। इस स्ट्रिंग को लेते हुए, आप इसे SHA-1 JQuery plugin जैसे कुछ हैश के लिए उपयोग कर सकते हैं और इसे आपके द्वारा भेजे गए पूर्व-गणना वाले हैश के साथ तुलना कर सकते हैं।

hashVal = $.sha1(combinedString)

यदि यह मेल खाता है, यह (लगभग) निश्चित रूप से सही जवाब है। यदि ऐसा नहीं होता है, तो यह 100% गलत जवाब है।

+0

दान क्या आप मुझे 'नमकीन हैश समाधान' का उदाहरण दे सकते हैं? –

+0

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

+0

हैश मान को प्रकट करके यह हमलावर को सर्वर पर भेजने के बिना कई अनुमान लगाने में सक्षम बनाता है। इसके अलावा, अगर यह सही अनुमान नहीं मिल सकता है तो यह पृष्ठ को रीफ्रेश कर सकता है। यह हमलावर को कम पहचान दर के साथ बेहतर स्ट्राइक दर प्राप्त करने में सक्षम कर सकता है। –

1

आप सर्वर पर वर्तमान मान पोस्ट करने के लिए AJAX का उपयोग कर सकते हैं, जो सही या गलत का जवाब देगा। जो आपको वास्तविक पोस्ट करने और HTML में कैटचाचा मान देने से भी रोक देगा।

+0

दुर्भाग्यवश, हम उपयोगकर्ता को एक छिपे तरीके से सर्वर सत्यापन करने के लिए AJAX नहीं करेंगे, इसलिए हम JQuery में किसी अन्य समाधान की खोज करें .. –

+0

मुझे लगता है कि मुझे तब दान से सहमत होना होगा। आपकी स्क्रिप्ट या एचटीएमएल में जवाब देने के बिना ऐसा करने का कोई उचित तरीका नहीं है। –

+0

अकेले JQuery में कोई समाधान नहीं है। केवल सर्वर का उपयोग आपको दिमाग की शांति देगा। – Amadan

0

मेरा समाधान)) हर बार जब पृष्ठ उपयोगकर्ता को कैप्चा दिखाता है, तो आप गतिशील रूप से obfuscated जावास्क्रिप्ट फ़ंक्शंस उत्पन्न कर सकते हैं (मुझे लगता है कि 5 या 10 का सबसे अच्छा तरीका है)। उदाहरण के लिए, एक फ़ंक्शन (या 3))) पूर्वनिर्धारित हैश (सर्वर इसे वापस कर देता है) के साथ कुकीज़ सेट कर सकता है (कैप्चा के वास्तविक मूल्य से), अन्य फ़ंक्शंस को सर्वर के टाइप एल्गोरिदम का एहसास होना चाहिए ताकि उपयोगकर्ता द्वारा टाइप किए गए मान की जांच हो सके। मैं कह सकता हूं कि यह 100% के लिए काम करता है, क्योंकि गतिशील रूप से जावास्क्रिप्ट को पार्स करना बहुत मुश्किल है + हम क्लाइंट साइड पर उपयोगकर्ता कुकीज़ सेट करते हैं (जावास्क्रिप्ट का उपयोग करके बोट्स को यह पता लगाने के लिए बहुत मुश्किल है कि आप कहां और कैसे सेट करते हैं और चेक करते हैं) ।

+0

क्षमा करें सैफ, लेकिन क्या आप मुझे अपने समाधान –

+0

के बारे में और अधिक समझा सकते हैं आपके पास कैपेचा के लिए सर्वर साइड सरल हैश है: md5 (captcha_srv_side) हमें क्लाइंटसाइड पर हैश के साथ इस हैश से मिलान करने की आवश्यकता है। सबसे आसान तरीका है हमारे हैश पर 2 भागों को विभाजित करना और सर्वर पक्ष द्वारा उपयोगकर्ता कुकी को लिखना ({"v1": "81b ..", "v2": "873f ..."})। अब हमारे पास उपयोगकर्ता कुकीज़ में 2 वर्र्स हैं। हम जावास्क्रिप्ट के कई कार्यों का उपयोग करके बहुत जटिल कोड लिख सकते हैं, फिर इस कोड को खराब कर सकते हैं। जब उपयोगकर्ता कैप्चा में प्रवेश करता है, तो स्क्रिप्ट जेएस इवेंट फ़ंक्शन चलाएगी, जो 2 वर्र्स (v1, v2) को जोड़ती है, उपयोगकर्ता स्ट्रिंग से md5 उत्पन्न करती है, इसे लिखें कुकीज़ के लिए और फिर उन्हें मैच। यह सिर्फ थोड़ा उदाहरण है। कई भिन्नताएं हैं। – Saff

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