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


105

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

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

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

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


5
보안 문자 솔루션을 원하지 않으셔서 감사합니다! IMO, 양식 스팸은 사이트 소유자에게 문제이며이를 방지하는 것은 사용자가 부담해야하는 부담이 아닙니다. 여기의 답변에서 알 수 있듯이 사이트 끝에서 스팸을 처리 할 수있는 대체 방법이 너무 많습니다. 사용자 상호 작용이 필요한 메서드는 게으른 사용자 또는 초보자 만 사용해야합니다.
마이크

답변:


73

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

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

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

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


9
최종 사용자가 매우 빠른 제출을 허용 할 수있는 addons.mozilla.org/en-US/firefox/addon/1882 와 같은 자동 양식 작성기 를 사용하도록 허용하고 싶은지주의하십시오 . captcha뿐만 아니라 최종 사용자를 성가 시게하는 것은 일반적으로 좋지 않으며 특히 서두르는 사람이 (매우) 빠르게 진행하는 것을 막을 때 좋습니다.
snowflake

1
좋은 지적이지만 모든 것은 상황에 따라 다릅니다. 양식이 로그인 양식이면 귀하에게 전적으로 동의합니다. 하지만 봇에서 로그인을 비활성화하는 이유는 무엇입니까? 컨텍스트가 StackOverflow의 이와 같은 주석 상자 인 경우 확실히 알고 있습니다. 주석 상자에 자동 채우기를 사용하면 스패머입니다. 서명에 자동 채우기를 사용하는 경우 실제로 콘텐츠를 입력하는 데 여전히 시간이 필요합니다.
Pindatjuh 2010 년

5
SO는 이와 같은 작업을 수행합니다. 댓글을 빠르게 또는 너무 여러 번 연속으로 편집하면 "당신은 인간입니까?"라는 메시지가 표시됩니다. 페이지.
Jakob Borg

2
해커가 항상 양식을 요청하는 것은 아닙니다. 때로는 신중하게 제작 된 URL (GET 또는 POST 사용)이 적은 노력으로 양식을 여러 번 게시하기에 충분합니다.
crafter

1
보안 문자로이를 구현하십시오. 양식이 너무 빨리 제출 된 경우 실제 사용자가 통과 할 수 있도록 보안 문자를 제시하세요.
Yashovardhan99

75

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

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

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

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


1
봇이 실제로 css 파일을 살펴보고 표시한다고 생각하십니까? ? 나는 쉽게 비활성화 할 수 있기 때문에 JS 기반 솔루션을 사용하지 않습니다.
Gal

1
웹 랭킹을 높이기 위해 관련성이없는 수많은 키워드를 포함하여 웹 마스터에게 오래된 솔루션 인 것 같습니다. Google과 같은 검색 크롤러 봇은 그것이 display : none이라고 생각할 수 있다고 생각합니다. 왜 다른 봇이 그렇게 할 수 없습니까?
snowflake

2
나는이 기술을 지금 두 사이트에서 사용했고 봇 가입은 이제 두 사이트 모두에서 0입니다. 표적 공격에는 도움이되지 않지만 대부분은 공격이나 스팸을 찾고 있습니다.
nirvdrum 2011 년

25
여기서 작은 요점 : JS 문제를 해결하려면 CSS를 사용하여 허니팟 입력을 페이지 상단 위에 배치하세요. 이렇게하면 js를 비활성화해도 괜찮을 것이고,이를 우회하려면 봇이 CSS를 구문 분석 할 수 있어야합니다. 절대 위치를 지정하고 허니팟인지 아닌지에 대한 상식적인 결정을 내립니다. 좀 더 방탄이 방법 :
totallyNotLizards

3
@ alexy13 예 더 간단하지만 답변에서 언급했듯이 봇이 수행하려는 작업을 파악하는 것이 훨씬 더 쉽습니다. 하나의 CSS 속성 만 테스트하면됩니다. 그러나 절대 위치 지정 전략을 사용하는 경우 봇은 입력이 표시되는지 여부를 파악할 수 있도록 모든 위치 지정 규칙 대부분의 요소 상위 규칙을 구문 분석 한 다음 또는 해당 정보에 대해 조치를 취하지 마십시오. 이는 대부분의 (모두는 아니더라도) 봇에게 가치가있는 것보다 더 많은 문제입니다.
totallyNotLizards 2013 년

22

만약에 - 봇은 어떤 찾을 수없는 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 무시


7
합법적 인 사용자의 브라우저는 잠재적으로 bait 입력 필드를 이메일 필드로보고 사용자가 나머지 양식을 자동 완성하도록 선택하면 자동으로 채워질 수 있습니까? 사용자는 화면에서 멀리 떨어진 필드가 채워지는 것을 보지 못할 것이며 여전히 봇처럼 보일 것입니다.
wilbbe01 2016-04-04

나는 의심 autocomplete=nope기본값 것이다 on;-) MDN : 입력 #의 ATTR - 자동 완성
핸들

@handle은 중요하지 않습니다. 봇 미끼 입력입니다. autocomplete="oh sunny day"그 문제에 대해 글 을 쓸 수 있습니다 .
Roko C. Buljan

19

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

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

이 도움을 바랍니다


1
그러나 빠른 / 고급 사용자를 허용하기 위해 제한을 약 3 ~ 5 초로 설정하는 것이 좋습니다. 나는 이와 동일한 접근 방식을 사용하고 내 양식에 대한 제한을 3 초로 설정하여 봇의 99 %를 필터링했습니다.
Kayla 2014

@adnhack 당신은 다음과 같은 것을 의미합니까 : 1) php로 페이지로드시 서버 시간을 얻고 세션을 만듭니다. 2) 사용자 또는 봇이 양식을 작성하고 제출을 클릭하고 $.post모두 외부 PHP 파일 로 전송합니다. 3) 외부 PHP에서 다시 서버 시간을 얻고 세션 시간과 비교합니까?
Andris 2015

16

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

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

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


흥미롭게도 다른 답변보다 효과적인지 알고 있습니까? 숨겨진 텍스트 상자 또는 양식을 채우는 데 걸리는 시간을 추적합니까?
Austin Henley 2012 년

4
이것은 또한 원치 않는 방향을 따르지 못하는 사용자를 잡을 수 있습니다.
wilbbe01

나는 이것을 좋아한다! 봇이 빈 필드와 채워진 필드의 다른 조합을 시도하기 시작할 때까지 ... 테스트하는 가장 좋은 방법은이를 구현하고 다음 중 하나로 스캔하는 것입니다. sectoolmarket.com/…
nmit026

봇을 관리하는 사람이 코드를 알아 내고 조정하지 않는 한 효과적입니다.
Talha Awan

11

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


2
답변 대신 더 많은 평판을 얻으면 댓글로 추가 해주세요;)
Rob

3
이것은 접근성 문제를 나타냅니다. 허니팟 색인은 스크린 리더를 사용하는 사용자에게 숨겨지지 않습니다.
Otterfan

5
저는 맹인 사용자인데 이와 같은 양식 필드를 한 번 발견했는데 그 위에있는 레이블에 "이것이 보이면 비워 두십시오." 매우 효과적인 IMO.
Parham Doustdar 2016-06-14

8

http://recaptcha.net/

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

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

또한보십시오


5
사용자로서 저는 recaptcha를 자주 알아 내기가 어렵습니다. 일부 단어는 읽기가 너무 어려워서 3-4 번 시도해야합니다. 이것은 확실히 로봇 문제에 도움이 될 것입니다.
Brian


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.');
}

?>

또한 캡 차는 훌륭하며 스팸에 대한 최상의 방어 수단입니다.


감사합니다. 자바 스크립트는 어떤 브라우저에서든 쉽게 비활성화 할 수 있으므로 "스팸 방지 메커니즘"을 없애 버릴 수 있으므로 좀 더 글로벌 한 것을 찾고 있습니다.
Gal

내가 틀렸을 지 모르지만 이것은 모든 JS-disabled 사용자에게 '당신은 나쁜 클라이언트입니다, pls를 떠나십시오.'라고 말하지 않습니까?
Gal

Gal, 그 간단한 예제는 클라이언트 측 js가 설정 한 요청 변수에 대해 유효성을 검사하는 방법을 보여줍니다.
John Himmelman

@John Himmelman Captchas는 해결할 수 있으며 스팸에 대한 최선의 방어책은 아닙니다. 저렴한 비용으로 양식 캡차를 해결할 수있는 anti-captcha.com 과 같은 유료 서비스 가 있습니다.

이 접근 방식의 문제점은 PhantomJS를 사용하는 많은 봇을 보았다는 것입니다. 이것은 그들이 통과하는 것을 허용 할 것입니다.
Parham Doustdar

4

아직 아무도이 방법을 언급하지 않은 것에 놀랐습니다.

  • 페이지에 작고 숨겨진 이미지를 포함하세요.
  • 이 이미지를 제공 할 때 쿠키를 배치하십시오.
  • 양식 제출을 처리 할 때 쿠키를 확인하십시오.


장점 :

  • 사용자와 개발자에게 편리함
  • 믿을만한 것 같다
  • 자바 스크립트 없음

단점 :

  • 하나의 HTTP 요청을 추가합니다.
  • 클라이언트에서 쿠키를 활성화해야합니다.


예를 들어,이 방법은 WordPress 플러그인 Cookies for Comments에서 사용 됩니다.


PhantomJS와 같은 것을 사용하는 봇은이 문제를 쉽게 해결할 수 없을까요?
Parham Doustdar 2016-06-14

1
풀 브라우저 엔진이므로 자산 등을로드하는 것이 가능합니다. 그래도 cURL 스크립트보다 훨씬 느리기 때문에 스팸 봇에 자주 사용되는지는 잘 모르겠습니다.
Gras Double

이것이 CSRF 토큰보다 나은 이유는 무엇입니까?
xenoterracide

1
CSRF 토큰은 봇을 전혀 중지시키지 않습니다. 첫 번째 요청, 토큰이 포함 된 양식을 가져옵니다. 두 번째 요청, 토큰을 포함하여 양식을 게시합니다.
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 또는 자바 스크립트 처리, 필드가 숨겨져 있음을 알고, 마우스 이동 에뮬레이션 또는 키보드 입력 에뮬레이션 ...
Adam

나는 지금 당신의 요지를 본다. 답변에 "하지만 그 예는 예를 들어 ..."라는 마지막 문장을 추가 할 수도 있습니다. 그것이 당신이 의미하는 바를 이해하는 데 도움이 되었기 때문입니다. 처음에는 "봇이 할 수 없다고 가정 할 수 없다"는 자기 모순적인 주장처럼 보였지만 여전히 봇이 할 수 없다고 가정 할 수없는 것들을 나열했습니다. 그러나 요점의 핵심은 귀하의 예제 (제출 버튼을 선택해야 함)가 더 어렵다는 것입니다. 이제는 (이제 이해합니다) 훌륭한 대답입니다. +1
Hawkeye

3

매우 간단한 방법은 같은 필드를 제공 <textarea style="display:none;" name="input"></textarea>하고이 필드 가 채워진 모든 응답을 삭제하는 것입니다.

또 다른 접근 방식은 Javascript를 사용하여 전체 양식 (또는 필드 이름 만)을 생성하는 것입니다. 소수의 봇이 실행할 수 있습니다.

어쨌든, 당신은 대만이나 인도에서 게시 된 링크 당 $ 0.03을 지불하는 라이브 "봇"에 대해 많은 일을하지 않을 것이며, 그렇게 생활하게됩니다.


2
나는이 대답이 거의 7 년이라는 것을 알고 있지만 이것은 언급 할 가치가 있다고 생각합니다. 이러한 유형의 보호를 피하기 위해 많은 봇이 style = "display : none"으로 필드를 무시하도록 프로그래밍 할 수 있습니다.
Kenny Johnson

입력을 가리고, 자바 스크립트를 사용하고, 그 위에 더미 요소를 표시하고, 가시 영역 밖으로 이동하고, 배경 또는 레이아웃 장식과 완벽하게 혼합되도록 스타일을 지정하는 등 수십 가지 방법이 있습니다. 입력 이름 무작위 화 (해싱) (및 매핑 유지) of hashed => original in session server-side)는 이름을 힌트로 사용하고 유효한 입력을 수동으로 매핑하는 데 도움이됩니다. 어쨌든 수동 스팸에 대한 방어는 없습니다.
SF.

2

적어도 내 경험상 100 % 효과적이며 reCAPTCHA 및 유사한 접근 방식의 사용을 피하는 스팸 발송자를 차단하는 간단한 방법이 있습니다. 이 접근 방식을 구현 한 후 지난 5 년 동안 내 사이트의 html 양식 중 하나에서 하루에 거의 100 개의 스팸이 0이되었습니다.

대부분의 html 양식 처리 스크립트 (저는 FormMail.pl을 사용함)의 이메일 ALIAS 기능과 함께 가장 간단한 그래픽 프로그램에서 쉽게 생성되는 그래픽 제출 "코드"를 활용하여 작동합니다. 이러한 그래픽 중 하나에는 코드 M19P17nH와 "왼쪽에 코드를 입력하십시오"라는 프롬프트가 포함됩니다.

이 특정 예에서는 임의의 문자와 숫자 시퀀스를 사용하지만 방문자에게 익숙한 비 영어 버전의 단어를 사용하는 경향이 있습니다 (예 : "pnofrtay"). 양식 필드에 대한 프롬프트는 양식에 표시되지 않고 그래픽에 내장되어 있습니다. 따라서 로봇에게 그 폼 필드는 그 목적에 대한 단서를 제공하지 않습니다.

여기서 유일한 트릭은 양식 html이이 코드를 "수신자"변수에 할당하는지 확인하는 것입니다. 그런 다음 메일 프로그램에서 사용하는 각 코드가 사용하려는 전자 메일 주소를 가리키는 전자 메일 별칭으로 설정되어 있는지 확인합니다. 로봇이 읽을 양식에 어떤 종류의 프롬프트도없고 이메일 주소도 없기 때문에 빈 양식 필드에 무엇을 입력해야할지 알 수 없습니다. 양식 필드에 아무것도 입력하지 않거나 허용 가능한 코드를 제외하면 양식 제출이 실패하고 "잘못된 수신자"오류가 발생합니다. 내 경험상 실제로 필요한 것은 아니지만 다른 형태에 다른 그래픽을 사용할 수 있습니다.

물론, 인간은 reCAPTCHA와 관련된 모든 문제 및 유사하고 우아한 계획 없이도이 문제를 순식간에 해결할 수 있습니다. 스팸 발송자가 수신자의 실패에 응답하고 이미지 코드를 로봇에 프로그래밍하는 경우 로봇이 응답하도록 하드 코딩되었음을 인식하면 쉽게 변경할 수 있습니다. 이 접근 방식을 사용한 지 5 년 동안 저는 제가 사용하는 양식에서 스팸을받은 적이 없으며 양식을 사용하는 사람으로부터 불만을 제기 한 적이 없습니다. 나는 이것이 로봇의 OCR 기능으로 이길 수 있다고 확신하지만 html 양식을 사용하는 내 사이트에서 이런 일이 발생한 적이 없습니다. 또한 "스팸 트랩"(내 스팸 방지 정책을 가리키는 숨겨진 "여기로 오십시오"html 코드)을 사용하여 좋은 효과를 보였지만 효과는 약 90 %에 불과했습니다.


1

여기에서 많은 것을 생각하고 있습니다.

  1. JS (원하지 않지만)를 사용하여 마우스 이동, 키 누름, 마우스 클릭 추적
  2. 추천 URL을 가져 오는 중 (이 경우 동일한 도메인의 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

로봇은 자바 스크립트를 실행할 수 없으므로 자바 스크립트를 사용하여 페이지에 일종의 숨겨진 요소를 삽입 한 다음 양식 제출 전에 존재 여부를 감지하는 것과 같은 작업을 수행하지만 일부 사용자는 자바 스크립트도 비활성화 할 수 있으므로주의하세요.

그렇지 않으면 "인간성"에 대한 클라이언트 증명 형식을 사용해야 할 것 같습니다.


4
스마트 로봇 자바 스크립트 실행할 수 있습니다 . 자바 스크립트 솔루션을 사용하면 로봇의 99 %를 차단할 수 있습니다
Ben Scheirman

봇이 경우 플러그인이 브라우저는 자바 스크립트를 실행하고 (일부 플래시 또는 WebGL을 렌더링하고있는 경우에도) 것들을 사용자 페이지를 볼 수 있습니다
CoffeDeveloper

사람들이 JavaScript를 비활성화하는 것이 걱정된다면 CSS를 사용하여 페이지 위에 텍스트 필드를 배치하십시오.
Chewie The Chorkie 2015 년

0

봇의 스팸을 피하기 위해 내가 찾은 최고의 솔루션은 양식에 매우 사소한 질문이나 필드를 사용하는 것입니다.

다음과 같은 필드를 추가해보십시오.

  • 상자 옆에 "hello"를 복사합니다.
  • 1 + 1 =?
  • 상자에 웹 사이트 이름 복사

이러한 트릭은 사용자가 양식에 입력해야하는 내용을 이해해야하므로 대규모 봇 양식 채우기의 대상이되기가 훨씬 더 어려워집니다.

편집하다

질문에서 언급했듯이이 방법의 뒷면은 사용자가 양식을 확인하는 추가 단계입니다. 그러나 제 생각에는 captcha보다 훨씬 간단하고 양식을 채울 때의 오버 헤드가 5 초 이하로 사용자 관점에서 받아 들일 수 있습니다.


사용자로서 나는 그 쓰레기가 싫다. 스팸이 문제라는 것을 알지만 사이트 사용자로서 내 문제는 무엇입니까? 댓글 스팸은 사이트 소유자의 문제이므로 사용자가이를 방지하는 부담을 져서는 안됩니다. 만약 당신이 가게에 들어갔을 때 그들이 걸레질을 원하지 않아 신발 위에 보호용 옷을 입혀 달라는 요청을 받았다면, 당신의 생각은 어떻겠습니까? 몇 초 밖에 걸리지 않지만 부담하는 것은 아닙니다.
마이크

@Miki 스팸은 사이트 소유자가 시간을 낭비하게 만듭니다. 시간은 돈이고 내가 파는 것은 당신에게 더 비쌀 것입니다. 당신의 주장은 "나는 당신이 임대료를 내야하는 것은 상관 없습니다. 나는 생산비를 + 1 $ 지불하고 싶습니다. 당신은 어떻게 임대료를 내 문제입니까"라고 말할 수 있습니다. 당신은 당신이 등, 호스팅 교통, 시간을 지불 뭔가 구입하면
미하이 P.

@Mike-양식이 작동하기를 원하기 때문에 문제입니다 (분명히 사용하고 있기 때문에). 기계는 가장 모호한 사이트조차 찾아 내고 하루에 수만 건의 제출물을 스팸으로 처리하여 해당 양식을 사용할 수 없게 만듭니다. 따라서 다음에 웹 사이트의 양식을 사용하여 중소기업에 질문을 제출하고이를 수행하기 위해 9 + 3을 추가해야합니다. 그리고 스스로에게 "왜이 작업을 수행해야합니까?"라고 자문 해보십시오. 귀하의 답변은 "실제로 내 질문에 대한 답변을 원하기 때문에"일 수 있습니다.
짐보 조니

@JimboJonny 당신은 내 요점을 완전히 놓쳤습니다. 스팸은 (제가 언급했듯이) 문제이지만 사용자 경험을 손상시키지 않는 백엔드에서 스팸을 해결할 수있는 방법이 있습니다. 저는 현재 수십 개 (수백 개, 심지어)의 웹 사이트에 연락처 양식을 배포하고 있으며, 사용자가 험난하게 뛰어 넘게 만드는 것이 아니라 프로그래밍 방식으로 스팸을 처리했기 때문에 스팸이 최소화됩니다 (양식당 한 달에 몇 개의 스팸 메시지). 제 요점은 스팸이 문제가 아니라는 것이 아닙니다. 그것은 문제입니다. 내 요점은 사용자의 경험을 방해하지 않고 해결할 수있는 방법이 있다는 것입니다.
마이크

@JimboJonny 사례에서이 질문에 대해 가장 높은 순위 (및 승인 된) 답변을 살펴보십시오. 어떤 종류의 사용자 입력도 포함하지 않습니다. 이것이 스팸 완화의 방식입니다.
마이크

0

튜토리얼 이 JQuery 사이트에 있습니다. JQuery이지만 아이디어는 프레임 워크에 독립적입니다.

JavaScript를 사용할 수없는 경우 CAPTCHA 유형 접근 방식으로 대체해야 할 수 있습니다.


0

이 작업을 수행하는 쉬운 방법은 값이있는 필드를 입력하고 사용자에게이 필드의 텍스트를 제거하도록 요청하는 것입니다. 봇은 그것들을 채울뿐입니다. 필드가 비어 있지 않으면 사용자가 사람이 아니며 게시되지 않음을 의미합니다. 보안 문자 코드와 동일한 목적입니다.


0

그저 아이디어, id는 내 응용 프로그램에서 사용했으며 잘 작동합니다.

javascript 또는 jquery를 사용하여 마우스 움직임에 대한 쿠키를 생성하고 서버 측에서 쿠키가 존재하는지 확인할 수 있습니다. 인간 만 마우스를 가지고 있기 때문에 쿠키는 그들 만 생성 할 수 있습니다. 쿠키는 타임 스탬프 또는 유효성을 검사 할 수있는 토큰 일 수 있습니다.


흥미로운 아이디어! 현실 세계에서 이것을 사용 했습니까?
skybondsor

작동하지 않습니다. 요즘 스패머는 브라우저에서 실행되는 소프트웨어를 사용하고 있습니다. 따라서 쿠키를 생성하는 사용자 경험을 모방 한 다음 소프트웨어에서 생성 된 다양한 콘텐츠를 사용하여 x 번 실행할 수 있습니다.
Norbert Norbertson

사용자가 마우스를 사용하지 않으면 작동하지 않습니다. 양식이 올바르게 설정된 경우 사용자는 키보드를 사용하여 전체 양식을 채울 수 있어야합니다. 다음 필드로 이동하고 스페이스 바를 사용하여 라디오 버튼을 선택하고 제출 버튼을 탭할 때 스페이스 바 (또는 Enter)를 사용할 수 있습니다.
Kenny Johnson

0

사용 1) 토큰이있는 양식 2) IP 주소로 지연을 형성하는 양식 확인 3) IP 차단 (선택 사항)


0

내 경험상 양식이 "연락처"양식이면 특별한 조치가 필요하지 않습니다. 스팸은 웹 메일 서비스에 의해 적절하게 필터링됩니다 (서버 스크립트를 통해 웹 양식 요청을 추적하여 이메일에 효과적으로 도달하는 것을 확인할 수 있습니다. 물론 좋은 웹 메일 서비스가 있다고 가정합니다.

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

저는 그것이 좋지 않다고 생각합니다. 실제로 제가 이루고 싶은 것은 제가 관심있는 사용자들 (예를 들어 "CV"페이지를보고 적절한 연락처를 사용한 사용자 들이기 때문에 특정한 행동을하는 사용자들로부터 이메일을받는 것입니다) 형태). 따라서 사용자가 원하는 작업을 수행하면 세션 추적을 시작하고 쿠키를 설정합니다 (항상 세션 쿠키를 설정하지만 세션을 시작하지 않을 때는 사용자에게 세션이 있다고 믿도록 만든 가짜 쿠키입니다). 사용자가 원치 않는 작업을 수행하면 세션을 유지하지 않으므로 과부하 등이 없습니다.

또한 광고 서비스가 사용자가 "광고를 봤는지"확인하기 위해 일종의 API (아마도 이미 존재하는)를 제공하는 것이 좋을 것입니다. 광고를보고있는 사용자가 실제 사용자 일 가능성이 높지만 그렇지 않은 경우 어쨌든 적어도 1 개의 뷰를 얻으므로 손실이 없습니다. (그리고 저를 믿으세요. 광고 컨트롤은 혼자서 할 수있는 것보다 더 정교합니다.)


0

실제로 디스플레이가 있는 함정 : 어떤 것도 매력처럼 작동 하지 않습니다 . CSS 선언을 전역 스타일 시트가 포함 된 파일로 이동하면 스팸 봇도이를로드하게됩니다 (직접 style = "display : none;" 선언은 스팸 봇에 의해 해석 될 수 있습니다. 문서 자체 내에서 로컬 스타일 선언).

이것은 다른 대책과 결합되어 모든 스팸 봇이 자신의 정크를 언로드하도록 의논해야합니다. (저는 방명록을 다양한 방법으로 확보하고 있으며 지금까지 내 주요 함정에 빠졌습니다. 그러나 어떤 봇이이를 우회하면 트리거 할 준비가 된 다른 사용자).

내가 사용하고있어 (일반 또는에서 CSS를 처리하지 않는 브라우저를 사용 또한 경우에 유효하지 않은 필드로 설명 가짜 양식 필드의 조합입니다 : 없음 디스플레이 , 정신 검사 (즉, 입력의 형식입니다 특히) 유효합니까?), 타임 스탬프 (너무 빠르거나 느린 제출 모두), MySQL (이메일 및 IP 주소 및 플러드 필터 기반 블랙리스트 구현 용), DNSBL (예 : Spamhaus의 SBL + XBL), 텍스트 분석 ( 예를 들어 스팸을 강력하게 나타내는 단어) 및 확인 이메일 (제공된 이메일 주소가 유효한지 여부를 결정하기 위해).

확인 메일에 대한 한 가지 참고 사항 :이 단계는 전적으로 선택 사항이지만 구현하기로 선택한 경우이 프로세스는 가능한 한 사용하기 쉬워야합니다 (즉, 전자 메일에 포함 된 링크를 클릭하는 것으로 요약되어야합니다. ) 해당 이메일 주소를 일정 기간 동안 화이트리스트에 추가하여 사용자가 추가 게시물을 작성하려는 경우 후속 확인을 피할 수 있도록합니다.


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

점점 더 정교 해지는 스팸 봇과 자동화 된 브라우저와 같은 기술로 인해 스팸의 출처를 파악하기가 더 어려워 질 것입니다. 그러나 소프트웨어, 사람 또는 둘 다에 의해 게시되었는지 여부에 관계없이 스팸은 내용 때문에 스팸입니다. 가장 좋은 해결책은 Cleantalk 또는 Akismet과 같은 스팸 방지 API를 통해 게시 된 콘텐츠를 실행하는 것입니다. 비교적 저렴하고 효과적이며 사용자를 번거롭지 않습니다. API를 사용하기 전에 양식 제출 시간과 덜 정교한 봇에 대한 기타 기존 검사를 확인할 수 있습니다.


호기심에서 reCAPTCHA에 대한 느낌은 어떻습니까? 다른 유료 서비스를 처음 언급했지만 reCAPTCHA와 비교하면 어떻습니까? 그리고 / 또는 무료 서비스를 통해 이러한 서비스를 추천하는 이유는 무엇입니까?
Hawkeye

0

자바 스크립트 유효성 검사 후 올바른 작업 속성을 추가하여 스팸 로봇을 속일 수 있습니다. 로봇이 Javascript를 차단하면 양식을 올바르게 제출할 수 없습니다.

HTML

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

자바 스크립트

$('#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

내 5 센트 가치. 이것의 목적이 꽤 괜찮게 들리는 로봇의 99 %를 중지하는 것이고, 로봇의 99 %가 자바 스크립트를 실행할 수없는 경우 모든 것을 능가하는 최상의 솔루션은 단순히 제출 작업이있는 양식을 사용하지 않는 것입니다. 게시물 URL.

양식이 자바 스크립트를 통해 제어되고 자바 스크립트가 양식 데이터를 수집 한 다음 HTTP 요청을 통해 전송하는 경우 어떤 로봇도 양식을 제출할 수 없습니다. 제출 버튼은 자바 스크립트를 사용하여 양식을 보내는 코드를 실행하기 때문입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.