양식의 반복 제출을 방지하는 두 가지 주요 방법은 다음과 같습니다.
1) 리디렉션을 통해(Ajax가 아닌 양식 제출)
2) 세션 토큰을 통해(세션 토큰)
클라이언트가 페이지를 요청하면 서버는 난수를 생성하여 세션에 넣은 다음 클라이언트가 처음으로 제출하면 난수를 클라이언트에 보냅니다. 서버로 전송되면 서버는 난수를 받아 세션에 저장된 난수와 비교하게 되는데, 이때 서버는 이를 첫 번째 제출로 간주합니다. 이때 제출이 다시 반복되면 클라이언트가 서버에 보낸 난수는 이전과 동일하지만 서버의 난수는 변경된 것입니다. 둘이 다르면 서버는 이를 반복 제출로 간주합니다.
난수를 생성하고 md5를 사용하여 암호화합니다.
$_token = md5(microtime()+rand(1,10000)); $_SESSION['_token'] = $_token;
값을 클라이언트에 보내고 다음 형식의 숨겨진 필드로 제출합니다.
<input type="hidden" value="<?php echo $_token;?>" name="_token"/>
그런 다음 제출할 때 제출된 데이터를 서버 세션의 데이터와 비교합니다. 비어 있거나 같지 않으면 불법적인 작업으로 간주됩니다.
if(!isset($_POST('_token'))){ echo json_encode(array('status'=>'failed','msg'=>'非法操作!')); exit(); } if(isset($_POST['_token']) && $_POST['_token']!=$_SESSION['_token']){ echo json_encode(array('status'=>'failed','msg'=>'表单只能提交一次,不能重复提交!')); exit(); }