>백엔드 개발 >PHP 튜토리얼 >PHP에서 양식 반복 제출 방지에 대한 자세한 설명

PHP에서 양식 반복 제출 방지에 대한 자세한 설명

伊谢尔伦
伊谢尔伦원래의
2017-04-21 13:54:053489검색

사용자가 양식을 제출하면 네트워크 속도로 인해 동일한 기록이 데이터베이스에 반복적으로 삽입되거나 웹 페이지가 악의적으로 새로 고쳐질 수 있으므로 사용자가 양식을 반복적으로 제출하지 못하도록 하는 것은 무시할 수 없는 제한 사항입니다. 사용자가 계속해서 Submit 버튼을 클릭하거나 공격자가 악의적으로 데이터를 제출할 경우, 해당 데이터를 제출한 후 데이터베이스에 데이터를 수정하거나 추가하는 등의 처리 과정에서 문제가 발생할 수 있습니다.

그렇다면 반복적인 양식 제출 현상을 피하려면 어떻게 해야 할까요? 여러 측면에서 제한이 필요합니다. 양식의 반복 제출을 방지하기 위해 PHP의 몇 가지 일반적인 방법을 요약해 보겠습니다.

먼저 프론트엔드에서 제한을 해주세요.

프론트 엔드 JavaScript는 버튼을 한 번 클릭하면 비활성화됩니다. 즉, 이 방법은 단순히 제출 버튼을 여러 번 클릭하는 것을 방지하지만 단점은 다음과 같습니다. 사용자가 javascript 스크립트 Invalid를 비활성화합니다.

고객 언급하기 아래 예에서는 양식의 반복 제출 문제를 처리하는 데 이를 사용합니다. 아래 코드를 참조하세요.

<form method="post" name="register" action="test.PHP" enctype="multipart/form-data">
<input name="text" type="text" id="text" />
<input name="cont" value="提交" type="button" onClick="document.register.cont.value=&#39;正在提交,请等待...&#39;;document.register.cont.disabled=true;document.the_form.submit();">
</form>

사용자가 "제출" 버튼을 클릭하면, 버튼이 회색으로 변해 사용할 수 없게 됩니다

JavaScript의 기능을 사용하지만 OnSubmit() 메서드를 사용하는 또 다른 방법이 있습니다. 양식을 한 번 제출하면 대화 상자가 즉시 나타납니다. 코드는 다음과 같습니다:

<script language="javascript">
<!--
var submitcount=0;
function submitOnce (form){
if (submitcount == 0){
     submitcount++;
     return true;
} else{
    alert("正在操作,请不要重复提交,谢谢!");
    return false;
}
}
//-->
</script>
<form name="the_form" method="post" action="" onSubmit="return submitOnce(this)">
<input name="text" type="text" id="text" />
<input name="cont" value="提交" type="submit">
</form>

위의 예에서 사용자가 "제출" 버튼을 클릭하면 스크립트는 자동으로 현재 상태를 기록하고 submitcount 변수를 증가시킵니다. 1 사용자가 다시 제출을 시도하면 스크립트는 submitcount 변수 값이 0이 아닌 것으로 판단하고 사용자에게 양식이 제출되었음을 알리므로 양식이 반복적으로 제출되는 것을 방지합니다.

둘째, 쿠키 처리를 사용합니다

쿠키를 사용하여 양식 제출 상태를 기록하며, 해당 상태에 따라 양식이 제출되었는지 확인할 수 있습니다. 다음 코드:

<?php
if(isset($_POST[&#39;Go&#39;])){
    setcookie("tempcookie","",time()+30);
    header("Location:".$_SERVER[PHP_SELF]);
    exit();
}
if(isset($_COOKIE["tempcookie"])){
    setcookie("tempcookie","",0);
    echo "您已经提交过表单";
}
?>

클라이언트가 쿠키를 비활성화하면 이 방법은 효과가 없습니다.

셋째, 세션 처리를 사용하세요

PHP의 세션 기능을 사용하면 반복적인 양식 제출을 피할 수도 있습니다. 세션은 서버측에 저장됩니다. 세션 변수는 PHP가 실행되는 동안 변경될 수 있습니다. 따라서 다음에 이 변수에 액세스하면 새로 할당된 값을 얻게 됩니다. 따라서 세션 변수를 사용하여 제출된 값을 기록할 수 있습니다. 일치하지 않으면 사용자가 반복적으로 제출하는 것으로 간주됩니다. 다음 코드를 참조하세요.

<?php
    session_start();
    //根据当前SESSION生成随机数
    $code = mt_rand(0,1000000);
    $_SESSION[&#39;code&#39;] = $code;
?>

페이지 양식에 숨겨진 값으로 임의의 숫자를 전달합니다. 코드는 다음과 같습니다. 🎜>

<input type="hidden" name="originator" value="<?=$code?>">

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

<?php
session_start();
if(isset($_POST[&#39;originator&#39;])) {
    if($_POST[&#39;originator&#39;] == $_SESSION[&#39;code&#39;]){
        // 处理该表单的语句,省略
    }else{
        echo ‘请不要刷新本页面或重复提交表单!’;
    }
}
?>

넷째, 위의 내용 외에 헤더 기능을 사용하여

로 리디렉션합니다. 이 방법에는 더 간단한 방법이 있습니다. 즉, 사용자가 양식을 제출하면 서버 측에서 이를 처리한 후 즉시 다른 페이지로 리디렉션하는 코드는 다음과 같습니다.

if (isset($_POST[&#39;action&#39;]) && $_POST[&#39;action&#39;] == &#39;submitted&#39;) {
    //处理数据,如插入数据后,立即转向到其他页面
    header(&#39;location:submits_success.php&#39;);
}

이렇게 하면 사용자가 새로 고침 키를 사용하더라도 양식이 새 페이지로 리디렉션되고 이 페이지 스크립트는 더 이상 제출된 내용에 신경 쓰지 않으므로 양식이 반복적으로 제출되지 않습니다. 데이터.

위 내용은 PHP에서 양식 반복 제출 방지에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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