[forms] 로봇이 양식을 자동으로 채우는 것을 방지하는 방법은 무엇입니까?

자동으로 생성되는 입력을 방지 할 수있는 충분한 스팸 방지 메커니즘을 마련하려고합니다. 나는 captcha, 1 + 1 =?과 같은 기술을 읽었습니다. 물건은 잘 작동하지만 응용 프로그램의 무료 빠른 사용을 방해하는 추가 단계를 제공합니다 (나는 그런 것을 찾고 있지 않습니다).

모든 양식에서 숨겨진 필드를 설정하려고 시도했지만 display: none;
양식 필드 ID를 추적하고 단순히 채우지 않도록 스크립트를 구성 할 수 있다고 확신합니다.

좋은 자동 양식 채우기 방지 방법을 구현 / 알고 있습니까? HTML 및 / 또는 서버 측 처리로 원활하게 수행 할 수 있고 (거의) 방탄이 될 수있는 것이 있습니까? (JS 없이는 단순히 비활성화 할 수 있습니다).

나는 이것을 위해 세션에 의존하지 않으려 고 노력하고있다 (즉, 과부하를 방지하기 위해 버튼을 클릭하는 횟수를 세는 것).



답변

스팸 방지를 해결하는 구현하기 쉽지만 완벽하지는 않은 (특히 “특정”공격에 대한) 방법은 양식 제출과 페이지로드 사이의 시간을 추적하는 것입니다.

봇은 페이지를 요청하고 페이지를 구문 분석하고 양식을 제출합니다. 이것은 빠릅니다.

사람은 URL을 입력하고, 페이지를로드하고, 페이지가 완전히로드 될 때까지 기다린 다음, 아래로 스크롤하고, 콘텐츠를 읽고, 양식에 주석 / 채우기 여부를 결정하고, 양식을 채우는 데 시간이 필요하고, 제출합니다.

시간의 차이는 미묘 할 수 있습니다. 쿠키없이이 시간을 추적하는 방법에는 서버 측 데이터베이스가 필요합니다. 이는 성능에 영향을 미칠 수 있습니다.
또한 임계 시간을 조정해야합니다.


답변

나는 실제로 간단한 Honey Pot 필드가 잘 작동한다는 것을 알았습니다. 대부분의 봇 은 필요한 필드 유효성 검사기를 살펴보고자하는 모든 양식 필드를 채 웁니다 .

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

텍스트 상자를 만들고 자바 스크립트로 숨긴 다음 서버 에서 값이 비어 있는지 확인 하면 99 %의 로봇이 제거되고 사용자의 99 %는 전혀 불만을 느끼지 않습니다. 자바 스크립트를 비활성화 한 나머지 1 %는 여전히 텍스트 상자를 볼 수 있지만 이러한 경우에 대해 “이 필드를 비워 두십시오”와 같은 메시지를 추가 할 수 있습니다 (모두 신경 쓰는 경우).

(또한 필드에서 style = “display : none”을 수행하면 로봇이이를보고 필드를 버리는 것이 너무 쉽다는 점에 유의하십시오. 이것이 제가 자바 스크립트 접근 방식을 선호하는 이유입니다).


답변

만약에 – 봇은 어떤 찾을 수없는 form모든의를?

3 가지 예 :

  1. AJAX를 사용하여 양식 삽입
  • JS가 비활성화되어 있고 양식을 보거나 제출할 수없는 사용자에게 문제가없는 경우 사용자에게 알리고 noscript 문을 사용하여 먼저 Javascript를 활성화하도록 할 수 있습니다.
<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"> (!) 후 “봇 미끼” 실제 사용자의 이메일 주소를 입력.

감사의 말 :

Developer.Mozilla-양식 자동 완성 끄기
StackOverflow-Tabindex 무시


답변

내가 한 일은 숨겨진 필드를 사용하고 그 위에 타임 스탬프를 넣은 다음 PHP를 사용하여 서버의 타임 스탬프와 비교하는 것입니다.

15 초보다 빠르다면 (폼의 크기에 따라 다름) 그것은 봇이었습니다.

이 도움을 바랍니다


답변

스팸을 사실상 제거하는 매우 효과적인 방법은 “양식을 제출하려면이 텍스트를 제거하십시오!”와 같은 텍스트가 포함 된 텍스트 필드를 만드는 것입니다. 양식을 제출하려면 해당 텍스트를 제거해야합니다.

양식 유효성 검사시 텍스트 필드에 원본 텍스트 또는 해당 사안에 대한 임의의 텍스트가 포함 된 경우 양식을 제출하지 마십시오. 봇은 양식 이름을 읽고 이름 및 이메일 필드를 자동으로 채울 수 있지만 제출하기 위해 실제로 특정 필드에서 텍스트를 제거해야하는지 알 수 없습니다.

저는이 방법을 회사 웹 사이트에 구현했으며 매일받는 스팸을 완전히 제거했습니다. 실제로 작동한다!


답변

공백으로 남아 있어야하는 배경과 동일한 색상의 텍스트 필드 입력 상자를 만드는 것은 어떻습니까? 이렇게하면 봇 읽기 디스플레이 문제를 해결할 수 있습니다.


답변

http://recaptcha.net/

reCAPTCHA는 책을 디지털화하는 데 도움이되는 무료 안티 봇 서비스입니다.

Google이 인수했습니다 (2009 년) :

또한보십시오