2011-04-20 32 views
5

我有一個使用驗證碼的形式。出於某種原因,當用戶提交此表單時採用了錯誤的重新捕獲值,當頁面重新呈現時,重新捕獲無法呈現。的Recaptcha - 腳本標記注入失敗零星

看起來發生的情況是,重新獲取嘗試注入一個「腳本」標籤,並且偶爾(並且只在某些瀏覽器,某些環境和某些情況下),它沒有添加該「腳本」標記到DOM。

它發生是這樣的:

1)有一些內嵌JavaScript嵌入在像這樣的形式:

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被加載時,它會讀取RecaptchaState撥打電話出去使用recaptcha來渲染圖像。

但是,在某些情況下,出於某種原因,應該添加到2)中的腳本標記永遠不會添加到DOM中,因此從不會加載recaptcha.js,因此從不會呈現該代碼!在頁面呈現完成後,我可以在控制檯中看到「RecaptchaState」存在並且具有正確的值,只是沒有腳本標記可以與它一起使用。

所以,這就是正在發生的事情,我真的很爲難,爲什麼。我只能在Firefox中重現這一點,奇怪的是,它只發生在某些條件下。例如,如果我通過fiddler路由請求,它將每次都工作,永遠不會失敗。如果我在提交請求之前清除了緩存,它將每次都有效。有時候,當我期待它失敗時,它會起作用,反之亦然。所以它非常零星。

所以我的想法是,也許是有事情做與JS加載它與「文件撰寫」語句干擾的時機。也許其他一些JavaScript會干擾它或類似的東西。只是尋找一些一般的想法,我可能會試圖弄清楚,我可以運行的測試,我可以尋找的東西,或任何真正的想法。

在此先感謝

更新

仍然沒有運氣搞清楚了這一點。我以爲有一個想法......我們在螢火蟲控制檯中看不到任何錯誤訊息,表明任何事情都會出錯,儘管顯然是有的。有沒有我們可以用來詳細瞭解Firefox中究竟發生了什麼的公用程序?我正在考慮Chrome的「Speed-Tracer」,它會給你一個非常詳細的事件時間表。這裏唯一的問題是我們無法在Chrome中重現 。

+1

您是否嘗試用'document.createElement'和相關函數替換'document.write'? – Lekensteyn 2011-04-20 13:56:12

+0

不是,那個代碼是從recaptcha發給我們的,所以w真的不能控制它。 – JasonStoltz 2011-04-20 18:04:28

回答

4

事實證明,我們也包括通過標籤管理服務的一些腳本調用Ensighten。其中一個腳本暫時使用「document.write」函數並將其更改爲調用另一個函數。然而,他們在一些其他事情發生後設置回調方法,這會將「document.write」函數重置爲其通常的狀態。

但是,如果腳本執行的時間發生的恰到好處,讓我們的驗證碼,而執行document.write功能是其改變的狀態JavaScript的評價......它沒有注入我們後續的recaptcha js到頁面。

這就是說,似乎這可能被認爲是侵入的修改documnet.write以這種方式,特別是對於第三方js文件。所以我問過他們是否有辦法避免在代碼中這樣做。

+0

對此有何更新? – Blexy 2014-10-29 16:56:10

+0

我不確定他們是否修復過,我假設他們這樣做。 – JasonStoltz 2014-10-31 12:22:07