> 백엔드 개발 > PHP 튜토리얼 > 반복 제출을 방지하기 위해 PHP 양식에 토큰을 추가하는 방법

반복 제출을 방지하기 위해 PHP 양식에 토큰을 추가하는 방법

藏色散人
풀어 주다: 2023-04-08 14:12:02
앞으로
2589명이 탐색했습니다.

토큰에 대한 간략한 이야기

토큰은 토큰이며 가장 큰 특징은 무작위성과 예측 불가능성입니다. 일반 해커나 소프트웨어는 이를 추측할 수 없습니다.

그렇다면 토큰의 기능은 무엇인가요? 원리는 무엇입니까?

토큰은 일반적으로 반복적인 양식 제출과 안티 csrf 공격(교차 사이트 요청 위조)을 방지하기 위해 두 가지 위치에서 사용됩니다.

둘 다 원칙적으로 세션 토큰을 통해 구현됩니다. 클라이언트가 페이지를 요청하면 서버는 임의의 숫자 토큰을 생성하고 세션에 토큰을 배치한 다음 클라이언트에 토큰을 보냅니다(보통 숨겨진 양식을 구성하여). 다음에 클라이언트가 요청을 제출하면 토큰이 양식과 함께 서버에 제출됩니다.

그런 다음 "anti csrf 공격"에 적용되면 서버는 토큰 값이 세션의 토큰 값과 동일한지 확인하기 위해 요청이 유효한지 여부를 증명할 수 있습니다. 서서히 나아가는.

단, "반복 양식 제출 방지"에 적용하면 서버측에서 첫 번째 검증이 동일한 후 사용자가 반복적으로 제출하면 두 번째 검증 판단이 실패하게 됩니다. 사용자가 제출한 양식의 토큰은 변경되지 않았지만 서버 측 세션의 토큰은 변경되었기 때문입니다.

위 세션 신청은 비교적 안전하지만 번거롭기도 합니다. 동시에 여러 페이지와 여러 요청이 있는 경우 여러 토큰을 동시에 생성하는 방법을 사용해야 하므로 더 많은 리소스와 리소스가 필요합니다. 실행 효율성이 떨어집니다. 따라서 Session Token 대신에 쿠키에 인증정보를 저장하는 방식을 사용할 수도 있습니다. 예를 들어 "반복 제출"을 처리하는 경우 제출된 정보는 첫 번째 제출 후 쿠키에 기록됩니다. 두 번째로 제출하면 쿠키에 이미 제출 기록이 있으므로 두 번째 제출은 실패합니다.

그러나 쿠키 저장에는 치명적인 약점이 있습니다. 쿠키가 하이재킹되면(XSS 공격으로 사용자 쿠키를 쉽게 얻을 수 있음) 또 다른 게임 오버가 발생합니다. 해커는 CSRF 공격을 직접 구현합니다.

<?php
/*
* PHP简单利用token防止表单重复提交
* 此处理方法纯粹是为了给初学者参考
*/
session_start();
function set_token() {
  $_SESSION[&#39;token&#39;] = md5(microtime(true));
}
function valid_token() {
  $return = $_REQUEST[&#39;token&#39;] === $_SESSION[&#39;token&#39;] ? true : false;
  set_token();
  return $return;
}
//如果token为空则生成一个token
if(!isset($_SESSION[&#39;token&#39;]) || $_SESSION[&#39;token&#39;]==&#39;&#39;) {
  set_token();
}
if(isset($_POST[&#39;test&#39;])){
  if(!valid_token()){
    echo "token error";
  }else{
    echo &#39;成功提交,Value:&#39;.$_POST[&#39;test&#39;];
    echo "<br/>";
    echo "token:".$_SESSION[&#39;token&#39;];
  }
}
?>
<form method="post" action="">
  <input type="hidden" name="token" value="<?php echo $_SESSION[&#39;token&#39;]?>">
  <input type="text" name="test" value="Default">
  <input type="submit" value="提交" />
</form>
로그인 후 복사

추천 학습: PHP 비디오 튜토리얼

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

관련 라벨:
php
원천:segmentfault.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿