วิธีโหลด ReCaptcha อีกครั้งโดยใช้ JavaScript ได้อย่างไร


177

ฉันมีแบบฟอร์มการสมัครสมาชิกกับ AJAX เพื่อที่ฉันจะต้องการรีเฟรชภาพ Recaptcha ทุกครั้งที่มีข้อผิดพลาดเกิดขึ้น (เช่นชื่อผู้ใช้ที่ใช้งานอยู่)

ฉันกำลังมองหารหัสที่เข้ากันได้กับ ReCaptcha เพื่อโหลดซ้ำโดยใช้ JavaScript


1
ไม่รำคาญ ทำไมเปลี่ยน CAPTCHA หากมีการใช้ชื่อผู้ใช้
SLaks

18
@SLaks : อาจเป็นเพราะเขาตรวจสอบ captcha เป็นครั้งแรกจากนั้นตรวจสอบผู้ใช้ - และเมื่อใช้ captcha แล้วจะไม่สามารถใช้งานได้อีกต่อไป การทำเช่นนี้กับผู้ใช้ที่ประสงค์ร้ายสามารถทำให้เซิร์ฟเวอร์เสียหายและรับรายชื่อผู้ใช้ทั้งหมดโดยใช้กำลังดุร้ายโดยไม่ต้องแคปต์ชา
Tomasz Nurkiewicz

1
@TomaszNurkiewicz UPDATE: ผู้ใช้ที่ประสงค์ร้ายจะไม่สามารถส่ง re-captcha เดิมอีกครั้งเพื่อตรวจสอบความถูกต้องมากกว่าหนึ่งครั้ง ดังนั้นไม่ bruteforce เป็นไปไม่ได้ที่นี่ เหตุผลในการรีเฟรชแคปต์ชาก็คืออนุญาตให้ผู้ใช้ป้อนได้อีกครั้ง
Tony Sepia

ฉันเชื่อว่าผู้โจมตีที่มีทักษะสามารถใช้ประโยชน์จากการโจมตีแบบกำหนดเวลาเพื่อค้นหาว่าข้อมูลใดผิดปกติขึ้นอยู่กับการตรวจสอบความถูกต้องของบ็อต ฉันชอบที่จะเก็บของฉันไว้เป็นเช็คครั้งแรกและปฏิเสธสิ่งใดหากพวกเขาล้มเหลวในทันทีนอกจากนี้ยังช่วยลดภาระในเซิร์ฟเวอร์ของฉันดังนั้นฉันจึงไม่ได้ทำแบบสอบถาม DB เมื่อพวกเขาจะถูกปฏิเสธอย่างไรก็ตาม
Steve Byrne

คำตอบ:



370

สำหรับ reCaptcha v2 ให้ใช้:

grecaptcha.reset();

หากคุณใช้ reCaptcha v1 ( อาจไม่ใช่ ):

Recaptcha.reload();

นี้จะทำอย่างไรถ้ามีการโหลดแล้ว Recaptcha windowบน

(อัปเดตตามความคิดเห็นของ @ SebiH ด้านล่าง)


20
สำหรับทุกคนที่ใช้ reCAPTCHA ใหม่: ตอนนี้เปลี่ยนเป็นgrecaptcha.reset();( documenation ) แล้ว
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

ฉันทำคุณยังไม่ได้แก้ไขของคุณและคุณเพิ่มเป็นครั้งแรก 3 เดือนหลังจากคำตอบที่ยอมรับได้รับการอัปเดตเพื่อสะท้อนการเปลี่ยนแปลงของ API - ส่งผลต่อความเกี่ยวข้องของคำตอบเริ่มต้นและปีหลังจากที่เพิ่มเป็นครั้งแรก ฉันลงคะแนนเพราะนี่เป็นคำตอบที่ยอมรับได้มีประโยชน์มากกว่า
PR Whitehead

2
ฉันเพิ่มคำตอบนี้เพราะฉันประสบปัญหาเดียวกัน แม้ว่าคำตอบที่ได้รับการยอมรับนั้นสะท้อนให้เห็นถึงคำตอบที่ถูกต้องในเวลานั้นมันก็ยังไม่ชัดเจนเพียงพอ อย่างน้อยสำหรับฉันนั่นคือเหตุผลที่ฉันตัดสินใจที่จะเพิ่มเป็นคำตอบใหม่ด้วยการแยกชัดเจน (คำตอบที่ยอมรับได้ล้มเหลวในการบันทึกความแตกต่างกับรุ่น)
Dasun

8
grecaptcha.reset(opt_widget_id)

รีเซ็ตวิดเจ็ต reCAPTCHA สามารถส่ง id วิดเจ็ตเสริมได้มิฉะนั้นฟังก์ชันจะรีเซ็ตวิดเจ็ตแรกที่สร้างขึ้น (จากหน้าเว็บของ Google)


มันรีเซ็ตเฉพาะ captcha แรกในหน้า
Maxwell sc

@ Maxwells.c คุณยังอ่านโพสต์หรือไม่ หรือคุณสามารถส่งรหัสวิดเจ็ตและลบวิดเจ็ตที่ n หากคุณไม่ผ่านก็จะรีเซ็ตคนแรก
Kutalia

1
รหัสวิดเจ็ตคืออะไร ฉันพยายามส่งผ่าน html id ของ recaptcha <div> แต่มีข้อผิดพลาด "id ลูกค้า recaptcha ไม่ถูกต้อง" ฉันคิดว่าฉันต้องแสดงวิดเจ็ตอย่างชัดเจนเพราะฉันคิดว่าวิธีการแสดงผล () คืนค่า 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>

ถ้าคุณเรียก callL showRecaptcha captchadiv จะถูกเติมด้วยอินสแตนซ์ recaptcha ใหม่


คุณสามารถเปลี่ยนรหัสของคุณและโทร showRecaptcha onload ได้หรือไม่ มันช่วยคุณได้ไหม
ทิม

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



2

หากคุณใช้ reCAPTCHA API เวอร์ชัน 1.0 โปรดอัปเกรดเป็นเวอร์ชัน 2.0 (ไม่รองรับรุ่น 1.0)

ใช้grecaptcha.reset();เพื่อรีเซ็ต captcha


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.