2012-01-15 23 views
12

Tôi đã đọc về việc thêm các trường Mật ong vào các biểu mẫu của tôi để chống lại các bot/spam. Chỉ có vấn đề là của họ không có hướng dẫn hoặc bất cứ điều gì về nơi để bắt đầu. Nhiều trang web nói rằng để tạo một trường bị ẩn mà chỉ bot spam mới điền vào. Nhưng khi tôi mới làm điều này, không biết tôi sẽ bắt đầu từ đâu trong đơn đăng ký của mình. Bất cứ ai có thể cho tôi những lời khuyên về cách thiết lập này? Tôi đang cố gắng để làm cho trang đăng ký Devise của tôi sử dụng các lĩnh vực nồi mật ong.Làm cách nào để thêm trường Mật ong vào biểu mẫu của tôi?

+0

Chỉ cần thêm một lĩnh vực ẩn và kiểm tra nó trên trình; Tôi không chắc sự nhầm lẫn là gì. –

+4

Bằng "ẩn" nghĩa là * không hiển thị trên màn hình * chứ không phải ''. Một cái gì đó giống như 'visiblity: hidden;' hoặc bất kỳ loại thủ thuật css nào khác làm cho đầu vào vô hình. –

+0

Liên quan: [Thực hiện tốt hơn Honeypot (Mẫu chống thư rác)] (http://stackoverflow.com/questions/36227376/better-honeypot-implementation-form-anti-spam/36227377) –

Trả lời

18

Ý tưởng cơ bản đằng sau captchas honeypot là bạn có trường ẩn (qua CSS) có tên là "form" hoặc "email" hoặc "content" (bot chỉ đọc tên trường) có vẻ như được điền vào. Sau đó, khi máy chủ xem xét nội dung gửi, bạn đảm bảo rằng các trường bị ẩn này trống. Nếu không, thì bạn gắn cờ bài đăng dưới dạng bot.

Here's a well explained example (với một số mã trong ASP), và here's a Rails Gem that provides honeypot captchas.

Đó Rails Gem tôi liên kết trông giống như nó rất dễ dàng để sử dụng sau khi cài đặt:

<% form_tag comments_path, :honeypot => true do -%> 
    ... 
    <% end -%> 

Mặc dù nếu bạn quan tâm đến tìm hiểu về cách tiếp cận hơn là chỉ có nó được thực hiện, tôi khuyên bạn nên cuộn của riêng bạn. Nếu bạn đang lăn của riêng mình, điều quan trọng là phải đảm bảo rằng trường được ẩn bởi CSS (hoặc một số thủ thuật định vị/định vị khác) và không phải input type="hidden" - nếu không bot sẽ không điền vào trường.

Như Michael Mior đã chỉ ra trong các nhận xét, điều quan trọng là phải có một thông báo bên cạnh trường ẩn để người dùng để trống - nếu không người dùng có trình đọc màn hình có thể điền sai. Tôi liên kết với - vì vậy nếu bạn đang tạo một trang web có thể truy cập (mà bạn gần như chắc chắn là), bạn có thể cần sửa đổi hoặc cuộn trang web của riêng bạn.


Hãy ghi nhớ rằng thủ thuật này là không đơn giản - không có gì ngăn chặn một bot từ render trang và xác định những lĩnh vực đang thực sự có thể nhìn thấy cho người sử dụng trước khi điền bất kỳ trong là - nhưng đó loại bot sẽ là đáng kể phức tạp hơn một cái chỉ nhìn vào dạng html. Một captcha honeypot có khả năng rất hiệu quả trong việc ngăn chặn các bot đơn giản.

+2

Lưu ý rằng đá quý bạn tham chiếu có một số vấn đề trợ năng. Điều quan trọng là phải có một thông báo yêu cầu người dùng để trống trường này. Điều này có thể được ẩn cùng với trường biểu mẫu, nhưng nó đảm bảo mọi người sử dụng trình đọc màn hình sẽ có thể để trống trường một cách chính xác. –

+0

@MichaelMior Điểm tốt. Có đá quý tốt hơn tôi nên liên kết đến? –

+0

Vì vậy, nếu tôi đã cuộn của riêng tôi. Tôi có bắt đầu bằng cách tạo một thuộc tính ảo và sau đó một phương thức tuyên bố rằng nó phải được để trống và cũng ẩn nó khỏi màn hình với định vị tuyệt đối -9999? – LearningRoR

-7

và đây là nồi mật ong của tôi:

<input id="email" name="emails" style="border:none"></br> 

Nếu bạn vẫn còn hoang tưởng với điều này, hãy thử một số cách tiếp cận hơn: Sử dụng javascript để rõ ràng trong các lĩnh vực khi người dùng nhầm lẫn điền vào giá trị và tập trung vào các hộp văn bản tiếp theo. Bạn cũng có thể yêu cầu người dùng thực hiện một phép toán đơn giản như trả lời: 1 + 2 =?

+3

Bạn đã xem "hiển thị: không"? –

+5

Tôi không thích đường viền: không có gì vì trường vẫn có thể nhấp trên giao diện người dùng. Hơn nữa, nó vẫn có thể hiển thị vì nền của phần tử chứa khác với đầu vào. Điều này không ngăn phần tử hiển thị. Ngoài ra,
không phải là HTML và không thực hiện gì trong XHTML. –

0
<div id="honeypotdiv"> 
If you see this, leave it blank. Only bots should see this 
<input type="text" name="body" value="" /> 
</div> 
+1

Câu trả lời này được bật lên trong hàng đợi đánh giá chất lượng thấp, có lẽ vì bạn không giải thích mã. Nếu bạn giải thích điều đó (trong câu trả lời của bạn), bạn có nhiều khả năng nhận được nhiều phiếu bầu hơn — và người hỏi có nhiều khả năng học hỏi điều gì đó hơn! –

1
HTML - 
<input type="text" name="verifyEmail" id="verifyEmail"> 

PHP Validation - 
if(strlen($_POST['verifyEmail']) > 0){ 
    header('location: {some redirect URL here..}'); //Send them way away from your form :) 
die(); //Stop execution of the script 
} 

CSS - 
#verifyEmail{ 
position:fixed; 
visibility: hidden; 
top:-500px; left:-500px; 
} 

dislplay: none; không hiển thị cho một bot trong HTML (thử nó với quan điểm nguồn) visibility: hidden; left:-500px; top:-500px; (hiển thị khi bạn xem nguồn)

tôi đã sử dụng màn hình: chậu none mật ong trong một thời gian, sau đó chuyển sang tùy chọn hiển thị khi nó xảy ra với tôi rằng trường không hiển thị trong mã nguồn. Làm điều đó với một lớp hoặc id trong CSS, không phải kiểu nội tuyến. Thông báo cho người dùng có nhãn là ý tưởng hay và tên không quan trọng vì hầu hết các bot thường điền vào tất cả các trường.

Chắc chắn không phải là bắt tất cả nhưng rất hiệu quả nếu được sử dụng với một hình ảnh xác thực toán học cơ bản.

1

Hãy thử invisible_captcha (hỗ trợ Rails 3, 4 và 5).

Nó hoạt động khá tốt cho các trang web vừa và nhỏ (về lưu lượng truy cập), với cách tiếp cận đơn giản và linh hoạt. Nó cũng cung cấp các bản đệ trình theo thời gian.

sử dụng cơ bản

Trong biểu mẫu:

<%= form_for(@topic) %> 
    <%= invisible_captcha %> 
    ... 
<% end %> 

Trong điều khiển của bạn:

class TopicsController < ApplicationController 
    invisible_captcha only: [:create, :update] 
    ... 
end 
Các vấn đề liên quan