>  기사  >  백엔드 개발  >  PHP 양식 보호 팁: 반복적인 양식 제출을 방지하는 방법

PHP 양식 보호 팁: 반복적인 양식 제출을 방지하는 방법

WBOY
WBOY원래의
2023-06-24 11:50:131862검색

데이터 제출을 위해 PHP 양식을 사용할 때 반복적인 양식 제출 문제가 자주 발생합니다. 이로 인해 부정확한 데이터가 발생하거나 더 심각한 경우 시스템 충돌이 발생할 수 있습니다. 따라서 중복 제출을 방지하는 방법을 이해하는 것이 매우 중요합니다. 이 기사에서는 반복되는 양식 제출 문제를 효과적으로 방지하는 데 도움이 되는 몇 가지 PHP 양식 보호 기술을 소개합니다.

1. 양식에 토큰 추가

양식에 토큰을 추가하는 것은 반복 제출을 방지하는 일반적인 방법입니다. 이 방법은 고유한 임의 값이 포함된 양식에 숨겨진 필드를 추가하는 방식으로 작동합니다. 양식이 제출되면 PHP 코드는 이 값이 서버에 저장된 값과 일치하는지 확인합니다. 일치하지 않으면 양식이 반복적으로 제출되었으며 데이터가 처리되지 않음을 의미합니다. 다음은 기본적인 토큰 사용 예시입니다.

<?php
  session_start();
  if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['token'])) {
    $token = $_POST['token'];
    if ($_SESSION['token'] === $token) {
      //处理表单数据
      //...
      unset($_SESSION['token']);
    } else {
      echo '表单已提交!';
    }
  } else {
    $token = md5(uniqid(rand(), true));
    $_SESSION['token'] = $token;
?>
  <form method="post">
    <input type="hidden" name="token" value="<?php echo $token; ?>" />
    <!--其他表单元素-->
    <button type="submit">提交</button>
  </form>
<?php } ?>

이번 예시에서는 먼저 요청이 POST인지 확인하고, POST라면 폼에 있는 토큰 값이 일치하는지 확인합니다. 토큰이 일치하면 양식 데이터를 처리합니다. 데이터를 처리한 후에는 이 토큰이 더 이상 필요하지 않기 때문에 unset 함수를 사용하여 SESSION에서 토큰을 제거합니다. 토큰이 일치하지 않으면 양식이 두 번 제출된 것이므로 양식 데이터가 처리되지 않습니다. 요청이 POST가 아닌 경우 새 토큰을 생성하여 SESSION에 저장하고 양식에 추가합니다.

2. 리디렉션 사용

양식을 제출한 후에도 동일한 URL을 사용하면 양식이 반복적으로 제출됩니다. 이를 방지하려면 리디렉션을 사용할 수 있습니다. 이 기술에는 양식이 제출된 후 원본 양식 페이지가 아닌 다른 페이지로 사용자를 리디렉션하는 중간 페이지가 포함됩니다. 다음은 중복 양식 제출을 방지하기 위해 리디렉션을 사용하는 예입니다.

<?php
  if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    //处理表单数据
    //...
    header('Location: success.php');
    exit;
  }
?>

이 예에서는 양식 데이터를 처리한 후 헤더 기능을 사용하여 사용자를 Success.php 페이지로 리디렉션합니다. 이 페이지는 성공적으로 제출된 후 표시되는 페이지입니다. 여기에는 양식이 포함되어 있지 않으므로 사용자는 브라우저의 "뒤로" 버튼을 사용하거나 페이지를 다시 로드하여 양식을 다시 제출할 수 없습니다.

3. 브라우저 캐시 비활성화

양식을 브라우저에 캐시하면 양식이 반복적으로 제출될 수 있습니다. 브라우저는 사이트의 웹 페이지를 캐시할 수 있으므로 사용자가 브라우저의 뒤로 버튼을 클릭하면 양식이 다시 제출될 수 있습니다. 이를 방지하려면 브라우저 캐싱을 비활성화해야 합니다. 다음은 브라우저 캐싱을 비활성화하는 기본 예입니다.

<?php
  header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");         // Date in the past
  header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // always modified
  header("Cache-Control: no-store, no-cache, must-revalidate");  // HTTP/1.1
  header("Cache-Control: post-check=0, pre-check=0", false);
  header("Pragma: no-cache");                                // HTTP/1.0
?>

이 예에서는 여러 HTTP 헤더를 사용하여 현재 페이지를 캐시하지 않도록 브라우저에 알립니다. 여기에는 과거 날짜에 대한 "만료" 헤더와 페이지 처리 방법에 대한 기타 여러 헤더가 포함됩니다.

결론

PHP 양식을 사용할 때 중복 제출을 방지하는 것이 매우 중요합니다. 위의 방법은 반복적인 양식 제출을 방지하고 데이터 보안을 보호하는 데 도움이 되는 몇 가지 효과적인 기술을 설명합니다. PHP 양식 방어에 대해 자세히 알아보려면 PHP 설명서를 확인하거나 다른 PHP 개발자의 블로그와 기사를 참조하세요.

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

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