จะป้องกันไม่ให้หุ่นยนต์กรอกแบบฟอร์มโดยอัตโนมัติได้อย่างไร?


105

ฉันกำลังพยายามหากลไกป้องกันสแปมที่ดีเพียงพอเพื่อป้องกันการป้อนข้อมูลที่สร้างขึ้นโดยอัตโนมัติ ฉันได้อ่านเทคนิคเช่น captcha, 1 + 1 =? สิ่งต่างๆทำงานได้ดี แต่ยังมีขั้นตอนเพิ่มเติมที่ขัดขวางการใช้งานแอปพลิเคชันฟรีอย่างรวดเร็ว (ฉันไม่ได้มองหาอะไรแบบนั้น)

ฉันได้ลองตั้งค่าฟิลด์ที่ซ่อนอยู่ในฟอร์มทั้งหมดของฉันแล้วด้วยdisplay: none; อย่างไรก็ตามฉันแน่ใจว่าสคริปต์สามารถกำหนดค่าให้ติดตาม ID ฟิลด์ของฟอร์มนั้นและไม่ต้องกรอกข้อมูล

คุณใช้ / รู้จักวิธีต่อต้านหุ่นยนต์เติมฟอร์มอัตโนมัติที่ดีหรือไม่? มีบางสิ่งที่สามารถทำได้อย่างราบรื่นด้วยการประมวลผลฝั่งเซิร์ฟเวอร์ HTML AND / OR และ (เกือบ) กันกระสุนหรือไม่? (ไม่มี JS เพราะสามารถปิดการใช้งานได้)

ฉันพยายามที่จะไม่พึ่งพาเซสชันนี้ (เช่นการนับจำนวนครั้งที่มีการคลิกปุ่มเพื่อป้องกันการโอเวอร์โหลด)


5
ขอบคุณที่ไม่ต้องการวิธีแก้ปัญหา captcha! IMO รูปแบบสแปมเป็นปัญหาสำหรับเจ้าของไซต์และการป้องกันไม่ให้เป็นภาระที่ผู้ใช้ควรแบกรับ มีทางเลือกอื่นอีกมากมายที่เราสามารถจัดการกับสแปมที่ส่วนท้ายของไซต์ได้ดังที่เห็นได้จากการตอบกลับที่นี่ วิธีการที่ต้องใช้การโต้ตอบกับผู้ใช้ควรใช้โดยผู้ที่ขี้เกียจหรือมือใหม่เท่านั้น
Mike

คำตอบ:


73

วิธีการแก้ปัญหาการป้องกันสแปมที่ใช้งานง่าย แต่ไม่หลอก (โดยเฉพาะการโจมตีแบบ "เจาะจง") คือการติดตามเวลาระหว่างการส่งแบบฟอร์มและการโหลดหน้าเว็บ

บ็อตขอเพจแยกวิเคราะห์เพจและส่งแบบฟอร์ม เร็วขนาดนี้

มนุษย์พิมพ์ URL โหลดหน้าเว็บรอก่อนที่หน้าจะโหลดเต็มเลื่อนลงอ่านเนื้อหาตัดสินใจที่จะแสดงความคิดเห็น / กรอกแบบฟอร์มต้องใช้เวลาในการกรอกแบบฟอร์มและส่ง

ความแตกต่างของเวลาอาจเป็นเรื่องละเอียดอ่อน และวิธีการติดตามเวลานี้โดยไม่ต้องใช้คุกกี้ต้องใช้ฐานข้อมูลฝั่งเซิร์ฟเวอร์ นี่อาจเป็นผลกระทบในด้านประสิทธิภาพ
นอกจากนี้คุณต้องปรับแต่งขีด จำกัด เวลา


9
ระวังว่าคุณต้องการอนุญาตให้ผู้ใช้ปลายทางใช้ตัวเติมแบบฟอร์มอัตโนมัติเช่นaddons.mozilla.org/en-US/firefox/addon/1882 หรือไม่ซึ่งอาจทำให้ส่งได้เร็วมาก เช่นเดียวกับ captcha สิ่งใด ๆ ที่น่ารำคาญโดยทั่วไปผู้ใช้ขั้นสุดท้ายก็ไม่ดีและโดยเฉพาะอย่างยิ่งเมื่อป้องกันไม่ให้บุคคลที่อยู่ในความเกลียดชังจากไปอย่างรวดเร็ว (มาก)
เกล็ดหิมะ

1
จุดดี แต่ทั้งหมดขึ้นอยู่กับบริบท หากแบบฟอร์มนี้เป็นแบบฟอร์มการเข้าสู่ระบบฉันเห็นด้วยกับคุณอย่างสมบูรณ์ แต่ทำไมปิดการเข้าสู่ระบบจากบอท? หากบริบทเป็นช่องแสดงความคิดเห็นเช่นนี้ใน StackOverflow ฉันรู้แน่นอน: ถ้าคุณใช้การป้อนอัตโนมัติในช่องความคิดเห็นแสดงว่าคุณเป็นนักส่งสแปม โปรดทราบว่าหากคุณใช้การป้อนอัตโนมัติสำหรับลายเซ็นคุณยังคงต้องใช้เวลาในการพิมพ์เนื้อหาจริงๆ
Pindatjuh

5
โปรดทราบว่า SO จะทำสิ่งนี้ แก้ไขความคิดเห็นเป็นเร็วหรือหลายครั้งติดต่อกันแล้วคุณจะได้รับข้อความ "คุณเป็นมนุษย์หรือไม่" หน้า.
Jakob Borg

2
แฮกเกอร์จะไม่ขอแบบฟอร์มเสมอไป บางครั้ง URL ที่สร้างขึ้นอย่างระมัดระวัง (โดยใช้ GET หรือ POST) จะเพียงพอสำหรับการโพสต์แบบฟอร์มหลาย ๆ ครั้งโดยใช้ความพยายามเพียงเล็กน้อย
crafter

1
นำสิ่งนี้ไปใช้กับ captcha หากส่งแบบฟอร์มเร็วเกินไปให้แสดง captcha เพื่อให้ผู้ใช้ของแท้ผ่านได้
Yashovardhan99

75

ที่จริงฉันพบว่าช่อง Honey Pot ธรรมดา ๆ ใช้งานได้ดี บอทส่วนใหญ่กรอกข้อมูลในทุกช่องแบบฟอร์มที่เห็นโดยหวังว่าจะได้รับการตรวจสอบความถูกต้องของฟิลด์ที่จำเป็น

http://haacked.com/archive/2007/09/11/honeypot-captcha.aspx

ถ้าคุณสร้างกล่องข้อความซ่อนมันไว้ใน javascript, แล้วตรวจสอบว่าค่าเป็นว่างเปล่าบนเซิร์ฟเวอร์วัชพืชออก 99% ของหุ่นยนต์ออกมีและไม่ก่อให้เกิด 99% ของผู้ใช้ของคุณใด ๆแห้วตลอด ส่วนที่เหลืออีก 1% ที่ปิดการใช้งานจาวาสคริปต์จะยังคงเห็นกล่องข้อความ แต่คุณสามารถเพิ่มข้อความเช่น "เว้นช่องนี้ว่างไว้" สำหรับกรณีดังกล่าวได้ (หากคุณสนใจเลย)

(นอกจากนี้โปรดสังเกตว่าถ้าคุณทำ style = "display: none" บนสนามมันง่ายเกินไปสำหรับหุ่นยนต์ที่จะมองเห็นสิ่งนั้นและทิ้งฟิลด์ซึ่งเป็นสาเหตุที่ฉันชอบวิธีการจาวาสคริปต์มากกว่า)


1
คุณคิดว่าบอทผ่านไฟล์ css จริงหรือไม่และคิดว่ามันแสดงผล: ไม่มี; เหรอ? ฉันไม่อยากใช้โซลูชันที่ใช้ JS เนื่องจากสามารถปิดใช้งานได้อย่างง่ายดาย
กัล

1
ดูเหมือนว่าจะเป็นโซลูชันเก่าสำหรับผู้ดูแลเว็บซึ่งรวมถึงคำสำคัญที่ไม่เกี่ยวข้องจำนวนมากเพื่อเพิ่มการจัดเว็บไซต์ ฉันคิดว่าโปรแกรมรวบรวมข้อมูลการค้นหาบอทของ Google สามารถคิดได้ว่ามันแสดงผล: ไม่มี ทำไมบอทอื่น ๆ ถึงไม่สามารถทำได้?
เกล็ดหิมะ

2
ตอนนี้ฉันใช้เทคนิคนี้กับสองไซต์ที่ได้รับการตอกและการสมัครบอทตอนนี้เป็นศูนย์ 0 ทั้งคู่ มันจะไม่ช่วยในการโจมตีแบบกำหนดเป้าหมาย แต่ส่วนใหญ่ก็แค่มองหาช่องโหว่หรือการสแปม
nirvdrum

25
จุดเล็ก ๆ ที่นี่: เพื่อหลีกเลี่ยงปัญหา JS เพียงใช้ CSS เพื่อวางตำแหน่งอินพุต honeypot ของคุณไว้เหนือส่วนบนของหน้า - วิธีนี้จะเป็นเรื่องปกติที่จะปิดการใช้งาน js และเพื่อหลีกเลี่ยงปัญหานี้บอทจะต้องสามารถแยกวิเคราะห์ CSS การวางตำแหน่งที่แน่นอนและตัดสินใจด้วยสามัญสำนึกว่าเป็นหม้อน้ำผึ้งหรือไม่ กันกระสุนอีกหน่อยด้วยวิธีนี้ :)
wholeNotLizards

3
@ alexy13 ใช่มันง่ายกว่า แต่ตามที่ระบุไว้ในคำตอบบอทจะคิดว่าคุณกำลังพยายามทำอะไรได้ง่ายกว่ามากเพียงทดสอบคุณสมบัติ CSS หนึ่งรายการ อย่างไรก็ตามหากคุณใช้กลยุทธ์การกำหนดตำแหน่งแบบสัมบูรณ์บอทจะต้องแยกวิเคราะห์กฎการวางตำแหน่งทั้งหมดของคุณและกฎของผู้ปกครองส่วนใหญ่ขององค์ประกอบเพื่อให้สามารถมองเห็นได้ว่าอินพุตจะมองเห็นได้หรือไม่จากนั้นจึงพิจารณาว่า หรือไม่ดำเนินการกับข้อมูลนั้นซึ่งทั้งหมดนี้เป็นปัญหามากกว่าที่จะคุ้มค่าสำหรับบอทส่วนใหญ่ (ถ้าไม่ใช่ทั้งหมด)
totalNotLizards

22

จะเกิดอะไรขึ้นถ้า -บอทไม่พบเลยform?

3 ตัวอย่าง:

  1. แทรกแบบฟอร์มของคุณโดยใช้ AJAX
  • หากคุณพอใจกับผู้ใช้ที่ปิดใช้งาน JS และไม่สามารถดู / ส่งแบบฟอร์มได้คุณสามารถแจ้งให้พวกเขาทราบและให้พวกเขาเปิดใช้งาน Javascript ก่อนโดยใช้คำสั่ง noscript:
<noscript>
  <p class="error">
    ERROR: The form could not be loaded. Please enable JavaScript in your browser to fully enjoy our services.
  </p>
</noscript>
  • สร้างform.htmlและวางของคุณformไว้ใน<div id="formContainer">องค์ประกอบ

  • ภายในหน้าที่คุณต้องการเรียกแบบฟอร์มนั้นให้ใช้ช่องว่าง<div id="dynamicForm"></div>และ jQuery นี้:$("#dynamicForm").load("form.html #formContainer");

  1. สร้างแบบฟอร์มของคุณทั้งหมดโดยใช้ JS

// THE FORM
var $form = $("<form/>", {
  appendTo : $("#formContainer"),
  class    : "myForm",
  submit   : AJAXSubmitForm
});

// EMAIL INPUT
$("<input/>",{
  name        : "Email", // Needed for serialization
  placeholder : "Your Email",
  appendTo    : $form,
  on          : {        // Yes, the jQuery's on() Method 
    input : function() {
      console.log( this.value );
    }
  }
});

// MESSAGE TEXTAREA
$("<textarea/>",{
  name        : "Message", // Needed for serialization
  placeholder : "Your message",
  appendTo    : $form
});

// SUBMIT BUTTON
$("<input/>",{
  type        : "submit",
  value       : "Send",
  name        : "submit",
  appendTo    : $form
});

function AJAXSubmitForm(event) {
  event.preventDefault(); // Prevent Default Form Submission
  // do AJAX instead:
  var serializedData = $(this).serialize();
  alert( serializedData );
  $.ajax({
    url: '/mail.php',
    type: "POST",
    data: serializedData,
    success: function (data) {
      // log the data sent back from PHP
      console.log( data );
    }
  });
}
.myForm input,
.myForm textarea{
  font: 14px/1 sans-serif;
  box-sizing: border-box;
  display:block;
  width:100%;
  padding: 8px;
  margin-bottom:12px;
}
.myForm textarea{
  resize: vertical;
  min-height: 120px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="formContainer"></div>

  1. อินพุตบอทเหยื่อ
  • บอทเช่น ( จริงๆชอบ) ทะลึ่งองค์ประกอบการป้อนข้อมูลที่ต้องการ:
<input 
  type="text"
  name="email"
  id="email"
  placeholder="Your email"
  autocomplete="nope"
  tabindex="-1"
They wll be happy to enter some value such as
`dsaZusil@kddGDHsj.com`
  • หลังจากใช้ HTML ข้างต้นแล้วคุณยังสามารถใช้ CSS เพื่อไม่แสดงอินพุตได้:
input[name=email]{ /* bait input */
  /* do not use display:none or visibility:hidden
     that will not fool the bot*/
  position:absolute;
  left:-2000px;
}
  • ตอนนี้ข้อมูลของคุณไม่สามารถมองเห็นได้สำหรับผู้ใช้ที่คาดหวังใน PHP ว่าคุณ$_POST["email"] ควรว่างเปล่า (ไม่มีค่าใด ๆ )! มิฉะนั้นอย่าส่งแบบฟอร์ม
  • สุดท้ายสิ่งที่คุณต้องทำคือการสร้างป้อนข้อมูลอื่นเช่น <input name="sender" type="text" placeholder="Your email"> หลัง (!) "บอเหยื่อ"การป้อนข้อมูลสำหรับที่อยู่อีเมลผู้ใช้จริง

กิตติกรรมประกาศ:

นักพัฒนาMozilla - การปิดแบบฟอร์มการเติมข้อความอัตโนมัติ
StackOverflow - ละเว้น Tabindex


7
เบราว์เซอร์ของผู้ใช้ที่ถูกต้องสามารถมองเห็นช่องป้อนเหยื่อเป็นช่องอีเมลและป้อนอัตโนมัติโดยอัตโนมัติเมื่อผู้ใช้เลือกที่จะป้อนข้อมูลในแบบฟอร์มที่เหลือโดยอัตโนมัติหรือไม่ ผู้ใช้จะไม่เห็นฟิลด์ที่อยู่ห่างจากหน้าจอเต็มไปหมดและพวกเขาก็ยังดูเหมือนบอท
wilbbe01

ฉันสงสัยว่าautocomplete=nopeจะเริ่มต้นเป็นon;-) MDN: input # attr-autocomplete
จัดการ

@ จัดการมันไม่สำคัญมันเป็นการป้อนเหยื่อบอท คุณสามารถเขียนautocomplete="oh sunny day"สำหรับเรื่องนั้น
Roko C.Buljan

20

สิ่งที่ฉันทำคือการใช้ฟิลด์ที่ซ่อนอยู่และใส่เวลาลงบนนั้นแล้วเปรียบเทียบกับการประทับเวลาบนเซิร์ฟเวอร์โดยใช้ PHP

หากเร็วกว่า 15 วินาที (ขึ้นอยู่กับว่าฟอร์มของคุณใหญ่หรือเล็ก) นั่นคือบอท

หวังว่าจะช่วยได้


1
อย่างไรก็ตามความคิดที่ดีฉันตั้งค่าขีด จำกัด ไว้ที่ประมาณ 3 ถึง 5 วินาทีเพื่อให้ผู้ใช้ที่รวดเร็ว / มีประสิทธิภาพ ฉันใช้วิธีการเดียวกันนี้และตั้งค่าขีด จำกัด ในแบบฟอร์มของฉันเป็น 3 วินาทีกรองบ็อตออกไป 99%
Kayla

@adnhack คุณหมายถึง: 1) ในการโหลดหน้าเว็บด้วย php รับเวลาเซิร์ฟเวอร์และสร้างเซสชัน 2) ผู้ใช้หรือบอทกรอกแบบฟอร์มคลิกส่งพร้อม$.postส่งทั้งหมดไปยังไฟล์ php ภายนอก 3) ใน php ภายนอกรับเวลาเซิร์ฟเวอร์อีกครั้งและเปรียบเทียบกับเวลาเซสชัน?
Andris

16

วิธีที่มีประสิทธิภาพมากในการกำจัดสแปมคือการมีช่องข้อความที่มีข้อความอยู่ในนั้นเช่น "ลบข้อความนี้เพื่อส่งแบบฟอร์ม!" และข้อความนั้นจะต้องถูกลบออกเพื่อส่งแบบฟอร์ม

ในการตรวจสอบความถูกต้องของแบบฟอร์มหากช่องข้อความมีข้อความต้นฉบับหรือข้อความสุ่มสำหรับกรณีนั้นอย่าส่งแบบฟอร์ม บอทสามารถอ่านชื่อแบบฟอร์มและกรอกข้อมูลในช่องชื่อและอีเมลโดยอัตโนมัติ แต่ไม่ทราบว่าต้องลบข้อความออกจากช่องใดช่องหนึ่งเพื่อส่งจริงหรือไม่

ฉันใช้วิธีนี้ในเว็บไซต์ของ บริษัท และกำจัดสแปมที่เราได้รับในแต่ละวันโดยสิ้นเชิง ได้ผลจริง!


ที่น่าสนใจคุณรู้หรือไม่ว่ามันมีประสิทธิภาพมากกว่าคำตอบอื่น ๆ ... กล่องข้อความที่ซ่อนอยู่หรือติดตามเวลาที่ใช้ในการกรอกแบบฟอร์ม?
Austin Henley

4
นอกจากนี้ยังจะจับผู้ใช้ที่ไม่สามารถปฏิบัติตามคำแนะนำซึ่งอาจไม่ต้องการ
wilbbe01

ฉันชอบสิ่งนี้! จนกว่าบอทจะเริ่มลองใช้ช่องว่างและช่องกรอกข้อมูลผสมกัน ... วิธีที่ดีที่สุดในการทดสอบคือใช้สิ่งนี้และสแกนด้วยหนึ่งในนี้: sectoolmarket.com/…
nmit026

มีผลจนถึงขณะที่ผู้ที่จัดการบอทไม่พบและปรับแต่งโค้ด
Talha Awan

11

วิธีการสร้างช่องป้อนข้อความให้มีสีเดียวกับพื้นหลังซึ่งจะต้องว่างเปล่า วิธีนี้จะช่วยแก้ปัญหาการแสดงผลการอ่านบอท: ไม่มี


2
เพิ่มสิ่งนี้เป็นความคิดเห็นเมื่อคุณได้รับชื่อเสียงมากขึ้นแทนที่จะเป็นคำตอบ;)
Rob

3
สิ่งนี้นำเสนอปัญหาการเข้าถึง ดัชนี honeypot จะไม่ถูกซ่อนจากผู้ใช้ที่มีโปรแกรมอ่านหน้าจอ
Otterfan

5
ฉันเป็นผู้ใช้ที่ตาบอดและพบช่องแบบฟอร์มนี้หนึ่งครั้งและป้ายกำกับด้านบนอ่านว่า "หากคุณสามารถเห็นสิ่งนี้ให้เว้นว่างไว้" IMO ที่มีประสิทธิภาพมาก
Parham Doustdar

8

http://recaptcha.net/

reCAPTCHA เป็นบริการแอนติบอดีฟรีที่ช่วยให้หนังสือเป็นดิจิทัล

Google ได้รับการสนับสนุน (ในปี 2009):

ดูด้วย


5
ในฐานะผู้ใช้ฉันพบว่า recaptcha ยากที่จะเข้าใจบ่อยครั้ง บางคำอ่านยากมากจนต้องลอง 3 หรือ 4 ครั้ง แม้ว่าสิ่งนี้จะช่วยแก้ปัญหาหุ่นยนต์ได้อย่างแน่นอน
Brian

สิ่งที่ Brian พูดและ: yro.slashdot.org/story/10/03/02/0135238/…
SF

ฉันพบตัวเองในหน้านี้เนื่องจาก CAPTCHA / reCAPTCHA ไม่ได้หยุดการส่งแบบฟอร์มบอท นี่คือ 5 ปีต่อมาและเป็นเทคนิคใหม่กว่าที่จะได้รับคำตอบนี้
JohnnyFaldo

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

วันนี้ recaptcha เริ่มต้นจากการทำเครื่องหมายง่ายๆบางทีมันอาจจะไม่เจ็บปวดอย่างที่เคยเป็น? ...
rogerdpack

6

สแปมบอทจำนวนมากเป็นเพียงสคริปต์ฝั่งเซิร์ฟเวอร์ที่รุกล้ำเว็บ คุณสามารถต่อสู้กับพวกมันจำนวนมากได้โดยใช้จาวาสคริปต์เพื่อจัดการกับคำขอแบบฟอร์มก่อนที่จะส่ง (เช่นการตั้งค่าฟิลด์เพิ่มเติมตามตัวแปรไคลเอ็นต์บางตัว) นี่ไม่ใช่วิธีแก้ปัญหาที่สมบูรณ์และอาจนำไปสู่ปัญหามากมาย (เช่นผู้ใช้ที่ไม่มีจาวาสคริปต์บนอุปกรณ์มือถือ ฯลฯ ) แต่อาจเป็นส่วนหนึ่งของแผนการโจมตีของคุณ

นี่คือตัวอย่างเล็กน้อย ...

<script>
function checkForm()
{
    // When a user submits the form, the secretField's value is changed
    $('input[name=secretField]').val('goodValueEqualsGoodClient');

    return true;
}
</script>

<form id="cheese" onsubmit="checkForm">
<input type="text" name="burger">

<!-- Check that this value isn't the default value in your php script -->
<input type="hidden" name="secretField" value="badValueEqualsBadClient">

<input type="submit">
</form>

ที่ไหนสักแห่งในสคริปต์ php ของคุณ ...

<?php

if ($_REQUEST['secretField'] != 'goodValueEqualsGoodClient')
{
    die('you are a bad client, go away pls.');
}

?>

นอกจากนี้ captchas ยังยอดเยี่ยมและป้องกันสแปมได้ดีที่สุด


ขอบคุณแม้ว่าจาวาสคริปต์จะสามารถปิดการใช้งานได้อย่างง่ายดายในทุกเบราว์เซอร์ แต่ก็ทำลาย "กลไกการป้องกันสแปม" ของฉันดังนั้นฉันจึงมองหาสิ่งที่เป็นสากลมากขึ้น
Gal

ฉันอาจจะผิด แต่สิ่งนี้จะไม่บอกผู้ใช้ที่ปิดการใช้งาน JS ทุกคนว่า 'คุณเป็นลูกค้าที่ไม่ดีโปรดไปให้พ้น'?
Gal

Gal เป็นตัวอย่างที่ไม่สำคัญเพียงแค่แสดงให้เห็นถึงวิธีการตรวจสอบความถูกต้องกับ var ที่กำหนดโดย js ฝั่งไคลเอ็นต์
John Himmelman

@John Himmelman Captchas สามารถแก้ไขได้และไม่จำเป็นต้องเป็นการป้องกันสแปมที่ดีที่สุด มีบริการแบบ pay-for-services เช่นanti-captcha.comที่จะแก้ปัญหาแบบฟอร์ม captchas โดยมีค่าธรรมเนียมต่ำ

ปัญหาของแนวทางนี้คือฉันได้เห็นบอทจำนวนมากที่ใช้ PhantomJS สิ่งนี้จะช่วยให้พวกเขาผ่านพ้นไปได้
Parham Doustdar

4

ฉันแปลกใจที่ยังไม่มีใครพูดถึงวิธีนี้:

  • ในหน้าของคุณให้ใส่รูปภาพขนาดเล็กที่ซ่อนอยู่
  • วางคุกกี้เมื่อแสดงภาพนี้
  • เมื่อดำเนินการส่งแบบฟอร์มให้ตรวจสอบคุกกี้


ข้อดี:

  • สะดวกสำหรับผู้ใช้และนักพัฒนา
  • ดูเหมือนจะน่าเชื่อถือ
  • ไม่มี JavaScript

จุดด้อย:

  • เพิ่มคำขอ HTTP หนึ่งรายการ
  • ต้องเปิดใช้งานคุกกี้บนไคลเอนต์


ยกตัวอย่างเช่นวิธีการนี้ถูกนำมาใช้โดย WordPress ปลั๊กอินคุกกี้สำหรับความคิดเห็น


บอทที่ใช้ของอย่าง PhantomJS จะไม่สามารถหลีกเลี่ยงสิ่งนี้ได้อย่างง่ายดาย?
Parham Doustdar

1
เนื่องจากเป็นเครื่องมือเบราว์เซอร์เต็มรูปแบบจึงโหลดเนื้อหาและสิ่งนี้จึงควรเป็นไปได้ ถึงกระนั้นฉันก็ไม่แน่ใจว่ามันมักจะถูกใช้สำหรับสแปมบอทเนื่องจากมันอาจจะช้ากว่าสคริปต์ cURL มาก
Gras Double

เหตุผลใดที่จะดีกว่าโทเค็น CSRF?
xenoterracide

1
โทเค็น CSRF จะไม่หยุดบอทเลย คำขอแรกรับแบบฟอร์มซึ่งรวมถึงโทเค็น คำขอที่ 2 โพสต์แบบฟอร์มรวมทั้งโทเค็น
Gras Double

4

ด้วยการเกิดขึ้นของเบราว์เซอร์ที่ไม่มีหัว (เช่น phantomjs) ซึ่งสามารถเลียนแบบอะไรก็ได้คุณไม่สามารถคิดได้ว่า:

  • สแปมบอทไม่ใช้จาวาสคริปต์
  • คุณสามารถติดตามเหตุการณ์ของเมาส์เพื่อตรวจจับบอท
  • พวกเขาจะไม่เห็นว่าฟิลด์ถูกซ่อนไว้ด้วยสายตา
  • พวกเขาจะไม่รอเวลาที่กำหนดก่อนที่จะส่ง

หากสิ่งนั้นเคยเป็นจริงมันก็ไม่เป็นความจริงอีกต่อไป

หากคุณไม่ต้องการโซลูชันที่เป็นมิตรกับผู้ใช้เพียงแค่ให้ปุ่มส่ง"ฉันเป็นสแปมเมอร์" ที่สวยงาม :

 <input type="submit" name="ignore" value="I am a spammer!" />
 <input type="image" name="accept" value="submit.png" alt="I am not a spammer" />

แน่นอนว่าคุณสามารถเล่นด้วยinput[type=image]ปุ่มรูปภาพสองปุ่มเปลี่ยนลำดับหลังจากโหลดแต่ละครั้งทางเลือกข้อความเนื้อหาของรูปภาพ (และขนาด) หรือnameปุ่มต่างๆ ซึ่งจะต้องใช้งานเซิร์ฟเวอร์บางอย่าง

 <input type="image" name="random125454548" value="random125454548.png"
      alt="I perfectly understand that clicking on this link will send the
      e-mail to the expected person" />
 <input type="image" name="random125452548" value="random125452548.png"
      alt="I really want to cancel the submission of this form" />

ด้วยเหตุผลด้านความสามารถในการเข้าถึงคุณต้องใส่ตัวเลือกข้อความที่ถูกต้อง แต่ฉันคิดว่าประโยคยาว ๆ จะดีกว่าสำหรับผู้ใช้โปรแกรมอ่านหน้าจอมากกว่าที่จะถูกมองว่าเป็นบอท

หมายเหตุเพิ่มเติม: ตัวอย่างเหล่านี้แสดงให้เห็นว่าการเข้าใจภาษาอังกฤษ (หรือภาษาใด ๆ ) และการต้องเลือกง่ายๆนั้นยากกว่าสำหรับสแปมบอท: รอ 10 วินาทีจัดการ CSS หรือจาวาสคริปต์โดยรู้ว่าฟิลด์ถูกซ่อนเลียนแบบการเคลื่อนเมาส์หรือ เลียนแบบการพิมพ์แป้นพิมพ์ ...


สำหรับฉันแล้วดูเหมือนว่าการที่คุณต้องใส่ข้อความสำรองหมายความว่าโซลูชันรูปภาพทั้งสองของคุณมีความอ่อนไหวต่อการเขียนสคริปต์เหมือนกับทางเลือกอื่น ๆ และสำหรับปุ่ม "ฉันไม่ใช่สแปมเมอร์" นั่นก็ไม่สามารถเขียนสคริปต์ได้เช่นกัน
Hawkeye

@Hawkeye คำตอบของฉันคือเบราว์เซอร์ที่ไม่มีหัวสามารถเลียนแบบอะไรก็ได้ : จาวาสคริปต์, ความล่าช้า, การเลื่อนเมาส์, ช่องที่ซ่อนอยู่, ... คำว่า "สวยงาม" ก่อนที่ตัวอย่างของฉันจะเป็นแบบ "ประชดประชัน" แต่ตัวอย่างเหล่านั้นแสดงให้เห็นว่าการเข้าใจภาษาอังกฤษและต้องตัดสินใจเลือกง่ายๆนั้นยากกว่าสำหรับสแปมบอท: รอ 10 วินาทีจัดการ CSS หรือจาวาสคริปต์โดยรู้ว่ามีฟิลด์ซ่อนอยู่เลียนแบบการเคลื่อนเมาส์หรือเลียนแบบการพิมพ์แป้นพิมพ์ ...
อดัม

ฉันเห็นประเด็นของคุณแล้ว อาจเพิ่มข้อความสุดท้าย "แต่ตัวอย่างเหล่านั้นแสดง ... " ฯลฯ ในคำตอบของคุณ เพราะนั่นช่วยให้ฉันเข้าใจว่าคุณหมายถึงอะไร ในตอนแรกดูเหมือนว่าตัวเองจะขัดแย้งกับข้อโต้แย้งที่ว่า "เราไม่สามารถถือว่าบอททำไม่ได้ ... " แต่จากนั้นก็ทำรายการสิ่งที่เรายังไม่สามารถถือว่าบอททำไม่ได้ แต่ประเด็นสำคัญของคุณคือตัวอย่างของคุณ (ต้องเลือกปุ่มส่ง) นั้นยากกว่า - ซึ่ง (ตอนนี้ฉันเข้าใจแล้ว) เป็นคำตอบที่ยอดเยี่ยม +1
Hawkeye

3

วิธีที่ง่ายมากคือการระบุบางฟิลด์เช่น <textarea style="display:none;" name="input"></textarea>และละทิ้งคำตอบทั้งหมดที่กรอกข้อมูลนี้

อีกวิธีหนึ่งคือการสร้างแบบฟอร์มทั้งหมด (หรือเพียงแค่ชื่อฟิลด์) โดยใช้ Javascript บอทไม่กี่ตัวสามารถเรียกใช้งานได้

อย่างไรก็ตามคุณจะไม่ทำอะไรมากกับ "บอท" สดจากไต้หวันหรืออินเดียที่จ่าย 0.03 เหรียญสหรัฐต่อหนึ่งลิงก์ที่โพสต์และใช้ชีวิตแบบนั้น


2
ฉันรู้ว่าคำตอบนี้มีอายุเกือบ 7 ปี แต่ฉันรู้สึกว่ามันคุ้มค่าที่จะแสดงความคิดเห็น บอทจำนวนมากสามารถตั้งโปรแกรมให้ละเว้นฟิลด์ด้วย style = "display: none" เพื่อหลีกเลี่ยงการป้องกันประเภทนี้
Kenny Johnson

มีหลายวิธีในการปิดบังอินพุตโดยใช้ Javascript แสดงองค์ประกอบจำลองที่ด้านบนย้ายองค์ประกอบเหล่านั้นออกจากพื้นที่ที่มองเห็นจัดแต่งทรงผมให้กลมกลืนกับพื้นหลังหรือการตกแต่งเค้าโครงอย่างสมบูรณ์แบบเป็นต้นการสุ่ม (แฮช) ป้อนชื่อ (และรักษาการทำแผนที่ of hashed => original ในฝั่งเซิร์ฟเวอร์เซสชัน) จะช่วยในการใช้ชื่อเป็นคำใบ้และทำแผนที่ด้วยตนเองว่าอินพุตใดถูกต้อง ไม่ว่าจะไม่มีการป้องกันสแปมด้วยตนเอง
SF.

2

ฉันมีวิธีง่ายๆในการหยุดนักส่งสแปมซึ่งได้ผล 100% อย่างน้อยก็จากประสบการณ์ของฉันและหลีกเลี่ยงการใช้ reCAPTCHA และวิธีการที่คล้ายกัน ฉันเปลี่ยนจากเกือบ 100 สแปมต่อวันในรูปแบบ html ของไซต์ของฉันเป็นศูนย์ในช่วง 5 ปีที่ผ่านมาหลังจากที่ฉันใช้แนวทางนี้

มันทำงานโดยใช้ประโยชน์จากความสามารถของอีเมล ALIAS ของสคริปต์การจัดการฟอร์ม html ส่วนใหญ่ (ฉันใช้ FormMail.pl) พร้อมกับ "โค้ด" ที่ส่งแบบกราฟิกซึ่งสร้างขึ้นได้อย่างง่ายดายในโปรแกรมกราฟิกที่เรียบง่ายที่สุด กราฟิกดังกล่าวมีรหัส M19P17nH และข้อความแจ้ง "โปรดป้อนรหัสทางซ้าย"

ตัวอย่างนี้ใช้ลำดับตัวอักษรและตัวเลขแบบสุ่ม แต่ฉันมักจะใช้คำที่ไม่ใช่ภาษาอังกฤษที่ผู้เยี่ยมชมคุ้นเคย (เช่น "pnofrtay") โปรดสังเกตว่าพร้อมต์สำหรับฟิลด์ฟอร์มถูกสร้างขึ้นในกราฟิกแทนที่จะปรากฏบนฟอร์ม ดังนั้นสำหรับหุ่นยนต์ฟิลด์ในรูปแบบนั้นจึงไม่มีเงื่อนงำเกี่ยวกับวัตถุประสงค์ของมัน

เคล็ดลับเดียวที่แท้จริงคือตรวจสอบให้แน่ใจว่า html แบบฟอร์มของคุณกำหนดรหัสนี้ให้กับตัวแปร "ผู้รับ" จากนั้นในโปรแกรมเมลของคุณตรวจสอบให้แน่ใจว่าแต่ละรหัสที่คุณใช้นั้นถูกตั้งค่าเป็นนามแฝงอีเมลซึ่งชี้ไปที่ที่อยู่อีเมลที่คุณต้องการใช้ เนื่องจากไม่มีการแจ้งเตือนใด ๆ บนแบบฟอร์มให้หุ่นยนต์อ่านและไม่มีที่อยู่อีเมลจึงไม่มีความคิดที่จะใส่ลงในช่องฟอร์มว่าง หากไม่ใส่อะไรลงในช่องแบบฟอร์มหรือสิ่งใด ๆ ยกเว้นรหัสที่ยอมรับได้การส่งแบบฟอร์มจะล้มเหลวโดยมีข้อผิดพลาด "ผู้รับไม่ดี" คุณสามารถใช้กราฟิกอื่นในรูปแบบต่างๆได้แม้ว่าประสบการณ์ของฉันจะไม่จำเป็นจริงๆ

แน่นอนว่ามนุษย์สามารถแก้ปัญหานี้ได้ในพริบตาโดยไม่มีปัญหาทั้งหมดที่เกี่ยวข้องกับ reCAPTCHA และรูปแบบที่คล้ายกันหรูหรากว่า หากผู้ส่งสแปมที่เป็นมนุษย์ตอบสนองต่อความล้มเหลวของผู้รับและตั้งโปรแกรมรหัสภาพลงในหุ่นยนต์คุณสามารถเปลี่ยนได้อย่างง่ายดายเมื่อคุณทราบว่าหุ่นยนต์ได้รับการเข้ารหัสอย่างหนักเพื่อตอบสนอง ในห้าปีของการใช้แนวทางนี้ฉันไม่เคยมีสแปมจากรูปแบบใด ๆ ที่ฉันใช้และฉันไม่เคยได้รับการร้องเรียนจากผู้ใช้แบบฟอร์มใด ๆ ฉันมั่นใจว่าสิ่งนี้สามารถเอาชนะได้ด้วยความสามารถ OCR ในหุ่นยนต์ แต่ฉันไม่เคยเกิดขึ้นในไซต์ใด ๆ ของฉันที่ใช้รูปแบบ html ฉันยังใช้ "กับดักสแปม" (โค้ด html "มาที่นี่" ที่ซ่อนอยู่ซึ่งชี้ไปที่นโยบายต่อต้านสแปมของฉัน) เพื่อให้ได้ผลดี แต่มีผลเพียงประมาณ 90% เท่านั้น


1

ฉันคิดถึงหลาย ๆ อย่างที่นี่:

  1. โดยใช้ JS (แม้ว่าคุณจะไม่ต้องการก็ตาม) เพื่อติดตามการเลื่อนเมาส์กดปุ่มคลิกเมาส์
  2. รับ url อ้างอิง (ซึ่งในกรณีนี้ควรเป็นหนึ่งจากโดเมนเดียวกัน) ... ผู้ใช้ปกติจะต้องเข้าไปในเว็บไซต์ก่อนถึงแบบฟอร์มติดต่อ: PHP: จะรับ URL ผู้อ้างอิงได้อย่างไร?
  3. โดยใช้ตัวแปร $ _SESSION เพื่อรับ IP และตรวจสอบแบบฟอร์มส่งเทียบกับรายการ IP นั้น
  4. กรอกข้อมูลในช่องข้อความเดียวด้วยข้อความจำลองที่คุณสามารถตรวจสอบได้ทางฝั่งเซิร์ฟเวอร์ว่ามีการเขียนทับหรือไม่
  5. ตรวจสอบเวอร์ชันของเบราว์เซอร์: http://chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php.html ... เป็นที่ชัดเจนว่าบอทจะไม่ใช้เบราว์เซอร์ แต่เป็นเพียงสคริปต์ .
  6. ใช้ AJAX เพื่อส่งฟิลด์ทีละช่องและตรวจสอบความแตกต่างของเวลาระหว่างการส่ง
  7. ใช้หน้าปลอมก่อน / หลังแบบฟอร์มเพียงเพื่อส่งข้อมูลเข้าอื่น

คุณช่วยอธิบายขั้นตอนเหล่านี้ให้ละเอียดได้ไหม valicu2000 ยังใช้ได้ในปี 2020 หรือไม่ ขอบคุณ.
Michael Moriarty

0

อีกทางเลือกหนึ่งแทนที่จะใช้ตัวอักษรและตัวเลขแบบสุ่มเหมือนหลาย ๆ เว็บไซต์คือการสุ่มรูปภาพของวัตถุที่เป็นที่รู้จัก จากนั้นขอให้ผู้ใช้พิมพ์ว่าสีอะไรในภาพหรือวัตถุนั้นคืออะไร

สรุปแล้วทุกวิธีการแก้ปัญหาจะมีข้อดีและข้อเสีย คุณจะต้องหาค่ากลางที่มีความสุขระหว่างยากเกินไปสำหรับผู้ใช้ที่จะผ่านกลไกการป้องกันสแปมและจำนวนสแปมบอทที่สามารถผ่านได้


ความคิดที่ดี. ฉันจะไม่ใช้สีเป็นเกณฑ์เนื่องจากอาจยกเว้นผู้ใช้ที่ตาบอดสี
Neil Aitken

ใช่จุดที่ดี จริงๆแล้วปัญหาเกี่ยวกับรูปภาพโดยทั่วไปคือไม่สามารถเข้าถึงได้และด้วยการทำให้ "เข้าถึงได้" ด้วยแท็ก alt ทำให้โรบ็อตสามารถคิดออกได้อย่างง่ายดาย
Brian

รูปภาพเป็นความคิดที่ไม่ดีเสมอ ... อ่านข้อความแทบไม่ได้ฉันประสบปัญหานี้กับเว็บไซต์อื่น
valicu2000

นี่เป็นเพียงแคปต์ชาที่มีการบิดเล็กน้อยซึ่งทำให้ผู้ใช้ยากขึ้น นอกจากนี้ยังไม่สามารถเข้าถึงได้เลย
Mihai P.

0

โรบ็อตไม่สามารถเรียกใช้งาน JavaScript ได้ดังนั้นคุณจึงต้องทำบางอย่างเช่นการฉีดองค์ประกอบที่ซ่อนอยู่ในหน้าด้วย JavaScript จากนั้นตรวจพบว่ามีอยู่ก่อนที่จะส่งแบบฟอร์ม แต่ระวังเพราะผู้ใช้บางรายของคุณจะปิดใช้งาน JavaScript ด้วย

มิฉะนั้นฉันคิดว่าคุณจะถูกบังคับให้ใช้แบบฟอร์มการพิสูจน์ "ความเป็นมนุษย์" ของลูกค้า


4
หุ่นยนต์อัจฉริยะสามารถเรียกใช้จาวาสคริปต์ได้ การใช้โซลูชันจาวาสคริปต์จะทำให้คุณบล็อกหุ่นยนต์ได้ 99%
Ben Scheirman

หากบอทเป็นปลั๊กอินของเบราว์เซอร์มันจะสามารถเรียกใช้งานจาวาสคริปต์และดูสิ่งที่ผู้ใช้เห็นได้ (แม้ว่าคุณจะทำแฟลชหรือเรนเดอร์ webgl อยู่ก็ตาม)
CoffeDeveloper

เพียงใช้ CSS เพื่อวางช่องข้อความเหนือหน้าหากคุณกังวลเกี่ยวกับคนที่ปิดการใช้งาน JavaScript
Chewie The Chorkie

0

ทางออกที่ดีที่สุดที่ฉันพบเพื่อหลีกเลี่ยงไม่ให้บอทโดนสแปมคือการใช้คำถามหรือฟิลด์ที่ไม่สำคัญมากในแบบฟอร์มของคุณ

ลองเพิ่มฟิลด์ดังนี้:

  • คัดลอก "สวัสดี" ในช่องข้างๆ
  • 1 + 1 =?
  • คัดลอกชื่อเว็บไซต์ในช่อง

เทคนิคเหล่านี้ต้องการให้ผู้ใช้เข้าใจสิ่งที่ต้องป้อนลงในแบบฟอร์มจึงทำให้การเป็นเป้าหมายของการกรอกฟอร์มบอทขนาดใหญ่ทำได้ยากขึ้น

แก้ไข

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


ในฐานะผู้ใช้ฉันเกลียดเรื่องไร้สาระ ฉันได้รับว่าสแปมเป็นปัญหา แต่ปัญหาของฉันในฐานะผู้ใช้ไซต์เป็นอย่างไร สแปมความคิดเห็นเป็นปัญหาสำหรับเจ้าของไซต์ดังนั้นผู้ใช้จึงไม่ควรรับภาระในการป้องกัน หากคุณเดินเข้าไปในร้านค้าและถูกขอให้ใส่รองเท้าป้องกันไว้เหนือรองเท้าของคุณเพราะพวกเขาไม่ต้องการซับความคิดของคุณจะเป็นอย่างไร? ใช้เวลาเพียงไม่กี่วินาที แต่ไม่ใช่ภาระของคุณที่ต้องแบกรับ
Mike

สแปม @Miki ทำให้เจ้าของไซต์เสียเวลา เวลาคือเงินสิ่งที่ฉันขายจะแพงกว่าสำหรับคุณ อาร์กิวเมนต์ของคุณสามารถใช้เพื่อบอกว่า "ฉันไม่สนใจว่าคุณต้องจ่ายค่าเช่าฉันต้องการจ่ายต้นทุนการผลิต + 1 $ คุณจ่ายค่าเช่าปัญหาของฉันได้อย่างไร" เมื่อคุณซื้อของที่คุณจ่ายสำหรับการโฮสต์การขนส่งเวลาและอื่น ๆ
Mihai P.

@ ไมค์ - เป็นปัญหาของคุณเพราะคุณต้องการให้แบบฟอร์มใช้งานได้ (เห็นได้ชัดว่าคุณกำลังใช้งานอยู่) เครื่องจักรพบแม้แต่ไซต์ที่คลุมเครือที่สุดและจะส่งสแปมการส่งต่อวันเป็นหมื่นครั้งทำให้แบบฟอร์มเหล่านั้นใช้ไม่ได้ ครั้งต่อไปที่คุณส่งคำถามถึงธุรกิจขนาดเล็กโดยใช้แบบฟอร์มบนเว็บไซต์ของพวกเขาและคุณต้องเพิ่ม 9 + 3 จึงจะทำได้ ... แล้วถามตัวเองว่า "ทำไมฉันต้องทำสิ่งนี้" คำตอบของคุณอาจเป็น "เพราะจริงๆแล้วฉันต้องการคำตอบสำหรับคำถามของฉัน"
Jimbo Jonny

@JimboJonny คุณพลาดจุดของฉันไปแล้ว สแปมเป็นปัญหา (เช่นที่ฉันระบุไว้) แต่มีหลายวิธีในการจัดการกับปัญหานี้ในแบ็กเอนด์ที่ไม่ทำให้ประสบการณ์ของผู้ใช้เสียไป ขณะนี้ฉันมีแบบฟอร์มการติดต่อที่ใช้งานบนเว็บไซต์หลายสิบ (หลายร้อยแม้) และสแปมมีน้อยที่สุด (เดือนละไม่กี่ข้อความสแปมต่อแบบ) เนื่องจากฉันได้จัดการกับสแปมโดยใช้โปรแกรมไม่ใช่ด้วยการทำให้ผู้ใช้กระโดดข้ามห่วง ประเด็นของฉันไม่ใช่ว่าสแปมไม่ใช่ปัญหา มันเป็นปัญหา ประเด็นของฉันคือมีหลายวิธีในการจัดการกับปัญหานี้โดยไม่ทำให้ประสบการณ์ของผู้ใช้แย่ลง
Mike

@JimboJonny Case ตรงประเด็นให้ดูที่คำตอบที่ได้รับการจัดอันดับสูงสุด (และเป็นที่ยอมรับ) สำหรับคำถามนี้ ไม่มีส่วนเกี่ยวข้องกับการป้อนข้อมูลของผู้ใช้ใด ๆ นั่นเป็นวิธีที่ควรลดการสแปม
Mike

0

มีการกวดวิชาเกี่ยวกับเรื่องนี้ในไซต์ JQuery แม้ว่าจะเป็น JQuery แต่ความคิดนั้นเป็นกรอบที่ไม่ขึ้นต่อกัน

หากไม่มี JavaScript คุณอาจต้องถอยกลับไปใช้วิธีการประเภท CAPTCHA


0

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


0

มันเป็นเพียงความคิด id ใช้ในแอปพลิเคชันของฉันและทำงานได้ดี

คุณสามารถสร้างคุกกี้บนการเคลื่อนไหวของเมาส์ด้วย javascript หรือ jquery และในฝั่งเซิร์ฟเวอร์ให้ตรวจสอบว่ามีคุกกี้หรือไม่เนื่องจากมีเพียงมนุษย์เท่านั้นที่มีเมาส์คุกกี้สามารถสร้างได้โดยคุกกี้เท่านั้นที่สามารถประทับเวลาหรือโทเค็นที่สามารถตรวจสอบได้


ไอเดียน่าสนใจ! คุณเคยใช้สิ่งนี้ในโลกแห่งความเป็นจริงหรือไม่?
skybondsor

มันจะไม่ทำงาน ทุกวันนี้นักส่งสแปมกำลังใช้ซอฟต์แวร์ที่ทำงานในเบราว์เซอร์ ดังนั้นพวกเขาจึงสามารถเลียนแบบประสบการณ์ของผู้ใช้ที่สร้างคุกกี้แล้วเรียกใช้ x จำนวนครั้งโดยใช้เนื้อหาที่แตกต่างกันซึ่งสร้างโดยซอฟต์แวร์
Norbert Norbertson

สิ่งนี้จะไม่ได้ผลหากผู้ใช้ไม่ได้ใช้เมาส์ หากฟอร์มของคุณได้รับการตั้งค่าอย่างถูกต้องผู้ใช้ควรจะสามารถกรอกแบบฟอร์มทั้งหมดโดยใช้แป้นพิมพ์ของพวกเขา คุณสามารถแท็บไปยังฟิลด์ถัดไปใช้สเปซบาร์เพื่อเลือกปุ่มตัวเลือกและใช้สเปซบาร์ (หรือป้อน) เมื่อคุณแท็บลงบนปุ่มส่ง
Kenny Johnson

0

ใช้ 1) แบบฟอร์มกับโทเค็น 2) ตรวจสอบฟอร์มเพื่อสร้างความล่าช้าด้วยที่อยู่ IP 3) บล็อก IP (ไม่บังคับ)


0

จากประสบการณ์ของฉันหากแบบฟอร์มเป็นเพียงแบบฟอร์ม "ติดต่อ" คุณไม่จำเป็นต้องมีมาตรการพิเศษ สแปมได้รับการกรองอย่างเหมาะสมโดยบริการเว็บเมล (คุณสามารถติดตามคำขอเว็บฟอร์มผ่านสคริปต์เซิร์ฟเวอร์เพื่อดูว่าอะไรเข้าถึงอีเมลของคุณได้อย่างมีประสิทธิภาพแน่นอนฉันถือว่าคุณมีบริการเว็บเมลที่ดี: D)

Btw ฉันพยายามที่จะไม่พึ่งพาเซสชันนี้ (เช่นการนับจำนวนครั้งที่มีการคลิกปุ่มเพื่อป้องกันการโอเวอร์โหลด)

ฉันไม่คิดว่านั่นจะดี แต่สิ่งที่ฉันต้องการบรรลุคือการได้รับอีเมลจากผู้ใช้ที่ดำเนินการบางอย่างเนื่องจากเป็นผู้ใช้ที่ฉันสนใจ (เช่นผู้ใช้ที่ดูหน้า "CV" และใช้ข้อมูลติดต่อที่เหมาะสม แบบฟอร์ม). ดังนั้นหากผู้ใช้ทำบางอย่างที่ฉันต้องการฉันจะเริ่มติดตามเซสชันและตั้งค่าคุกกี้ (ฉันตั้งค่าคุกกี้เซสชันเสมอ แต่เมื่อฉันไม่เริ่มเซสชันมันเป็นเพียงคุกกี้ปลอมที่สร้างขึ้นเพื่อให้เชื่อว่าผู้ใช้มีเซสชัน) หากผู้ใช้ทำสิ่งที่ไม่ต้องการฉันไม่ต้องกังวลกับการเก็บเซสชันสำหรับเขาดังนั้นจึงไม่มีการโอเวอร์โหลดเป็นต้น

นอกจากนี้ยังเป็นการดีสำหรับฉันที่บริการโฆษณาเสนอ API บางประเภท (อาจจะมีอยู่แล้ว) เพื่อดูว่าผู้ใช้ "ดูโฆษณา" หรือไม่มีแนวโน้มว่าผู้ใช้ที่ดูโฆษณาเป็นผู้ใช้จริง แต่หากไม่ใช่ ดีจริงอย่างน้อยคุณจะได้รับ 1 วิวอย่างไรก็ตามไม่มีอะไรสูญเสีย (และเชื่อฉันเถอะการควบคุมโฆษณามีความซับซ้อนมากกว่าสิ่งใด ๆ ที่คุณสามารถทำได้เพียงลำพัง)


0

จริงๆแล้วกับดักพร้อมจอแสดงผล: ไม่มีใครทำงานเหมือนเสน่ห์ ช่วยในการย้ายการประกาศ CSS ไปยังไฟล์ที่มีสไตล์ชีตส่วนกลางซึ่งจะบังคับให้สแปมบอทโหลดสิ่งเหล่านั้นด้วยเช่นกัน (การประกาศโดยตรงstyle = "display: none;"สแปมบอทอาจตีความได้เช่นกัน การประกาศรูปแบบท้องถิ่นภายในเอกสารเอง)

สิ่งนี้รวมกับมาตรการตอบโต้อื่น ๆ ควรทำให้บอทสแปมสามารถยกเลิกการโหลดขยะของพวกเขาได้ (ฉันมีสมุดเยี่ยมที่ปลอดภัยด้วยมาตรการที่หลากหลายและจนถึงตอนนี้พวกเขาก็ตกหลุมพรางหลักของฉัน - อย่างไรก็ตามหากบอทใด ๆ ข้ามสิ่งเหล่านั้นไปที่นั่น คนอื่นพร้อมหรือยังที่จะทริกเกอร์)

สิ่งที่ฉันใช้คือการรวมกันของฟิลด์แบบฟอร์มปลอม (ซึ่งอธิบายว่าเป็นฟิลด์ที่ไม่ถูกต้องในกรณีที่มีการใช้เบราว์เซอร์ที่ไม่จัดการ CSS โดยทั่วไปหรือแสดง: ไม่มีโดยเฉพาะ) การตรวจสอบความมีสติ (กล่าวคือรูปแบบของอินพุต ถูกต้อง?), การประทับเวลา (ทั้งการส่งที่เร็วเกินไปและช้าเกินไป), MySQL (สำหรับการติดตั้งบัญชีดำตามอีเมลและที่อยู่ IP ตลอดจนตัวกรองน้ำท่วม), DNSBLs (เช่น SBL + XBL จาก Spamhaus), การวิเคราะห์ข้อความ ( เช่นคำที่เป็นตัวบ่งชี้ที่ชัดเจนสำหรับสแปม) และอีเมลยืนยัน (เพื่อตรวจสอบว่าที่อยู่อีเมลที่ระบุนั้นถูกต้องหรือไม่)

หมายเหตุหนึ่งในอีเมลยืนยัน: ขั้นตอนนี้เป็นทางเลือกทั้งหมด แต่เมื่อเราเลือกที่จะใช้ขั้นตอนนี้จะต้องใช้งานง่ายที่สุดเท่าที่จะเป็นไปได้ (นั่นคือควรจะเดือดจนคลิกลิงก์ที่อยู่ในอีเมล ) และทำให้ที่อยู่อีเมลที่เป็นปัญหาได้รับการอนุญาตพิเศษในช่วงเวลาหนึ่งเพื่อหลีกเลี่ยงการยืนยันในภายหลังในกรณีที่ผู้ใช้ต้องการโพสต์เพิ่มเติม


0
  1. ฉันใช้วิธีที่มีกล่องข้อความซ่อนอยู่ เนื่องจากบอทแยกวิเคราะห์เว็บไซต์พวกเขาอาจเติมเต็ม จากนั้นตรวจสอบว่าว่างหรือไม่หากไม่มีการส่งคืนเว็บไซต์

  2. เพิ่มการยืนยันอีเมล ผู้ใช้ได้รับอีเมลและเขาต้องคลิกลิงก์ หรือทิ้งโพสต์ในบางครั้ง


0

ฉันได้เพิ่มการตรวจสอบเวลาในแบบฟอร์มของฉันแล้ว แบบฟอร์มจะไม่ถูกส่งหากกรอกน้อยกว่า 3 วินาทีและสิ่งนี้ใช้ได้ผลดีสำหรับฉันโดยเฉพาะสำหรับแบบฟอร์มยาว นี่คือฟังก์ชันตรวจสอบแบบฟอร์มที่ฉันเรียกใช้บนปุ่มส่ง

function formCheck(){
var timeStart; 
var timediff;

$("input").bind('click keyup', function () {
    timeStart = new Date().getTime();          
}); 
 timediff= Math.round((new Date().getTime() - timeStart)/1000);

  if(timediff < 3) { 
    //throw a warning or don't submit the form 
  } 
  else submit(); // some submit function

}

0

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


ด้วยความอยากรู้อยากเห็นคุณรู้สึกอย่างไรกับ reCAPTCHA? คุณเป็นคนแรกที่พูดถึงบริการแบบชำระเงินอื่น ๆ แต่เปรียบเทียบกับ reCAPTCHA ได้อย่างไรและ / หรือทำไมคุณถึงแนะนำบริการเหล่านี้มากกว่าบริการฟรี
Hawkeye

0

คุณสามารถพยายามโกงสแปมโรบ็อตได้โดยเพิ่มแอตริบิวต์การดำเนินการที่ถูกต้องหลังจากการตรวจสอบความถูกต้องของ Javascript หากโรบ็อตบล็อก Javascript พวกเขาจะไม่สามารถส่งแบบฟอร์มได้อย่างถูกต้อง

HTML

<form id="form01" action="false-action.php">
    //your inputs
    <button>SUBMIT</button>
</form>

JAVASCRIPT

$('#form01 button').click(function(){

   //your Validations and if everything is ok: 

    $('#form01').attr('action', 'correct-action.php').on("load",function(){
        document.getElementById('form01').submit()
    });
})

ฉันจึงเพิ่ม "โทรกลับ" หลัง .attr () เพื่อป้องกันข้อผิดพลาด


-1

แค่ห้าเซ็นต์ของฉันก็คุ้มแล้ว หากเป้าหมายของสิ่งนี้คือการหยุดหุ่นยนต์ 99% ซึ่งฟังดูดีมากและถ้า 99% ของโรบ็อตไม่สามารถรัน Java-script ได้ทางออกที่ดีที่สุดที่จะเอาชนะทั้งหมดก็คือการไม่ใช้แบบฟอร์มที่มีการส่งด้วย URL ของโพสต์

หากฟอร์มถูกควบคุมผ่าน java-script และ java-script รวบรวมข้อมูลฟอร์มจากนั้นส่งผ่านคำร้องขอ HTTP โรบ็อตจะไม่สามารถส่งแบบฟอร์มได้ เนื่องจากปุ่มส่งจะใช้ Java-script เพื่อรันโค้ดที่ส่งแบบฟอร์ม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.