내가 제대로 이해한다면이 작업에는 보안 문자가 필요하지 않습니다. 나는 사용자가 자신의 컴퓨터 앞에 앉아서 자신이 클릭했는지 확인하려고한다고 가정합니다.
새로운 아이디어
넣어 여러 이미지가 양식에 제출 :
<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를 추가하면 아무도 한 시간 동안 만 도움이되는 스크립트를 작성하지 않아도됩니다 (그리고 약간의 노력과 지식이 필요합니다).
비 Captcha 솔루션에 대한 아이디어가 있다고 생각하지만 자세한 내용이 필요합니다. 그들은 자동 제출을 어떻게 사용합니까? 당신은 무엇을 막기를 원합니까? 너무 빨리 제출하거나 너무 자주 제출하거나 키보드를 사용하지 않을 때 제출 하시겠습니까? – naugtur
지금 내 아이디어를 게시하기로 결정했지만 여전히 대답 할 수 있습니다 – naugtur