Làm cách nào để ngăn không cho rô bốt tự động điền vào biểu mẫu?


105

Tôi đang cố gắng đưa ra một cơ chế chống gửi thư rác đủ tốt để ngăn chặn đầu vào được tạo tự động. Tôi đã đọc các kỹ thuật như captcha, 1 + 1 =? mọi thứ hoạt động tốt, nhưng chúng cũng có một bước bổ sung cản trở việc sử dụng ứng dụng nhanh chóng miễn phí (tôi không tìm kiếm bất kỳ thứ gì tương tự như vậy).

Tôi đã thử đặt một số trường ẩn trong tất cả các biểu mẫu của mình, với display: none; Tuy nhiên, tôi chắc chắn rằng một tập lệnh có thể được định cấu hình để theo dõi id trường biểu mẫu đó và chỉ đơn giản là không điền nó.

Bạn có thực hiện / biết về một phương pháp chống rô-bốt tự động điền mẫu tốt không? Có điều gì đó có thể được thực hiện liền mạch với xử lý phía máy chủ HTML VÀ / HOẶC và (gần như) chống đạn không? (không có JS vì người ta có thể vô hiệu hóa nó một cách đơn giản).

Tôi đang cố gắng không dựa vào các phiên cho việc này (tức là đếm số lần một nút được nhấp để ngăn quá tải).


5
Cảm ơn vì không muốn giải pháp captcha! IMO, spam biểu mẫu là một vấn đề đối với chủ sở hữu trang web và việc ngăn chặn nó không phải là gánh nặng mà người dùng phải chịu. Có quá nhiều cách thay thế mà chúng tôi có thể giải quyết thư rác trên trang cuối, bằng chứng là các câu trả lời ở đây. Các phương pháp yêu cầu sự tương tác của người dùng chỉ nên được sử dụng bởi những người lười biếng hoặc mới làm quen.
Mike

Câu trả lời:


73

Một cách dễ thực hiện nhưng không bị đánh lừa (đặc biệt là đối với các cuộc tấn công "cụ thể") để giải quyết chống thư rác là theo dõi thời gian từ khi gửi biểu mẫu đến khi tải trang.

Bots yêu cầu một trang, phân tích cú pháp trang và gửi biểu mẫu. Điều này là nhanh chóng.

Con người nhập URL, tải trang, đợi trước khi trang được tải đầy đủ, cuộn xuống, đọc nội dung, quyết định nhận xét / điền vào biểu mẫu, yêu cầu thời gian để điền vào biểu mẫu và gửi.

Sự khác biệt về thời gian có thể rất nhỏ; và cách theo dõi thời gian này mà không cần cookie yêu cầu một số cách của cơ sở dữ liệu phía máy chủ. Điều này có thể ảnh hưởng đến hiệu suất.
Ngoài ra, bạn cần phải điều chỉnh ngưỡng thời gian.


9
Hãy để ý xem bạn có muốn cho phép người dùng cuối sử dụng trình điền biểu mẫu tự động như addons.mozilla.org/en-US/firefox/addon/1882 có thể cho phép gửi rất nhanh hay không. Cũng như hình ảnh xác thực, bất kỳ điều gì gây khó chịu cho người dùng cuối cùng nói chung là không tốt, và đặc biệt là khi ngăn cản một người trong trạng thái đi nhanh (rất) nhanh.
snowflake,

1
Điểm tốt, nhưng tất cả phụ thuộc vào bối cảnh. Nếu biểu mẫu là biểu mẫu đăng nhập, tôi hoàn toàn đồng ý với bạn. Nhưng tại sao lại vô hiệu hóa đăng nhập từ bot? Nếu ngữ cảnh là một hộp nhận xét, giống như bối cảnh này trên StackOverflow, tôi biết chắc chắn rằng: nếu bạn sử dụng tính năng tự động điền vào hộp nhận xét thì bạn là người gửi thư rác. Lưu ý rằng nếu bạn sử dụng tính năng tự động điền cho chữ ký, bạn vẫn cần thời gian để thực sự nhập nội dung.
Pindatjuh

5
Lưu ý rằng SO làm một cái gì đó như thế này. Chỉnh sửa nhận xét nhanh hoặc quá nhiều lần liên tiếp và bạn sẽ thấy thông báo "Bạn có phải là người không?" trang.
Jakob Borg

2
Không phải lúc nào tin tặc cũng yêu cầu biểu mẫu. Đôi khi, một URL được tạo cẩn thận (sử dụng GET hoặc POST) sẽ đủ để đăng biểu mẫu nhiều lần mà không tốn nhiều công sức.
crafter

1
Thực hiện điều này với captcha. Nếu biểu mẫu được gửi quá nhanh, hãy xuất trình hình ảnh xác thực để cho phép người dùng thực sự thông qua.
Yashovardhan99

75

Tôi thực sự thấy rằng một cánh đồng Honey Pot đơn giản hoạt động tốt. Hầu hết các bot điền vào mọi trường biểu mẫu mà chúng nhìn thấy, hy vọng sẽ vượt qua được các trình xác nhận trường bắt buộc.

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

Nếu bạn tạo một hộp văn bản, ẩn nó trong javascript, sau đó xác minh rằng giá trị trống trên máy chủ, điều này sẽ loại bỏ 99% rô bốt ngoài đó và không gây ra bất kỳ sự thất vọng nào cho 99% người dùng của bạn . 1% còn lại đã vô hiệu hóa javascript sẽ vẫn thấy hộp văn bản, nhưng bạn có thể thêm thông báo như "Để trống trường này" cho những trường hợp đó (nếu bạn quan tâm đến chúng).

(Ngoài ra, hãy lưu ý rằng nếu bạn thực hiện style = "display: none" trên trường, thì quá dễ dàng để rô bốt chỉ nhìn thấy điều đó và loại bỏ trường, đó là lý do tại sao tôi thích cách tiếp cận javascript hơn).


1
Bạn có nghĩ rằng chương trình thực sự đi qua tệp css và hình dung nó hiển thị: không; ? Tôi thực sự không nên sử dụng giải pháp dựa trên JS, vì nó có thể dễ dàng bị vô hiệu hóa.
Gal

1
Nó dường như là một giải pháp cũ cho các quản trị viên web bao gồm hàng tấn từ khóa không thích hợp để tăng thứ hạng web của họ. Tôi nghĩ rằng các chương trình thu thập thông tin tìm kiếm những chương trình như vậy của google có thể hình dung nó hiển thị: không có. Tại sao các bot khác không thể làm điều đó?
snowflake

2
Tôi đã sử dụng kỹ thuật này bây giờ trên hai trang web đang bị tấn công và số lượt đăng ký bot hiện là 0 0 trên cả hai. Nó sẽ không giúp chống lại các cuộc tấn công có chủ đích, nhưng dù sao thì hầu hết đều chỉ nhằm mục đích khai thác hoặc gửi thư rác.
nirvdrum

25
Điểm nhỏ ở đây: để giải quyết vấn đề JS, chỉ cần sử dụng CSS để định vị đầu vào honeypot của bạn phía trên đầu trang - theo cách này, bạn có thể tắt js và để giải quyết vấn đề này, bot sẽ phải có thể phân tích cú pháp CSS định vị tuyệt đối và đưa ra quyết định chung về việc đó có phải là honeypot hay không. hơn một chút chống đạn theo cách này :)
totallyNotLizards

3
@ alexy13 vâng, nó đơn giản hơn nhưng như đã lưu ý trong câu trả lời, bot cũng dễ dàng hơn rất nhiều để tìm ra những gì bạn đang cố gắng làm, chỉ cần kiểm tra một thuộc tính CSS. Tuy nhiên, nếu bạn sử dụng chiến lược định vị tuyệt đối, bot phải phân tích cú pháp tất cả các quy tắc định vị của bạn các quy tắc của hầu hết các cha mẹ của phần tử để có thể tìm ra liệu đầu vào có hiển thị hay không và sau đó tìm ra liệu hoặc không hành động dựa trên thông tin đó - điều này gây rắc rối hơn tất cả những gì đáng có đối với hầu hết (nếu không phải tất cả) bot.
totallyNotLizards

22

Điều gì sẽ xảy ra nếu - Bot không tìm thấy bất kỳ thứ formgì?

3 ví dụ:

  1. Chèn biểu mẫu của bạn bằng AJAX
  • Nếu bạn đồng ý với việc người dùng bị vô hiệu hóa JS và không thể xem / gửi biểu mẫu, bạn có thể thông báo cho họ và yêu cầu họ bật Javascript trước bằng câu lệnh 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>
  • Tạo một form.htmlvà đặt formbên trong một <div id="formContainer">phần tử.

  • Bên trong trang mà bạn cần gọi biểu mẫu đó, hãy sử dụng <div id="dynamicForm"></div>jQuery trống và sau:$("#dynamicForm").load("form.html #formContainer");

  1. Xây dựng biểu mẫu của bạn hoàn toàn bằng 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. Đầu vào bot-mồi
  • Chương trình tương tự ( thực sự tương tự) vô lể yếu tố đầu vào như:
<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`
  • Sau khi sử dụng HTML ở trên, bạn cũng có thể sử dụng CSS để không hiển thị đầu vào:
input[name=email]{ /* bait input */
  /* do not use display:none or visibility:hidden
     that will not fool the bot*/
  position:absolute;
  left:-2000px;
}
  • Bây giờ đầu vào của bạn không hiển thị cho người dùng mong đợi trong PHP mà bạn $_POST["email"] phải trống (không có bất kỳ giá trị nào)! Nếu không, đừng gửi biểu mẫu.
  • Cuối cùng, tất cả những gì bạn cần làm là tạo một đầu vào khác như <input name="sender" type="text" placeholder="Your email"> sau (!) Đầu vào "bot-mồi" cho địa chỉ Email người dùng thực.

Sự nhìn nhận:

Developer.Mozilla - Tắt tính năng tự động hoàn thành biểu mẫu
StackOverflow - Bỏ qua Tabindex


7
Trình duyệt của người dùng hợp pháp có khả năng xem trường nhập mồi là trường email và tự động điền vào trường này khi người dùng chọn tự động điền phần còn lại của biểu mẫu không? Người dùng sẽ không thấy một trường ngoài màn hình đã được lấp đầy, và họ vẫn trông giống như một con bot.
wilbbe01

Tôi nghi ngờ autocomplete=nopesẽ mặc định thành on;-) MDN: input # attr-autocomplete
xử lý

@handle nó không quan trọng, nó là một đầu vào mồi bot. Bạn có thể viết autocomplete="oh sunny day"cho vấn đề đó.
Roko C. Buljan,

19

Những gì tôi đã làm là sử dụng một trường ẩn và đặt dấu thời gian trên đó và sau đó so sánh nó với dấu thời gian trên Máy chủ bằng PHP.

Nếu nhanh hơn 15 giây (tùy thuộc vào mức độ lớn hay nhỏ của biểu mẫu của bạn) đó là bot.

Hy vọng điều này giúp đỡ


1
Tuy nhiên, ý kiến ​​hay, tôi đã đặt giới hạn trong khoảng 3 đến 5 giây để cho phép người dùng nhanh / mạnh. Tôi sử dụng cùng phương pháp này và đặt giới hạn cho các biểu mẫu của tôi là 3 giây đã lọc ra 99% bot.
Kayla

@adnhack Có phải ý bạn là: 1) khi tải trang với php lấy thời gian máy chủ và tạo phiên. 2) người dùng hoặc bot điền vào biểu mẫu, nhấp vào Gửi, với $.postgửi tất cả đến tệp php bên ngoài. 3) trong php bên ngoài một lần nữa lấy thời gian máy chủ và so sánh với thời gian phiên?
Andris

16

Một cách rất hiệu quả để loại bỏ hầu như spam là có một trường văn bản có chứa văn bản, chẳng hạn như "Xóa văn bản này để gửi biểu mẫu!" và văn bản đó phải được xóa để gửi biểu mẫu.

Sau khi xác thực biểu mẫu, nếu trường văn bản chứa văn bản gốc hoặc bất kỳ văn bản ngẫu nhiên nào cho vấn đề đó, đừng gửi biểu mẫu. Bots có thể đọc tên biểu mẫu và tự động điền vào các trường Tên và Email nhưng không biết liệu họ có thực sự phải xóa văn bản khỏi một trường nhất định để gửi hay không.

Tôi đã triển khai phương pháp này trên trang web công ty của chúng tôi và nó đã loại bỏ hoàn toàn thư rác mà chúng tôi nhận được hàng ngày. Nó thật sự có hiệu quả!


Thật thú vị, bạn có biết nếu nó hiệu quả hơn các câu trả lời khác ... một hộp văn bản ẩn hoặc theo dõi thời gian cần thiết để điền vào biểu mẫu?
Austin Henley

4
Điều này cũng sẽ bắt những người dùng không thể làm theo chỉ dẫn, điều này có thể không được mong muốn.
wilbbe01

Tôi thích điều này! Cho đến khi bot bắt đầu cố gắng kết hợp khác nhau của trống và điền-trong các lĩnh vực ... Cách tốt nhất để kiểm tra là thực hiện điều này và quét với một trong những: sectoolmarket.com/...
nmit026

Có hiệu lực cho đến nay khi người quản lý bot không phát hiện ra và chỉnh sửa mã.
Talha Awan

11

Làm thế nào về việc tạo một hộp nhập trường văn bản cùng màu với màu nền phải để trống. Điều này sẽ giải quyết vấn đề của màn hình đọc bot: không có


2
Vui lòng thêm điều này dưới dạng nhận xét khi bạn nhận được nhiều danh tiếng hơn thay vì câu trả lời;)
Rob

3
Điều này đưa ra các vấn đề về khả năng tiếp cận. Chỉ mục honeypot sẽ không bị ẩn khỏi người dùng có trình đọc màn hình.
Otterfan

5
Tôi là một người dùng mù và tôi đã tìm thấy một trường biểu mẫu như thế này một lần và nhãn phía trên nó có nội dung: "Nếu bạn có thể nhìn thấy, hãy để trống trường này." IMO rất hiệu quả.
Parham Doustdar

8

http://recaptcha.net/

reCAPTCHA là một dịch vụ chống bot miễn phí giúp số hóa sách

Nó đã được hỏi bởi Google (năm 2009):

Cũng thấy


5
Với tư cách là người dùng, tôi thường thấy khó tìm ra recaptcha. Một số từ khó đọc đến nỗi bạn phải thử 3 hoặc 4 lần. Mặc dù điều này chắc chắn sẽ giúp giải quyết vấn đề rô bốt.
Brian


Tôi thấy mình trên trang này vì CAPTCHA / reCAPTCHA hiện không ngừng gửi biểu mẫu bot. Đây là 5 năm sau và đó là một kỹ thuật mới so với khi câu trả lời này đã được đưa ra
JohnnyFaldo

Tôi ngạc nhiên tại sao câu trả lời này không có nhiều ủng hộ hơn. cho dù người dùng thích hay không, đây là một giải pháp tuyệt vời. Đặc biệt, nếu nó chỉ được sử dụng cho mẫu đăng ký.
towi_parallelism

Ngày nay, recaptcha bắt đầu như một hộp kiểm đơn giản, có lẽ nó không còn đau đớn như trước đây? ...
rogerdpack

6

Nhiều chương trình thư rác chỉ là các tập lệnh phía máy chủ lướt web. Bạn có thể chống lại nhiều người trong số họ bằng cách sử dụng một số javascript để thao tác với yêu cầu biểu mẫu trước khi nó được gửi (tức là, đặt một trường bổ sung dựa trên một số biến khách hàng). Đây không phải là một giải pháp đầy đủ và có thể dẫn đến nhiều vấn đề (ví dụ: người dùng sử dụng javascript, trên thiết bị di động, v.v.), nhưng nó có thể là một phần trong kế hoạch tấn công của bạn.

Đây là một ví dụ nhỏ ...

<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>

Ở đâu đó trong tập lệnh php của bạn ...

<?php

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

?>

Ngoài ra, hình ảnh xác thực là tuyệt vời và thực sự là cách bảo vệ tốt nhất chống lại thư rác.


Cảm ơn bạn, mặc dù javascript có thể dễ dàng bị vô hiệu hóa trong bất kỳ trình duyệt nào, do đó sẽ hủy bỏ "cơ chế chống thư rác" của tôi, vì vậy tôi đang tìm kiếm thứ gì đó toàn cầu hơn.
Gal

Tôi có thể sai, nhưng điều này sẽ không nói với mọi người dùng bị khuyết tật JS 'bạn là một khách hàng tồi, làm ơn biến đi.'?
Gal

Gal, một ví dụ tầm thường , chỉ đơn thuần trình bày cách xác thực đối với một var yêu cầu được thiết lập bởi js phía máy khách.
John Himmelman

@John Himmelman Captchas có thể giải quyết được và không nhất thiết là biện pháp bảo vệ tốt nhất chống lại thư rác. Có những dịch vụ trả tiền như anti-captcha.com sẽ giải quyết các hình ảnh xác thực với mức phí thấp.

Vấn đề với cách tiếp cận này là tôi đã thấy rất nhiều bot sử dụng PhantomJS. Điều này sẽ cho phép họ vượt qua.
Parham Doustdar

4

Tôi ngạc nhiên là chưa có ai đề cập đến phương pháp này:

  • Trên trang của bạn, hãy bao gồm một hình ảnh nhỏ, ẩn.
  • Đặt một cookie khi cung cấp hình ảnh này.
  • Khi xử lý việc gửi biểu mẫu, hãy kiểm tra cookie.


Ưu điểm:

  • thuận tiện cho người dùng và nhà phát triển
  • có vẻ đáng tin cậy
  • không có JavaScript

Nhược điểm:

  • thêm một yêu cầu HTTP
  • yêu cầu bật cookie trên máy khách


Ví dụ: phương pháp này được sử dụng bởi plugin WordPress Cookies for Comments .


Các bot sử dụng những thứ như PhantomJS sẽ không dễ dàng làm được điều này sao?
Parham Doustdar

1
Vì nó là một công cụ trình duyệt đầy đủ, tải nội dung và những thứ như vậy, điều đó có thể xảy ra. Tuy nhiên, tôi không chắc nó thường được sử dụng cho một bot spam, vì nó có thể chậm hơn nhiều so với các tập lệnh cURL.
Gras Double

bất kỳ lý do nào điều này sẽ tốt hơn mã thông báo CSRF?
xenoterracide

1
mã thông báo CSRF sẽ không ngăn chặn một bot nào cả. Yêu cầu đầu tiên, NHẬN biểu mẫu, bao gồm mã thông báo. Yêu cầu thứ hai, ĐĂNG biểu mẫu, bao gồm cả mã thông báo.
Gras Double

4

Với sự xuất hiện của các trình duyệt không có đầu (như phantomjs) có thể mô phỏng bất cứ thứ gì, bạn không thể cho rằng:

  • chương trình thư rác không sử dụng javascript,
  • bạn có thể theo dõi các sự kiện chuột để phát hiện bot,
  • họ sẽ không thấy rằng một trường bị ẩn trực quan,
  • họ sẽ không đợi một thời gian nhất định trước khi gửi.

Nếu điều đó đã từng là đúng, thì nó không còn đúng nữa.

Nếu bạn không phải là một giải pháp thân thiện với người dùng, chỉ cần cung cấp cho họ một nút gửi "tôi là người gửi thư rác" tuyệt đẹp :

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

Tất nhiên bạn có thể chơi với hai input[type=image]nút hình ảnh , thay đổi thứ tự sau mỗi lần tải, các lựa chọn thay thế văn bản, nội dung của hình ảnh (và kích thước của chúng) hoặc namecác nút; điều này sẽ yêu cầu một số hoạt động của máy chủ.

 <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" />

Vì lý do trợ năng, bạn phải đặt một câu thay thế đúng bằng văn bản, nhưng tôi nghĩ rằng một câu dài sẽ tốt hơn cho người dùng trình đọc màn hình hơn là bị coi là một bot.

Lưu ý thêm: những ví dụ đó minh họa rằng việc hiểu tiếng Anh (hoặc bất kỳ ngôn ngữ nào) và phải thực hiện một lựa chọn đơn giản, khó hơn đối với một spambot so với: chờ 10 giây, xử lý CSS hoặc javascript, biết rằng một trường bị ẩn, mô phỏng di chuyển chuột hoặc giả lập gõ bàn phím, ...


Đối với tôi, dường như thực tế là bạn phải đặt văn bản thay thế có nghĩa là giải pháp hai hình ảnh của bạn cũng dễ bị tập lệnh như các giải pháp thay thế khác. Và đối với nút "Tôi không phải là người gửi thư rác": nó cũng không được viết theo kịch bản phải không?
Hawkeye

@Hawkeye Câu trả lời của tôi là một trình duyệt không có đầu có thể mô phỏng bất cứ thứ gì : javascript, độ trễ, di chuyển chuột, trường ẩn, ... Thuật ngữ "đẹp" trước các ví dụ của tôi là "châm biếm". Nhưng những ví dụ đó minh họa rằng việc hiểu tiếng Anh và phải đưa ra một lựa chọn đơn giản, khó hơn đối với một spambot hơn là: chờ 10 giây, xử lý CSS hoặc javascript, biết rằng một trường bị ẩn, mô phỏng di chuyển chuột hoặc giả lập gõ bàn phím, ...
Adam

Tôi thấy quan điểm của bạn bây giờ. Có thể thêm câu cuối cùng "Nhưng những ví dụ đó minh họa ..." vv vào câu trả lời của bạn. Vì điều đó đã giúp tôi hiểu ý bạn. Lúc đầu, nó có vẻ là một lập luận tự mâu thuẫn rằng "chúng ta không thể cho rằng bot không thể ..." nhưng sau đó liệt kê những điều mà chúng ta vẫn không thể cho rằng bot không thể làm được. Nhưng mấu chốt của quan điểm của bạn là ví dụ của bạn (phải lựa chọn nút gửi nào) khó hơn - mà (bây giờ tôi đã hiểu) là một câu trả lời tuyệt vời. +1
Hawkeye

3

Một cách rất đơn giản là cung cấp một số trường như <textarea style="display:none;" name="input"></textarea>và loại bỏ tất cả các câu trả lời có điền này.

Một cách tiếp cận khác là tạo toàn bộ biểu mẫu (hoặc chỉ tên trường) bằng cách sử dụng Javascript; ít bot có thể chạy nó.

Dù sao, bạn sẽ không làm được gì nhiều khi chống lại các "bot" trực tiếp từ Đài Loan hoặc Ấn Độ, được trả 0,03 đô la cho mỗi liên kết được đăng và kiếm sống của chúng theo cách đó.


2
Tôi biết câu trả lời này đã gần 7 năm nhưng tôi cảm thấy câu trả lời này rất đáng để bình luận. Nhiều bot có thể được lập trình để bỏ qua các trường có style = "display: none" để tránh kiểu bảo vệ này.
Kenny Johnson

Có hàng tá phương pháp che khuất đầu vào, sử dụng Javascript, hiển thị các phần tử giả trên đầu chúng, di chuyển chúng ra khỏi vùng hiển thị, tạo kiểu cho chúng để kết hợp hoàn hảo với nền hoặc trang trí bố cục, v.v. Ngẫu nhiên hóa (băm) tên đầu vào (và giữ ánh xạ of hashed => original in session server-side) sẽ giúp chống lại việc sử dụng tên làm gợi ý và ánh xạ thủ công đầu vào nào là hợp lệ. Bất kể, không có biện pháp bảo vệ chống lại thư rác thủ công.
SF.

2

Tôi có một phương pháp đơn giản để ngăn chặn những kẻ gửi thư rác hiệu quả 100%, ít nhất là theo kinh nghiệm của tôi và tránh sử dụng reCAPTCHA và các phương pháp tương tự. Tôi đã chuyển từ gần 100 thư rác mỗi ngày trên một trong các dạng html của một trang web của mình xuống 0 trong 5 năm qua khi tôi thực hiện phương pháp này.

Nó hoạt động bằng cách tận dụng các khả năng ALIAS của e-mail của hầu hết các tập lệnh xử lý biểu mẫu html (tôi sử dụng FormMail.pl), cùng với một "mã" gửi đồ họa, dễ dàng được tạo trong các chương trình đồ họa đơn giản nhất. Một hình ảnh như vậy bao gồm mã M19P17nH và lời nhắc "Vui lòng nhập mã ở bên trái".

Ví dụ cụ thể này sử dụng một chuỗi các chữ cái và số ngẫu nhiên, nhưng tôi có xu hướng sử dụng các phiên bản không phải tiếng Anh của các từ quen thuộc với khách truy cập của tôi (ví dụ: "pnofrtay"). Lưu ý rằng lời nhắc cho trường biểu mẫu được tích hợp trong đồ họa, thay vì xuất hiện trên biểu mẫu. Do đó, đối với rô bốt, trường biểu mẫu đó không có manh mối nào về mục đích của nó.

Bí quyết thực sự duy nhất ở đây là đảm bảo rằng html biểu mẫu của bạn chỉ định mã này cho biến "người nhận". Sau đó, trong chương trình thư của bạn, hãy đảm bảo rằng mỗi mã như vậy bạn sử dụng được đặt làm bí danh e-mail, chỉ đến bất kỳ địa chỉ e-mail nào bạn muốn sử dụng. Vì không có bất kỳ lời nhắc nào trên biểu mẫu để rô-bốt đọc và không có địa chỉ e-mail, nên nó không biết phải điền gì vào trường biểu mẫu trống. Nếu nó không có gì trong trường biểu mẫu hoặc bất kỳ thứ gì ngoại trừ các mã được chấp nhận, thì việc gửi biểu mẫu không thành công với lỗi "người nhận không hợp lệ". Bạn có thể sử dụng một hình ảnh khác trên các biểu mẫu khác nhau, mặc dù nó không thực sự cần thiết theo kinh nghiệm của tôi.

Tất nhiên, một con người có thể giải quyết vấn đề này trong nháy mắt, mà không cần tất cả các vấn đề liên quan đến reCAPTCHA và các kế hoạch tương tự, thanh lịch hơn. Nếu người gửi thư rác là con người phản hồi lỗi của người nhận và lập trình mã hình ảnh vào rô bốt, bạn có thể dễ dàng thay đổi mã này khi bạn nhận ra rằng rô bốt đã được mã hóa cứng để phản hồi. Trong 5 năm sử dụng phương pháp này, tôi chưa bao giờ nhận được thư rác từ bất kỳ biểu mẫu nào mà tôi sử dụng nó cũng như chưa bao giờ tôi nhận được khiếu nại từ bất kỳ người dùng biểu mẫu nào. Tôi chắc chắn rằng điều này có thể bị đánh bại với khả năng OCR trong robot, nhưng tôi chưa bao giờ điều đó xảy ra trên bất kỳ trang web nào của tôi sử dụng các dạng html. Tôi cũng đã sử dụng "bẫy thư rác" (mã html ẩn "đến nay" chỉ ra các chính sách chống thư rác của tôi) để có hiệu quả tốt, nhưng chúng chỉ hiệu quả khoảng 90%.


1

Tôi đang nghĩ đến nhiều thứ ở đây:

  1. sử dụng JS (mặc dù bạn không muốn) để theo dõi di chuyển chuột, nhấn phím, nhấp chuột
  2. lấy url giới thiệu (trong trường hợp này phải là một từ cùng một miền) ... người dùng bình thường phải điều hướng qua trang web trước khi đến biểu mẫu liên hệ: PHP: Làm thế nào để lấy URL của liên kết giới thiệu?
  3. sử dụng biến $ _SESSION để lấy IP và kiểm tra biểu mẫu gửi dựa trên danh sách IP đó
  4. Điền vào một trường văn bản với một số văn bản giả mà bạn có thể kiểm tra ở phía máy chủ nếu nó đã bị ghi đè
  5. Kiểm tra phiên bản trình duyệt: http://chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php.html ... Rõ ràng là bot sẽ không sử dụng trình duyệt mà chỉ sử dụng một tập lệnh .
  6. Sử dụng AJAX để gửi từng trường một và kiểm tra sự khác biệt về thời gian giữa các lần gửi
  7. Sử dụng trang giả trước / sau biểu mẫu, chỉ để gửi một đầu vào khác

Bạn có thể giải thích thêm về một số bước valicu2000? Chúng có còn hiệu lực vào năm 2020 không? Cảm ơn.
Michael Moriarty

0

Một lựa chọn khác thay vì thực hiện các chữ cái và số ngẫu nhiên như nhiều trang web làm, là tạo các bức ảnh ngẫu nhiên về các đối tượng dễ nhận biết. Sau đó, yêu cầu người dùng nhập màu gì đó trong hình hoặc bản thân vật đó là gì.

Nói chung, mọi giải pháp đều sẽ có những ưu điểm và nhược điểm của nó. Bạn sẽ phải tìm ra một trung bình hài lòng giữa quá khó để người dùng có thể vượt qua cơ chế chống thư rác và số lượng chương trình thư rác có thể vượt qua.


Ý tưởng tốt. Tôi sẽ không sử dụng màu sắc như là tiêu chuẩn mặc dù, vì điều này có thể loại trừ người dùng sắc manh
Neil Aitken

Vâng, điểm tốt. Trên thực tế, một vấn đề với hình ảnh nói chung là chúng không thể truy cập được và bằng cách làm cho chúng "có thể truy cập" bằng thẻ alt, robot có thể dễ dàng tìm ra chúng.
Brian

Hình ảnh luôn luôn là một ý tưởng tồi ... các văn bản chỉ có thể được đọc, tôi phải đối mặt với vấn đề này với các trang web khác
valicu2000

Đây chỉ là hình ảnh xác thực với một sự thay đổi rất nhỏ gây khó khăn hơn cho người dùng. Ngoài ra nó không thể truy cập được.
Mihai P.

0

Robot không thể thực thi JavaScript, vì vậy bạn có thể làm điều gì đó như đưa một số loại phần tử ẩn vào trang bằng JavaScript và sau đó phát hiện sự hiện diện của nó trước khi gửi biểu mẫu nhưng hãy cẩn thận vì một số người dùng của bạn cũng sẽ bị vô hiệu hóa JavaScript

Nếu không, tôi nghĩ bạn sẽ buộc phải sử dụng một hình thức bằng chứng khách hàng về "tính người"


4
Robot thông minh có thể thực thi javascript. Bằng cách thực hiện một giải pháp javascript, bạn đang chặn 99% rô bốt
Ben Scheirman

Nếu bot là một trình duyệt Plugin nó sẽ có thể thực hiện javascript và xem những điều see sử dụng (ngay cả khi bạn đang làm một số flash hoặc webgl rendering)
CoffeDeveloper

Chỉ cần sử dụng CSS để đặt trường văn bản phía trên trang nếu bạn lo lắng về việc mọi người đã tắt JavaScript.
Chewie The Chorkie

0

Giải pháp tốt nhất mà tôi đã tìm thấy để tránh bị bot spam là sử dụng một câu hỏi hoặc trường rất nhỏ trên biểu mẫu của bạn.

Hãy thử thêm một trường như sau:

  • Sao chép "xin chào" trong hộp sang một bên
  • 1 + 1 =?
  • Sao chép tên trang web vào hộp

Những thủ thuật này yêu cầu người dùng hiểu rõ hơn những gì phải nhập trên biểu mẫu, do đó, việc trở thành mục tiêu của việc điền biểu mẫu bot khổng lồ khó hơn nhiều.

BIÊN TẬP

Mặt sau của phương pháp này, như bạn đã nêu trong câu hỏi của mình, là bước bổ sung để người dùng xác thực biểu mẫu của nó. Tuy nhiên, theo tôi, nó đơn giản hơn nhiều so với captcha và chi phí khi điền vào biểu mẫu không quá 5 giây, điều này có vẻ chấp nhận được từ quan điểm của người dùng.


Là một người dùng, tôi ghét điều đó. Tôi hiểu rằng spam là một vấn đề, nhưng vấn đề của tôi như thế nào, với tư cách là một người dùng trang web? Spam nhận xét là một vấn đề đối với chủ sở hữu trang web và do đó, người dùng không nên chịu trách nhiệm ngăn chặn nó. Nếu bạn bước vào một cửa hàng và được yêu cầu đặt giày bảo hộ vào giày vì họ không muốn lau, bạn sẽ nghĩ gì khi đó? Nó chỉ mất một vài giây, nhưng nó không phải là gánh nặng của bạn phải chịu.
Mike

@Miki spam khiến chủ sở hữu trang web lãng phí thời gian. Thời gian là tiền bạc, những gì tôi bán sẽ đắt hơn với bạn. Lập luận của bạn có thể dễ dàng được sử dụng để nói rằng "Tôi không quan tâm đến việc bạn phải trả tiền thuê, tôi muốn trả chi phí sản xuất + 1 $. Bạn trả tiền thuê như thế nào là vấn đề của tôi". Khi bạn mua thứ gì đó, bạn phải trả tiền cho dịch vụ lưu trữ, vận chuyển, thời gian, v.v.
Mihai P.

@Mike - Đó là vấn đề của bạn vì bạn muốn biểu mẫu hoạt động (rõ ràng là vì bạn đang sử dụng nó). Máy móc tìm thấy ngay cả những trang web khó hiểu nhất và sẽ gửi thư rác hàng chục nghìn lần gửi mỗi ngày, khiến những biểu mẫu đó không thể sử dụng được. Vì vậy, lần tới khi bạn gửi câu hỏi cho một doanh nghiệp nhỏ bằng cách sử dụng biểu mẫu trên trang web của họ và bạn phải thêm 9 + 3 để thực hiện điều đó ... và hãy tự hỏi bản thân "tại sao tôi phải làm điều này?" câu trả lời của bạn có thể là "bởi vì tôi thực sự muốn có câu trả lời cho câu hỏi của mình".
Jimbo Jonny

@JimboJonny Bạn hoàn toàn bỏ sót quan điểm của tôi. Spam là một vấn đề (như tôi đã nêu), nhưng có nhiều cách để giải quyết nó trên phần phụ trợ để không ảnh hưởng đến trải nghiệm người dùng. Tôi hiện đã triển khai các biểu mẫu liên hệ trên hàng chục (hàng trăm, thậm chí) các trang web và spam là rất ít (một vài tin nhắn spam mỗi tháng, mỗi biểu mẫu) vì tôi đã giải quyết spam theo chương trình, không phải bằng cách khiến người dùng nhảy qua vòng. Quan điểm của tôi không phải là thư rác không phải là một vấn đề; nó là một vấn đề. Quan điểm của tôi là có nhiều cách để giải quyết vấn đề này mà không làm ảnh hưởng đến trải nghiệm của người dùng.
Mike

@JimboJonny Trường hợp cụ thể, hãy xem các câu trả lời được xếp hạng cao nhất (và được chấp nhận) cho câu hỏi này. Không liên quan đến bất kỳ loại đầu vào của người dùng. Đó là cách giảm thiểu thư rác nên được.
Mike

0

Có một hướng dẫn về điều này trên trang web JQuery. Mặc dù đó là JQuery nhưng ý tưởng là độc lập với khung.

Nếu JavaScript không có sẵn thì bạn có thể cần quay lại cách tiếp cận loại CAPTCHA.


0

cách dễ dàng mà tôi thấy để thực hiện việc này là đặt một trường có giá trị và yêu cầu người dùng xóa văn bản trong trường này. vì bot chỉ lấp đầy chúng. nếu trường không trống điều đó có nghĩa là người dùng không phải là con người và nó sẽ không được đăng. mục đích tương tự của mã captcha.


0

Nó chỉ là một ý tưởng, id đã sử dụng nó trong ứng dụng của tôi và hoạt động tốt

bạn có thể tạo cookie khi di chuyển chuột bằng javascript hoặc jquery và ở phía máy chủ, hãy kiểm tra xem cookie có tồn tại hay không, bởi vì chỉ con người mới có chuột, cookie chỉ có thể được tạo ra bởi họ cookie có thể là dấu thời gian hoặc mã thông báo có thể xác thực


Ý tưởng thú vị! Bạn đã sử dụng điều này trong thế giới thực chưa?
skybondsor

Nó sẽ không hoạt động. Ngày nay những kẻ gửi thư rác đang sử dụng phần mềm chạy trong trình duyệt. Vì vậy, họ có thể bắt chước trải nghiệm người dùng tạo ra cookie và sau đó chạy nó x số lần bằng cách sử dụng nội dung khác nhau do phần mềm tạo ra.
Norbert Norbertson

Điều này sẽ không hoạt động nếu người dùng không sử dụng chuột. Nếu biểu mẫu của bạn được thiết lập đúng cách, người dùng sẽ có thể điền vào toàn bộ biểu mẫu bằng bàn phím của họ. Bạn có thể chuyển tab đến các trường tiếp theo, sử dụng phím cách để chọn các nút radio và sử dụng phím cách (hoặc enter) khi bạn nhấn tab vào nút gửi.
Kenny Johnson

0

Sử dụng 1) biểu mẫu có mã thông báo 2) Kiểm tra biểu mẫu để tạo độ trễ với địa chỉ IP 3) Chặn IP (tùy chọn)


0

Theo kinh nghiệm của tôi, nếu biểu mẫu chỉ là một biểu mẫu "liên hệ", bạn không cần các biện pháp đặc biệt. Thư rác được lọc kỹ càng bởi các dịch vụ webmail (bạn có thể theo dõi các yêu cầu biểu mẫu web thông qua tập lệnh máy chủ để xem nội dung nào tiếp cận hiệu quả email của bạn, tất nhiên tôi cho rằng bạn có một dịch vụ webmail tốt: D)

Btw, tôi đang cố gắng không dựa vào các phiên cho việc này (như đếm số lần một nút được nhấp để tránh quá tải).

Tôi không nghĩ điều đó tốt, Thật vậy, điều tôi muốn đạt được là nhận được email từ những người dùng thực hiện một số hành động cụ thể vì đó là những người dùng mà tôi quan tâm (ví dụ: người dùng đã xem trang "CV" và sử dụng địa chỉ liên hệ thích hợp hình thức). Vì vậy, nếu người dùng làm điều gì đó tôi muốn, tôi bắt đầu theo dõi phiên của họ và đặt cookie (tôi luôn đặt cookie phiên, nhưng khi tôi không bắt đầu phiên, đó chỉ là cookie giả được tạo ra để tin rằng người dùng có phiên). Nếu người dùng làm điều gì đó không mong muốn, tôi không bận tâm giữ phiên cho anh ta để không bị quá tải, v.v.

Ngoài ra, sẽ rất tốt cho tôi khi các dịch vụ quảng cáo cung cấp một số loại api (có thể đã tồn tại) để xem liệu người dùng có "nhìn vào quảng cáo" hay không, có khả năng người dùng đang xem quảng cáo là người dùng thực, nhưng nếu họ không thực sự tốt ít nhất bạn có được 1 lượt xem vì vậy không có gì mất mát. (và tin tôi đi, kiểm soát quảng cáo phức tạp hơn bất cứ điều gì bạn có thể làm một mình)


0

Trên thực tế, cái bẫy có hiển thị: không có tác dụng nào giống như một cái bùa. Nó giúp di chuyển khai báo CSS sang một tệp chứa bất kỳ biểu định kiểu chung nào, điều này cũng sẽ buộc các chương trình thư rác tải chúng ( khai báo kiểu trực tiếp = "display: none;" có thể được hiểu bởi một bot spam, như một khai báo kiểu cục bộ trong chính tài liệu).

Điều này kết hợp với các biện pháp đối phó khác sẽ khiến bất kỳ chương trình thư rác nào có thể dỡ bỏ rác của chúng (Tôi có một sổ lưu bút được bảo mật bằng nhiều biện pháp khác nhau và cho đến nay chúng đã rơi vào bẫy chính của tôi - tuy nhiên, bất kỳ bot nào có thể vượt qua chúng, ở đó những người khác đã sẵn sàng để kích hoạt).

Những gì tôi đang sử dụng là sự kết hợp của các trường biểu mẫu giả mạo (cũng được mô tả là các trường không hợp lệ trong trường hợp trình duyệt được sử dụng không xử lý CSS nói chung hoặc hiển thị: không nói riêng), kiểm tra sanity (tức là định dạng của đầu vào hợp lệ?), đóng dấu thời gian (gửi cả quá nhanh và quá chậm), MySQL (để triển khai danh sách đen dựa trên e-mail và địa chỉ IP cũng như bộ lọc lũ), DNSBL (ví dụ: SBL + XBL từ Spamhaus), phân tích văn bản ( ví dụ: các từ là dấu hiệu cho thấy spam) và các e-mail xác minh (để xác định xem địa chỉ e-mail được cung cấp có hợp lệ hay không).

Một lưu ý đối với thư xác minh: Bước này hoàn toàn là tùy chọn, nhưng khi người ta chọn thực hiện nó, thì quy trình này phải dễ sử dụng nhất có thể (nghĩa là, nó phải hấp dẫn khi nhấp vào liên kết có trong e-mail ) và đưa địa chỉ e-mail được đề cập vào danh sách trắng trong một khoảng thời gian nhất định để tránh việc xác minh tiếp theo trong trường hợp người dùng muốn đăng thêm.


0
  1. Tôi sử dụng một phương pháp có hộp văn bản ẩn. Vì bot phân tích cú pháp trang web nên chúng có thể lấp đầy nó. Sau đó, tôi kiểm tra xem nó có trống không nếu nó không phải là trang web trở lại.

  2. Thêm xác minh email. Người dùng nhận được một email và anh ta cần nhấp vào một liên kết. Nếu không, hãy hủy bài viết trong một thời gian.


0

Tôi đã thêm kiểm tra thời gian vào biểu mẫu của mình. Các biểu mẫu sẽ không được gửi nếu điền trong ít hơn 3 giây và điều này rất hiệu quả đối với tôi, đặc biệt là đối với các biểu mẫu dài. Đây là chức năng kiểm tra biểu mẫu mà tôi gọi trên nút gửi

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

Với các chương trình thư rác ngày càng tinh vi và các kỹ thuật như các trình duyệt tự động, việc xác định nguồn thư rác sẽ trở nên khó khăn hơn. Nhưng cho dù được đăng bởi phần mềm, con người hay cả hai, thư rác đều là thư rác vì nội dung của nó. Tôi nghĩ giải pháp tốt nhất là chạy nội dung đã đăng thông qua API chống thư rác như Cleantalk hoặc Akismet. Nó tương đối rẻ và hiệu quả và không gây rắc rối cho người dùng. Bạn có thể kiểm tra thời gian gửi biểu mẫu và các cách kiểm tra truyền thống khác để tìm các bot ít phức tạp hơn trước khi truy cập API.


Không khỏi tò mò, cảm giác của bạn về reCAPTCHA là gì? Bạn là người đầu tiên đề cập đến các dịch vụ trả phí khác, nhưng những dịch vụ đó so với reCAPTCHA như thế nào và / hoặc tại sao bạn lại giới thiệu những dịch vụ đó HƠN dịch vụ miễn phí?
Hawkeye

0

Bạn có thể cố gắng gian lận spam-rô bốt bằng cách thêm thuộc tính hành động chính xác sau khi xác thực Javascript. Nếu rô bốt chặn Javascript, chúng không bao giờ có thể gửi biểu mẫu một cách chính xác.

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()
    });
})

Sau đó, tôi thêm một "gọi lại" sau .attr () để ngăn lỗi.


-1

Chỉ đáng giá năm xu của tôi. Nếu mục tiêu của việc này là ngăn chặn 99% rô bốt, điều này có vẻ khá tốt và nếu 99% rô bốt không thể chạy Java-script, giải pháp tốt nhất đánh bại tất cả chỉ đơn giản là không sử dụng biểu mẫu có hành động đệ trình URL của bài đăng.

Nếu biểu mẫu được điều khiển thông qua java-script và java-script thu thập dữ liệu biểu mẫu và sau đó gửi nó qua một yêu cầu HTTP, thì không có rô bốt nào có thể gửi biểu mẫu. Vì nút gửi sẽ sử dụng Java-script để chạy mã gửi biểu mẫu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.