2011-04-20 2 views
5

reCAPTCHA를 사용하는 양식이 있습니다. 어떤 이유로 사용자가 잘못된 포착 값으로이 양식을 제출하면 페이지가 다시 렌더링 될 때 포착이 렌더링되지 않습니다.Recaptcha - 스크립트 태그 주입이 산발적으로 실패합니다.

재현이 "스크립트"태그를 주입하려고 시도하고 산발적으로 (일부 브라우저, 특정 환경 및 특정 시나리오에서만), "스크립트"태그를 추가하지 못하고 있습니다. DOM에.

그것은 다음과 같이 발생합니다

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가로드되고 RecaptchaState가 호출되어 호출이 이루어집니다. recaptcha를 사용하여 이미지를 렌더링하십시오.

그러나 몇 가지 이유로 인해 2)에서 추가해야하는 스크립트 태그가 DOM에 추가 된 것으로 보이지 않으므로 recaptcha.js가로드되지 않으므로 recaptcha는 렌더링되지 않습니다! 페이지가 렌더링 된 후에 "RecaptchaState"가 존재하고 올바른 값을 가지면 콘솔에서 볼 수 있습니다. 스크립트 태그가 없어도됩니다.

그게 무슨 일이 일어나고 있는지, 그리고 나는 왜 그토록 당황 스럽습니다. 파이어 폭스에서만 이것을 재현 할 수 있으며 이상하게도 특정 조건 하에서 만 발생한다. 예를 들어 피들러를 통해 요청을 라우팅하는 경우 매번 작동하고 실패하지 않습니다. 요청을 제출하기 전에 캐시를 지우면 매번 작동합니다. 때로는 실패 할 것으로 예상 할 때 작동하고 반대의 경우도 마찬가지입니다. 그래서 아주 산발적입니다.

그래서 내 생각에는 아마도 "document.write"문을 방해하는 js로드 시점과 관련이 있다는 것입니다. 어쩌면 다른 자바 스크립트가 그걸 간섭하고있는 것처럼 보일 수도 있습니다. 내가 이것을 알아 내려고 시도 할 수있는 방법, 실행할 수있는 테스트, 찾을 수있는 것, 또는 실제로 모든 아이디어를 찾는 일반적인 아이디어를 찾고 있습니다.

아직 운이를 파악하지 미리

업데이트에

감사합니다. 한 가지 생각은 ... 방화범이 끌리는 콘솔에 아무런 오류 메시지가 나타나지 않는다는 것을 알았습니다. Firefox에서 진행되는 작업을 자세히 살펴볼 수있는 유틸리티가 있습니까? Chrome에 대한 'Speed-Tracer'와 같은 것을 생각 중이며 매우 자세한 일정을 알려줍니다. 여기서 유일한 문제는 Chrome에서 을 재현 할 수 없다는 것입니다.

+1

'document.write'를'document.createElement' 및 관련 함수로 바꾸려고 했습니까? – Lekensteyn

+0

아니, 그 코드는 우리에게 recaptcha에서 보내 지므로, 실제로 코드를 제어 할 수는 없습니다. – JasonStoltz

답변

4

우리는 또한 Ensighten이라는 태그 관리 서비스를 통해 일부 스크립트를 포함시키고 있습니다. 이 스크립트 중 하나는 일시적으로 "document.write"기능을 훔쳐 다른 기능을 호출하도록 변경하는 것입니다. 그러나 그들은 "document.write"함수를 일반적인 상태로 재설정하는 다른 일이 일어난 후에 콜백 메소드를 설정했습니다.

그러나 document.write 함수가 변경된 상태에있는 동안 recaptcha javascript가 평가되도록 스크립트 평가의 타이밍이 올바르게 수행되면 ...우리의 후속 recaptcha js를 페이지에 삽입하지 못했습니다.

즉, 제 3 자 js 파일과 같은 방식으로 documnet.write를 수정하기 위해서는 기본 코드를 간섭하는 것으로 간주 될 수 있습니다. 그래서 어쨌든 그들이 코드에서 그렇게하지 않을 수 있는지 물어 봤습니다.

+0

이것에 대한 어떤 업데이 트? – Blexy

+0

그들이 고칠 수 있는지 확실하지 않습니다. – JasonStoltz

관련 문제