2010-04-08 20 views
8

मैं एक गेम वेबसाइट चलाता हूं इसलिए मेरे पास कई उपयोगकर्ता लॉग इन हैं और वे हर दो मिनट में कुछ चीजें कर सकते हैं।PHP सत्यापन कोड कैप्चा

मेरे पास जगहों पर एक कैप्चा प्रणाली है, और कुछ चीजों के लिए यह हमेशा एक कोड मांगेगी, और अन्य चीजों के लिए, यह हर 10 मिनट में एक बार पूछेगी।

मेरे पास कुछ खिलाड़ी ओपेरा पर ऑटो सबमिट सुविधा का उपयोग करते हैं, और मेरी कैप्चा प्रणाली उन्हें रोकती है।

मेरा सवाल यह है कि, मैं कोड के लिए कितनी बार पूछ रहा हूं, मैं इसे कम से कम कैसे कर सकता हूं, लेकिन अभी भी इस ऑटो-सबमिट का उपयोग करने वाले लोगों को रोक सकता हूं?

+0

मुझे लगता है कि मेरे पास गैर-कैप्चा समाधान के लिए एक विचार है, लेकिन मुझे अधिक जानकारी चाहिए। वे ऑटो सबमिट का उपयोग कैसे करते हैं? आप उन्हें क्या रोकना चाहते हैं? कीबोर्ड से दूर होने पर बहुत तेज़ और अक्सर सबमिट करना, या सबमिट करना? – naugtur

+0

मैंने अभी अपना विचार पोस्ट करने का फैसला किया है, लेकिन आप अभी भी – naugtur

उत्तर

6

अगर मैं सही ढंग से समझता हूं तो इस कार्य को कैप्चा की आवश्यकता नहीं है। मुझे लगता है कि आप देखना चाहते हैं कि उपयोगकर्ता ने अपने पीसी के सामने बैठकर खुद को क्लिक किया था या नहीं।

नया विचार

रखो एकाधिक छवि आपका प्रपत्र पर सबमिट:

<input type="image" name="send1" src="buttons.php?i=1" /> 
... 
<input type="image" name="send8" src="buttons.php?i=8" /> 

जब एक रूप में 1 से 8 के बीच एक यादृच्छिक संख्या हो और $_SESSION['submitnumber'] में सहेज पैदा होता है। दो समान आकार की छवियां बनाएं - एक डिफ़ॉल्ट रूप से आपकी डिफ़ॉल्ट पृष्ठभूमि से भरा खाली, दूसरा सबमिट बटन की तरह दिख रहा है। buttons.php इस कोड के साथ कि इच्छा उत्पादन चित्र बनाने:

header("Content-Type: image/jpeg"); 
flush(); 
readfile($filename); 

और खाली छवि वापस आ यदि किसी और $_GET[i]!=$_SESSION['submitnumber'] प्रस्तुत छवि वापस आ।

प्रपत्र स्वीकार करता है, तो सही imagesubmit क्लिक किया गया था (ब्राउज़र जब उपयोगकर्ता बटन पर क्लिक करता आप send1X तरह coords भेज देंगे)

यह कैप्चा का एक प्रकार है, लेकिन लोगों को पता नहीं होगा;)

रूपों है कि काफी अद्वितीय हैं के लिए टोकन जनरेट करें: वर्ष विचार

आप दो चीजों की जरूरत है।

<input type="hidden" name="timertoken" value="someweirdstring" /> डालें और "someweirdstring" को कुछ (उपयोगकर्ता नाम और समय) - एमडी 5 हैश उत्पन्न करने के लिए उत्पन्न करें।मैं इस पर विस्तार कर सकता हूं, लेकिन यह सुरक्षा और सीएसआरएफ हमलों को अवरुद्ध करने के लिए एक बुनियादी रूप टोकन है। पोस्टिंग के बाद टोकन सत्यापित किया जाता है।

उदाहरण:

यह नहीं टोकन तंत्र का एक विशिष्ट कार्यान्वयन है, लेकिन यह पर्याप्त होगा।

$token=generatesomerandomtext(); 
$_SESSION['token']=$token; 

//... somewhere later when outputing forms:  
echo '<input type="hidden" name="token" value="'.$token.'" />'; 

//and when it comes back: 
if($_POST['token']==$_SESSION['token']) { 
    //it's ok 
    } 

और यह सब आपको चाहिए। यह सरल उदाहरण प्रत्येक पृष्ठ के लिए एक अद्वितीय टोकन बनाता है और रूपों में रखता है। यह समय पर निर्भर नहीं है और एमडी 5 का उपयोग नहीं करता है, लेकिन सत्र में टोकन स्टोर करता है। स्वचालित रूप से एक फॉर्म भेजने के लिए जिसे स्वीकार किया जाएगा व्यक्ति को उस फॉर्म का उपयोग करना होगा जिसे आपने जेनरेट किया है या टोकन कॉपी किया है।

असली फॉर्म टोकन उदाहरण इस तरह अधिक होगा: $ टोकन = एमडी 5 ($ उपयोगकर्ता नाम। 'कुछ गुप्त पाठ'। $ दिनांक। $ TimeRoundedTo10Minutes);

//... somewhere later when outputing forms:  
echo '<input type="hidden" name="token" value="'.$token.'" />'; 

//and when it comes back: 
if(
($_POST['token']==md5($username.'some secret text'.$date.$timeRoundedTo10Minutes)) || 
($_POST['token']==md5($username.'some secret text'.$date.$timeRoundedTo10Minutes-10minutes))) { 
    //it's ok 
    } 

उपयोगकर्ता नाम क्यों? चूंकि यह किसी अन्य उपयोगकर्ता को हैक करने के लिए एक उपयोगकर्ता के टोकन का उपयोग करने की संभावना को हटा देता है क्यों गुप्त पाठ (जिसे 'नमक' कहा जाता है)? क्योंकि कोई समय के साथ अन्य उपयोगकर्ता के नाम को एक साथ रख सकता है और एमडी 5 कर सकता है, लेकिन नमक का अनुमान लगाए बिना वह नहीं कर सकता। दो तुलना क्यों? क्योंकि अगर अब 22:44:59 है - टोकन 22:40 के साथ उत्पन्न होता है और यदि उपयोगकर्ता इसे भेजता है तो यह 22:45:30 है, इसलिए यह 22:50 तक गोल हो जाता है और यह केवल टोकन से मेल खाता है यदि आप इसे 10 मिनट वापस लेते हैं ।

यह मूल उदाहरण के लिए है। संदर्भ के लिए this प्रश्न देखें।

<input type="image" ... में अपना सबमिट बटन बदलें क्योंकि यह बटन क्लिक किए गए एक्स और वाई निर्देशांक पोस्ट करता है। मुझे नहीं पता कि विनिर्देशन में इसके साथ कौन आया, लेकिन यह पहली बार इस्तेमाल किया जा सकता है! :)

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

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

यह अभी भी उपयोगकर्ताओं की कार्यक्षमता द्वारा हैक करने योग्य है, लेकिन यह बहुत कठिन है। और यदि आपने एक घंटे में एक बार कैप्चा जोड़ा है तो कोई भी लेखन स्क्रिप्ट को परेशान नहीं करेगा जो केवल एक घंटे के लिए मदद करेगा और उसके बाद तोड़ देगा (और कुछ प्रयास और ज्ञान की आवश्यकता है)।

+0

का उत्तर दे सकते हैं हर कोई माउस का उपयोग नहीं करता है ... – ntd

+0

यह अपेक्षा करना बेहतर है कि कुछ भी करने से, है ना? यदि वे कीबोर्ड का उपयोग करते हैं, तो वे अब वही कैप्चा देखेंगे जो उन्हें मिलता है। और यदि आप जावास्क्रिप्ट की एक पंक्ति लिखते हैं जो एंटर पर सबमिट करना बंद कर देता है तो यह केवल lynx-alikes को छोड़ देता है। यदि पहले हिनक कैप्चा का उपयोग करता है, तो वे पहले से समर्थित नहीं हैं? – naugtur

+0

क्या आप इन टोकन के बारे में अधिक लिख सकते हैं। कभी-कभी एक पृष्ठ पर कई रूप होते हैं, क्या इससे कोई समस्या हो सकती है? और क्या आपका मतलब है टोकन जेनरेट करें और इसे अपने डेटाबेस में स्टोर करें, और इसे एक फॉर्म में जोड़ें और फिर उन्हें एक दूसरे के खिलाफ जांचें? या बस अंतिम प्राप्त टोकन को स्टोर करें और जांचें कि क्या वे एक ही टोकन को दो बार पोस्ट करते हैं? – Juddling

3

आपको प्राप्त होने वाले डेटा के आधार पर आप उन लोगों को इकट्ठा कर सकते हैं जो कॉलर उपयोगकर्ता हैं। केवल कॉलर के लिए पूछें, अगर कॉलर एक बॉट प्रतीत होता है।

Evidents हो सकता है:

  • उपयोगकर्ता एजेंट (विश्वसनीय नहीं है, क्योंकि ओपेरा कर सकते हैं नकली यह)
  • अंतराल प्रस्तुत शुरू हो रहा है (अधिक सटीक कॉल यानी हर 2 मिनट हिट अधिक संभावना यह भी
  • ... एक बॉट है)
  • अपने डेटा पैटर्न लौटने यह एक स्पष्ट हो सकता है के लिए जाँच की अनुमति देता है
संबंधित मुद्दे