다음 상황에서는 양식이 반복적으로 제출됩니다.
·제출 버튼을 두 번 클릭하세요.
·새로고침 버튼을 클릭하세요.
·브라우저 뒤로 버튼을 사용하여 이전 작업을 반복하면 양식이 반복적으로 제출됩니다.
·양식을 반복적으로 제출하려면 브라우저 기록을 사용하세요.
·브라우저에서 HTTP 요청을 복제합니다.
·웹페이지가 악의적으로 새로 고쳐졌습니다.
다음은 몇 가지 해결 방법입니다.
1. js를 사용하여 클릭 후 버튼이 회색으로 변하도록 설정합니다.
<form name=form1 method=”POST” action=”/” target=_blank> <p> <input type=”text” name=”T1″ size=”20″> <input type=”button” value=”提交” οnclick=”javascript:{this.disabled=true;document.form1.submit();}”> </p> </form>
버튼을 클릭하면 버튼이 회색으로 바뀌어 클릭할 수 없습니다. 양식을 다시 작성하려면 페이지를 다시 데이터로 채운 후 다시 제출해야 합니다.
관련 추천: "php tutorial"
둘째, session
을 사용하여 세션에 특별한 표시를 하세요. 양식 페이지가 요청되면 특수 문자열이 생성되어 세션에 저장되고 양식의 숨겨진 필드에 배치됩니다. Form 데이터를 접수 및 처리할 때 식별문자열이 존재하는지 확인하고 즉시 세션에서 삭제한 후 정상적으로 데이터를 처리합니다.
양식 제출에 유효한 플래그 문자열이 없으면 양식이 이미 제출되었으며 이 제출이 무시된다는 의미입니다.
이렇게 하면 웹 애플리케이션에 더욱 향상된 XSRF 보호 기능이 제공됩니다.
제출된 페이지를 로드하면 임의의 숫자가 생성됩니다:
$code = mt_rand(0,1000000);
양식의 숨겨진 입력 상자에 저장:
< input type=”hidden” name=”code” value=””>
수신 페이지의 PHP 코드는 다음과 같습니다:
<?php session_start(); if(isset($_POST[‘code'])) { if($_POST[‘code'] == $_SESSION[‘code']){ // 重复提交表单了 }else{ $_SESSION[‘code'] =$_POST[‘code']; //存储code } }?>
3. 쿠키 사용
원칙 및 세션 거의 동일하지만, 사용자의 브라우저가 쿠키를 비활성화하면 이 기능은 더 이상 작동하지 않습니다.
if(isset($_POST[‘submit'])){ setcookie(“tempcookie”,””,time()+30); header(“Location:”.$_SERVER[PHP_SELF]);exit(); } if(isset($_COOKIE[“tempcookie”])){ setcookie(“tempcookie”,””,0);echo “您已经提交过表单”; }
4. 헤더 기능을 사용하여 점프
사용자가 제출 버튼을 클릭하면 데이터 처리 후 다른 페이지로 이동합니다.
if (isset($_POST[‘submit'])) { header(‘location:success.php');//处理数据后,转向到其他页面 }
5. 데이터베이스를 사용하여 제약 조건 추가
고유 제약 조건을 직접 추가하거나 데이터베이스에 고유 인덱스를 생성합니다. 사용자가 반복적으로 제출한 것으로 확인되면 경고 또는 프롬프트가 직접 표시되거나 첫 번째 메시지만 표시됩니다. 제출된 데이터는 가장 직접적이고 효과적인 방법이며 초기 데이터베이스 설계 및 아키텍처를 신중하게 고려해야 합니다.
6. Post/Redirect/Get 모드
제출 후 페이지 리디렉션을 수행하는 것이 소위 Post-Redirect-Get(PRG) 모드입니다. 즉, 사용자가 양식을 제출하면 제출 성공 정보 페이지로 클라이언트 측 리디렉션을 수행합니다.
아아아아위 내용은 PHP에서 여러 제출을 피하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!