JavaScript를 사용하여 ReCaptcha를 다시로드하는 방법?


177

오류가 발생할 때마다 (즉, 이미 사용중인 사용자 이름) 언제든지 Recaptcha 이미지를 새로 고치도록 AJAX에 가입 양식이 있습니다.

JavaScript를 사용하여 다시로드하기 위해 ReCaptcha와 호환되는 코드를 찾고 있습니다.


1
귀찮게하지 마십시오. 사용자 이름을 사용하는 경우 왜 보안 문자를 변경해야합니까?
SLaks

18
@SLaks : 아마도 보안 문자를 먼저 확인한 다음 사용자를 확인하기 때문에 보안 문자가 사용되면 더 이상 유효하지 않습니다. 악의적 인 사용자와 다른 방법으로이 작업을 수행하면 서버에 쉽게 결함이 생기고 보안 문자를 사용하지 않고도 무차별 대입을 사용하는 모든 사용자 목록을 얻을 수 있습니다.
Tomasz Nurkiewicz

1
@TomaszNurkiewicz 업데이트 : 악의적 인 사용자는 유효성 검사를 위해 동일한 보안 문자를 두 번 이상 제출할 수 없습니다. 따라서, 무차별 대입은 불가능합니다. 보안 문자를 새로 고치는 이유는 사용자가 단순히 보안 문자를 다시 입력 할 수있게하기 위해서입니다.
Tony Sepia

숙련 된 공격자는 타이밍 공격을 이용하여 봇 유효성 검사의 위치에 따라 어떤 데이터가 잘못되었는지 확인할 수 있습니다. 필자는 첫 번째 검사로 유지하고 실패하면 즉시 거부하고 서버 부하를 줄이는 데 도움이되므로 DB 쿼리가 거부 될 때 DB 쿼리를 수행하지 않습니다.
Steve Byrne

답변:



370

reCaptcha v2의 경우 다음을 사용하십시오.

grecaptcha.reset();

reCaptcha v1을 사용하는 경우 ( 아마도 아닙니다 ) :

Recaptcha.reload();

에 이미로드 된 Recaptcha가있는 경우 수행됩니다 window.

(아래 @SebiH의 의견에 따라 업데이트되었습니다.)


20
새로운 reCAPTCHA를 사용하는 사람 : 라인이 이제 grecaptcha.reset();( 문서 )로 변경되었습니다
SebiH

grecaptcha.reset();반응 형 앱에 이것을 사용 하고 있으며 완벽하게 작동합니다
yussan

4
grecaptcha가로드되었는지 확실하지 않은 경우if (window.grecaptcha) grecaptcha.reset();
fred727

이렇게하면 보안 문자가 다시로드되지만 보안 문자 응답의 필드 값이 제거되지 않아서 내 양식이 유효합니다.
Damian Green

58

버전 1을 사용중인 경우

Recaptcha.reload();

버전 2를 사용중인 경우

grecaptcha.reset();

1
수락 된 답변을 복사하고 3 년 후 다시 게시했습니다. Urg.
PR Whitehead

@PRWhitehead 편집 이력을 참조하십시오. BTW, 다운 투표에 감사드립니다.
Dasun

나는 당신이 당신을 편집하지 않았으며, 당신은 API에 대한 변경 사항을 반영하기 위해 승인 된 답변이 업데이트 된 후 3 개월 후에 그것을 추가했습니다. 나는 이것이 받아 들인 대답이 더 유용하기 때문에 그것을 하향 투표했다.
PR Whitehead

2
나는 같은 문제에 직면했기 때문에이 답변을 추가했습니다. 수락 된 답변은 당시 정답을 반영했지만 명확하지 않았습니다. 적어도 나를 위해, 명확한 구분을 가진 새로운 답변으로 추가하기로 결정한 이유입니다 (허용 된 답변은 버전과의 차이점을 언급하지 못했습니다).
Dasun

8
grecaptcha.reset(opt_widget_id)

reCAPTCHA 위젯을 재설정합니다. 선택적 위젯 ID를 전달할 수 있습니다. 그렇지 않으면 함수는 작성된 첫 번째 위젯을 재설정합니다. (Google 웹 페이지에서)


그것은 페이지의 첫 번째 보안 문자 만 재설정합니다
Maxwell sc

@ Maxwells.c 게시물을 읽었습니까? 선택적으로 위젯 ID를 전달하고 n 번째 위젯을 삭제할 수 있습니다. 통과하지 않으면 첫 번째 것이 재설정됩니다.
Kutalia

1
위젯 ID는 정확히 무엇입니까? recaptcha <div>의 html ID를 전달하려고 시도했지만 "잘못된 recaptcha 클라이언트 ID"오류가 발생했습니다. render () 메소드가 필요한 id를 반환한다고 생각하기 때문에 위젯을 명시 적으로 렌더링해야한다고 생각합니다.
Pete

6

이 시도

<script type="text/javascript" src="//www.google.com/recaptcha/api/js/recaptcha_ajax.js"></script>
<script type="text/javascript">
          function showRecaptcha() {
            Recaptcha.create("YOURPUBLICKEY", 'captchadiv', {
              theme: 'red',
              callback: Recaptcha.focus_response_field
            });
          }
 </script>

<div id="captchadiv"></div>

showRecaptcha를 호출하면 captchadiv에 새 recaptcha 인스턴스가 채워집니다.


코드를 변경하고 showRecaptcha onload를 호출 할 수 있습니까? 이것이 당신을 돕고 있습니까?
Tim

6

또는 새로 고침 버튼을 클릭하여 시뮬레이션 할 수도 있습니다.

// If recaptcha object exists, refresh it
    if (typeof Recaptcha != "undefined") {
      jQuery('#recaptcha_reload').click();
    }

1
어떤 이유로, Recaptcha그리고 grecaptcha모두 내 페이지에서 정의되지 않은 있습니다. 이것은 약간의 수정으로 나를 위해 일했습니다 :if( $("#recaptcha_reload").length > 0 ){ ....
Nate-Bit Int

나는 그것을 요소 수없이 배열의 반복이 완료되는 것을 알았습니다.
m3nda


3

reCaptcha v2 의 새 버전의 경우 다음을 사용하십시오.

grecaptcha.reset();

2

reCAPTCHA API 버전 1.0을 사용중인 경우 버전 2.0으로 업그레이드 하십시오 (버전 1.0은 더 이상 지원되지 않음)

grecaptcha.reset();보안 문자를 재설정하는 데 사용 합니다.


0

새로운 recaptcha 2.0을 사용하는 경우 이것을 사용하십시오 : 코드 숨김 :

ScriptManager.RegisterStartupScript(this, this.GetType(), "CaptchaReload", "$.getScript(\"https://www.google.com/recaptcha/api.js\", function () {});", true);

간단한 자바 스크립트

<script>$.getScript(\"https://www.google.com/recaptcha/api.js\", function () {});</script>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.