>  기사  >  백엔드 개발  >  반복적인 양식 제출을 해결하고 방지하는 PHP 방법

반복적인 양식 제출을 해결하고 방지하는 PHP 방법

墨辰丷
墨辰丷원래의
2018-06-01 14:12:391537검색

PHP에서 양식을 제출할 때 네트워크 속도 등으로 인해 페이지가 갑자기 느리게 로드될 수 있습니다. 사용자가 제출 버튼을 반복적으로 클릭하면 데이터베이스에 여러 개의 데이터가 생성되어 통제할 수 없는 상황이 발생할 수 있습니다. 그렇다면 이 문제를 피하고 해결하는 방법은 무엇입니까? 아래를 살펴보겠습니다.

머리말

왜 양식 제출을 반복적으로 피해야 합니까? 우리는 서버가 불필요한 데이터를 반복적으로 처리하는 것을 원하지 않으며 데이터베이스에서 중복 데이터가 생성되는 것을 방지하기 때문에 반복적인 양식 제출을 피하는 것도 웹사이트를 더 안전하게 만드는 방법입니다.

먼저, 양식 반복 제출이 발생할 수 있는 상황을 살펴보겠습니다. 양식 반복 제출이 발생할 수 있는 상황을 아는 것은 양식 반복 제출 상황을 근본 원인으로 처리하는 데 도움이 될 수 있습니다.

다음 상황에서는 양식이 반복적으로 제출됩니다.

제출 버튼을 두 번 클릭하세요.

새로고침 버튼을 클릭하세요.

브라우저 뒤로 버튼을 사용하여 이전 작업을 반복하면 양식이 반복적으로 제출됩니다.

양식을 반복적으로 제출하려면 브라우저 기록을 사용하세요.

                                                                            브라우저에서 HTTP 요청을 반복했습니다.

웹페이지가 악의적으로 새로 고쳐졌습니다.

다음은 몇 가지 해결 방법입니다.

One: js를 사용하여 클릭 후 버튼이 회색으로 변하도록 설정합니다.

<form name=form1 method=”POST” action=”/” target=_blank>

<p>

<input type=”text” name=”T1″ size=”20″>

<input type=”button” value=”提交” onclick=”javascript:{this.disabled=true;document.form1.submit();}”>

</p>

</form>

버튼을 클릭하면 버튼이 회색으로 변하여 클릭할 수 없습니다. 사용자는 다시 클릭해야 합니다. 양식을 제출하려면 페이지를 새로 고치고 데이터를 다시 입력한 다음 제출해야 합니다.

둘: session

을 사용하여 session에 특수 표시를 추가하세요. 양식 페이지가 요청되면 특수 문자열이 생성되어 session에 저장되고 양식의 숨겨진 필드에 배치됩니다. Form 데이터를 접수 및 처리할 때 식별문자열이 존재하는지 확인하고 즉시 세션에서 삭제한 후 정상적으로 데이터를 처리합니다. session中放一个特殊标志。当表单页面被请求时,生成一个特殊的字符标志串,存在session中,同时放在表单的隐藏域里。接受处理表单数据时,检查标识字串是否存在,并立即从session中删除它,然后正常处理数据。

如果发现表单提交里没有有效的标志串,这说明表单已经被提交过了,忽略这次提交。

这使你的web应用有了更高级的XSRF保护

加载提交的页面时候,生成一个随机数,

$code = mt_rand(0,1000000);

存储在表单的隐藏输入框中:

d865d2dc9c0570d458002786a778230f

在接收页面的PHP代码如下:

<?php

session_start();

if(isset($_POST[‘code&#39;])) {

if($_POST[‘code&#39;] == $_SESSION[‘code&#39;]){

// 重复提交表单了

}else{

$_SESSION[‘code&#39;] =$_POST[‘code&#39;]; //存储code

}

}?>

三:利用cookies

原理和session差不多,但是cookies一旦用户浏览器禁用cookies,这功能就失效了

if(isset($_POST[‘submit&#39;])){

setcookie(“tempcookie”,””,time()+30);

header(“Location:”.$_SERVER[PHP_SELF]);exit();

}

if(isset($_COOKIE[“tempcookie”])){

setcookie(“tempcookie”,””,0);echo “您已经提交过表单”;

}

四:利用header函数跳转

一旦用户点击提交按钮,处理完数据后跳到其他页面

if (isset($_POST[‘submit&#39;])) {

header(‘location:success.php&#39;);//处理数据后,转向到其他页面

}

五:利用数据库来添加约束

直接在数据库里添加唯一约束或创建唯一索引,一旦发现用户重复提交了,直接抛出警告或者提示,或者只处理第一次提交的数据,这是最直接有效的方法,要求前期的数据库设计和架构要考虑周全.

六:Post/Redirect/Get模式。

在提交后执行页面重定向,这就是所谓的Post-Redirect-Get (PRG)

양식 제출에 유효한 플래그 문자열이 없으면 양식이 이미 제출되었으며 이 제출이 무시된다는 의미입니다.

이렇게 하면 웹 애플리케이션에 고급 XSRF 보호 기능이 제공됩니다.

제출된 페이지를 로드할 때 임의의 숫자가 생성됩니다.

$code = mt_rand(0,1000000) 다음 형식의 숨겨진 입력 상자에 저장됩니다.

d865d2dc9c0570d458002786a778230f

수신 페이지의 PHP에서 코드는 다음과 같습니다.

if (isset($_POST[‘action&#39;]) && $_POST[‘action&#39;] == ‘submitted&#39;) {

//处理数据,如插入数据后,立即转向到其他页面

header(&#39;location:submits_success.php&#39;);

}

3: 쿠키 사용

원리는 세션과 유사하지만 사용자의 브라우저가 쿠키를 비활성화하면 쿠키 code>cookiescode>, 이 기능은 유효하지 않습니다

rrreee

4: 헤더 기능을 사용하여 점프

사용자가 제출 버튼을 클릭하면 데이터 처리 후 다른 페이지로 이동

rrreee

🎜다섯 번째: 데이터베이스를 사용하여 제약 조건을 추가하세요🎜🎜🎜사용자가 반복적으로 제출한 것으로 확인되면 경고 또는 프롬프트가 직접 표시됩니다. 처음 제출된 데이터만 처리됩니다. 이것이 가장 직접적이고 효과적인 방법입니다. 이 방법은 초기 데이터베이스 설계 및 아키텍처에 대한 철저한 고려가 필요합니다.🎜🎜🎜Six: Post/Redirect/Get 모드. 🎜🎜🎜제출 후 페이지 리디렉션을 수행하는 것이 소위 PRG(Post-Redirect-Get) 패턴입니다. 즉, 사용자가 양식을 제출하면 클라이언트 측 리디렉션을 수행하고 제출 성공 정보 페이지로 이동합니다. 🎜🎜🎜rrreee🎜🎜🎜🎜🎜Summary🎜🎜🎜🎜위는 PHP가 양식 양식의 반복 제출을 해결하고 방지하는 몇 가지 방법입니다. 위의 방법을 통해 사용자가 F5 키를 눌러 발생하는 반복 제출을 피할 수 있습니다. 반복적인 브라우저 양식 제출에 대한 경고가 표시되고 브라우저에서 앞으로 및 뒤로를 눌러 발생하는 동일한 문제가 제거됩니다. 이 글이 모든 분들의 공부와 업무에 조금이나마 도움이 되었으면 좋겠습니다. 🎜🎜🎜🎜관련 권장 사항: 🎜🎜🎜🎜PHP에 구현된 로그인, 등록 및 비밀번호 수정 기능🎜🎜🎜🎜🎜PHP 익명 기능 및 주의 사항에 대한 자세한 설명🎜🎜🎜🎜🎜PHP에서 call_user_func_array 콜백 함수 사용🎜 🎜 🎜🎜 🎜 🎜🎜🎜🎜

위 내용은 반복적인 양식 제출을 해결하고 방지하는 PHP 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.