2011-04-20 13 views
5

मेरे पास एक ऐसा फॉर्म है जो reCAPTCHA का उपयोग करता है। किसी कारण से, जब कोई उपयोगकर्ता गलत रूप से पुनः प्राप्त करने के साथ इस फ़ॉर्म को सबमिट करता है, जब पृष्ठ को फिर से प्रस्तुत किया जाता है, तो पुनः प्राप्त करने में विफल रहता है।रिकैप्चा - स्क्रिप्ट टैग इंजेक्शन स्पोरैडिक रूप से असफल

ऐसा लगता है कि ऐसा होने पर ऐसा लगता है कि पुनः प्राप्त करने से "स्क्रिप्ट" टैग इंजेक्ट करने का प्रयास किया जाता है, और स्पोरैडिक (और केवल कुछ ब्राउज़रों, कुछ वातावरण, और कुछ परिदृश्यों में), यह उस "स्क्रिप्ट" टैग को जोड़ने में विफल रहता है डोम को

यह इस तरह होता है:

1) कुछ इनलाइन जावास्क्रिप्ट फार्म का है कि इस तरह दिखता है में एम्बेडेड है:

https://www.google.com/recaptcha/api/challenge?k=<our public key> 

2) यही कारण है कि स्क्रिप्ट सही ढंग से निष्पादित करता है और देता है निम्नलिखित:

var RecaptchaState = { 
site : <some value>, 
challenge : <challenge key>, 
is_incorrect : false, 
programming_error : '', 
error_message : '', 
server : 'https://www.google.com/recaptcha/api/', 
timeout : 18000 
}; 

document.write('<scr'+'ipt type="text/javascript" s'+'rc="' + RecaptchaState.server + 'js/recaptcha.js"></scr'+'ipt>'); 

3) इसके बाद आमतौर पर क्या होता है, यह है कि स्क्रिप्ट टैग को पृष्ठ में इंजेक्शन दिया जाता है, recaptcha.js लोड हो जाता है, और यह रिकैप्चाचास्ट को कॉल करने के लिए पढ़ेगा रेंडर करने के लिए छवि प्राप्त करने के लिए reaptcha।

हालांकि, कुछ मामलों में, किसी कारण से, स्क्रिप्ट टैग जिसे 2 में जोड़ा जाना चाहिए) कभी भी डोम में नहीं जोड़ा जाता है, इसलिए recaptcha.js कभी लोड नहीं होता है, इसलिए रिकैप्चा कभी प्रस्तुत नहीं किया जाता है! पृष्ठ को प्रस्तुत करने के बाद मैं कंसोल में देख सकता हूं कि "रिकैप्चास्टेट" मौजूद है और इसमें सही मान है, इसके साथ जाने के लिए कोई स्क्रिप्ट टैग नहीं है।

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

तो मेरा विचार यह है कि शायद जेएस लोडिंग के समय के साथ कुछ करना है जो "document.write" कथन में हस्तक्षेप कर रहा है। हो सकता है कि कुछ अन्य जावास्क्रिप्ट इसके साथ हस्तक्षेप कर रहे हों या ऐसा कुछ। बस कुछ सामान्य विचारों की तलाश में है कि मैं इसे कैसे समझने का प्रयास कर सकता हूं, परीक्षण मैं चला सकता हूं, जिन चीज़ों को मैं देख सकता हूं, या वास्तव में किसी भी विचार के रूप में।

अग्रिम

अद्यतन

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

+1

क्या आपने 'document.writeE'' 'document.createElement' और संबंधित कार्यों के साथ 'document.write' को बदलने का प्रयास किया है? – Lekensteyn

+0

नहीं, यह कोड हमें रिकैप्चा से भेजा गया है, इसलिए वास्तव में इसका नियंत्रण नहीं है। – JasonStoltz

उत्तर

4

जैसा कि यह पता चला है, हम टैग प्रबंधन सेवा के माध्यम से Ensighten नामक कुछ स्क्रिप्ट भी शामिल कर रहे हैं। उन स्क्रिप्ट्स में से एक अस्थायी रूप से "document.write" फ़ंक्शन को हाई-जैकिंग कर रहा था और इसे किसी अन्य फ़ंक्शन को कॉल करने के लिए बदल रहा था। हालांकि, कुछ अन्य चीजों के बाद वे कॉलबैक विधि स्थापित कर रहे थे जो "document.write" फ़ंक्शन को अपने सामान्य स्थिति में रीसेट कर देगा।

हालांकि, यदि स्क्रिप्ट मूल्यांकन का समय ठीक हो गया है तो हमारे रिकैप्चा जावास्क्रिप्ट का मूल्यांकन किया गया था जबकि दस्तावेज़.write फ़ंक्शन इसके बदले गए राज्य में था ...यह पृष्ठ पर हमारे बाद के recaptcha जेएस इंजेक्षन करने में विफल रहा था।

ऐसा कहा जा रहा है कि ऐसा लगता है कि ऐसा लगता है कि इस तरह से documnet.write को संशोधित करने के लिए विशेष कोड को घुसपैठ माना जा सकता है, खासकर किसी तृतीय-पक्ष जेएस फ़ाइल के लिए। इसलिए मैंने उनसे पूछा है कि वैसे भी वे अपने कोड में ऐसा करने से बच सकते हैं।

+0

इस पर कोई अद्यतन? – Blexy

+0

मुझे यकीन नहीं है कि उन्होंने कभी तय किया है या नहीं, मुझे लगता है कि उन्होंने किया है। – JasonStoltz