2010-04-08 2 views
8

게임 웹 사이트를 운영하므로 로그인 한 사용자가 많아서 2 분마다 한 번씩 할 수 있습니다.PHP 확인 코드 보안 문자

나는 CAPTCHA 시스템을 가지고 있으며, 어떤 것들은 항상 코드를 요구할 것이고, 다른 것들은 10 분에 한 번 물어볼 것이다.

일부 플레이어는 오페라에서 자동 제출 기능을 사용하고 CAPTCHA 시스템이이를 중지합니다.

내 질문은 내가 코드를 요청한 시간을 최소화 할 수 있지만이 자동 제출을 사용하는 사람들을 어떻게 중지시킬 수 있습니까?

+0

비 Captcha 솔루션에 대한 아이디어가 있다고 생각하지만 자세한 내용이 필요합니다. 그들은 자동 제출을 어떻게 사용합니까? 당신은 무엇을 막기를 원합니까? 너무 빨리 제출하거나 너무 자주 제출하거나 키보드를 사용하지 않을 때 제출 하시겠습니까? – naugtur

+0

지금 내 아이디어를 게시하기로 결정했지만 여전히 대답 할 수 있습니다 – naugtur

답변

6

내가 제대로 이해한다면이 작업에는 보안 문자가 필요하지 않습니다. 나는 사용자가 자신의 컴퓨터 앞에 앉아서 자신이 클릭했는지 확인하려고한다고 가정합니다.

새로운 아이디어

넣어 여러 이미지가 양식에 제출 :

<input type="image" name="send1" src="buttons.php?i=1" /> 
... 
<input type="image" name="send8" src="buttons.php?i=8" /> 

양식 1과 8 사이의 임의의 숫자를 얻을 $_SESSION['submitnumber']에 저장 생성 할 때. 두 개의 동일한 크기의 이미지를 만듭니다. 하나는 양식의 기본 배경으로 채우고 다른 하나는 제출 버튼과 같습니다.

header("Content-Type: image/jpeg"); 
flush(); 
readfile($filename); 

을하고 그렇지 않으면 $_GET[i]!=$_SESSION['submitnumber']이 제출 이미지를 반환하는 경우 빈 이미지를 반환 : 이 코드와 그 뜻을 출력 이미지 buttons.php 만듭니다.

) 올바른 imagesubmit을 클릭 할 경우

양식을 수락

그것은 보안 문자의 일종이지만, 사람들이 알 수 없습니다 (사용자가 버튼을 클릭하면 브라우저가 당신에게 send1X 같은 좌표를 보내드립니다)

1 매우 독특한 형태의 토큰을 생성합니다 된 아이디어는

당신은 두 가지가 필요합니다.

을 넣고 <input type="hidden" name="timertoken" value="someweirdstring" /> "someeirdstring"을 생성하여 일부 (사용자 이름 및 시간) 의존적 인 것의 md5 해시가되게합니다.이것에 대해 자세히 설명 할 수는 있지만 이것은 안전과 CSRF 공격 차단을위한 기본 폼 토큰입니다. 게시 후에 토큰이 확인됩니다.

예 :

이되지 토큰 메커니즘의 전형적인 구현 이지만, 충분합니다.

$token=generatesomerandomtext(); 
$_SESSION['token']=$token; 

//... somewhere later when outputing forms:  
echo '<input type="hidden" name="token" value="'.$token.'" />'; 

//and when it comes back: 
if($_POST['token']==$_SESSION['token']) { 
    //it's ok 
    } 

등이 전부입니다. 이 간단한 예제는 모든 페이지에 대해 고유 한 토큰을 만들고 폼에 넣습니다. 시간에 의존하지 않고 md5를 사용하지 않지만 토큰을 세션에 저장합니다. 수락 될 양식을 자동으로 보내려면 사용자가 토큰을 생성하거나 복사 한 양식을 사용해야합니다.

실제 양식 토큰 예제는 다음과 같습니다. $ token = md5 ($ username.'Some secret text '. $ date. $ timeRoundedTo10Minutes);

//... somewhere later when outputing forms:  
echo '<input type="hidden" name="token" value="'.$token.'" />'; 

//and when it comes back: 
if(
($_POST['token']==md5($username.'some secret text'.$date.$timeRoundedTo10Minutes)) || 
($_POST['token']==md5($username.'some secret text'.$date.$timeRoundedTo10Minutes-10minutes))) { 
    //it's ok 
    } 

왜 사용자 이름입니까? 한 사용자의 토큰을 사용하여 다른 사용자를 해킹 할 수있는 가능성을 없애기 때문에 왜 비밀 텍스트 ('소금')가 필요합니까? 누군가는 다른 사용자의 이름을 시간과 함께 집어 넣을 수 있고 md5를 할 수 있기 때문에 소금을 추측하지 않고는 할 수 없습니다. 왜 두 가지 비교가 필요합니까? 지금은 22:44:59 - 토큰이 22:40으로 생성되고 사용자가 22:45:30을 보내면 22:50으로 반올림되며 토큰과 일치합니다. 10 분 후에 다시 가져옵니다. .

기본 예입니다. 참고로 this 질문을 참조하십시오.

제출 버튼을 <input type="image" ...으로 변경 버튼이 클릭 된 x 및 y 좌표를 게시합니다. 사양에서 누가 이것을 생각해 냈는지 모르지만 처음 사용할 수 있습니다! :)

사용자가 클릭했는지 확인하십시오. 좌표가 있는지 (클래식 제출은 전송되지 않음)이를 간단하게 해킹하지 못하도록 차단해야합니다. 플레이어의 마지막 x 및 y도 기억할 수 있습니다. 세션 비교. 매번 다른 코드를 보내려면 해킹하는 것이 훨씬 어렵습니다.

양식 토큰은 사용자가 클릭 좌표를 시뮬레이트 할 임의의 필드를 사용하여 양식의 사본을 준비하지 못하게합니다. 양식 필드를 재정의하기 어려울 때마다 토큰이 변경됩니다.

이것은 여전히 ​​사용자 스크립트 기능으로 해킹 할 수 있지만 훨씬 어렵습니다. 그리고 한 시간에 한 번만 captcha를 추가하면 아무도 한 시간 동안 만 도움이되는 스크립트를 작성하지 않아도됩니다 (그리고 약간의 노력과 지식이 필요합니다).

+0

모두가 마우스를 사용하지 않습니다 ... – ntd

+0

아무것도하지 않는 것보다 더 기대하는 것이 좋습니다. 그들이 키보드를 사용하면, 그들은 지금 그들이 얻는 captcha를 볼 것입니다. 그리고 입력을 제출하지 않는 자바 스크립트 줄을 작성하면 그냥 lynx-alikes를 남기지 않습니다. Hinek이 captcha를 사용한다면 이미 지원되지 않습니다. – naugtur

+0

이 토큰에 대해 더 자세히 기록해 주실 수 있습니까? 때로는 한 페이지에 여러 양식이있는 경우 문제가 발생합니까? 그리고 토큰을 생성하여 내 데이터베이스에 저장하고 폼에 추가 한 다음 서로를 확인하십시오. 또는 마지막으로받은 토큰을 저장하고 동일한 토큰을 두 번 게시하는지 확인하십시오. – Juddling

3

수신 한 데이터에 따라 발신자가 사용자라는 증언을 수집 할 수 있습니다. 발신자가 로봇 인 경우 CAPTCHA 만 요청하십시오.

Evidents은 다음과 같습니다

  • 사용자 에이전트 (신뢰할 수 없습니다, 오페라는이 가짜 수 있기 때문에)에 제출하는 간격이 트리거
  • 이 (더 정확한 호출이, 즉 2 분마다 히트 더 데이터가 그것이 분명이 될 수있는 패턴을 반환에 대한 검사 허용하는 경우 가능성이 너무,)
  • ...
  • 봇입니다