php 表单加入Token防止重复提交

Token浅谈
Token,就是令牌,最大的特点就是随机性,不可预测。一般黑客或软件无法猜测出来。
Token作用与原理
Token一般用在两个地方

  • 防止表单重复提交
  • anti csrf攻击(跨站点请求伪造)

两者在原理上都是通过session token来实现的。
当客户端请求页面时,服务器会生成一个随机数Token,并且将Token放置到session当中,然后将Token发送给客户端(一般通过构造hidden表单)。
下次客户端提交请求时,Token会随着表单一起提交到服务器端。
然后,如果应用于"anti csrf攻击",则服务器端会对于Token值进行验证,判断是否和session中的Token值相等,若相等,则可以证明请求有效,不是伪造的。
不过,如果应用于“防止表单重复提交”,服务器端第一次验证相同过后,会将session中的Token值更新,若用户重复提交,第二次的验证判断将失败,因为用户提交的表单中的Token值没变,但服务器端session中的Token已经改变了。
上面的session应用相对安全,但也相对繁琐,同时当多页面请求时,必须采用多Token同时生成的方法,这样占用更多资源,执行效率会降低。
因此,也可用cookie存储验证信息的方法来代替session Token。比如,应对“重复提交”时,当第一次提交后便把已经提交的信息写到cookie中,当第二次提交时,由于cookie已经有提交记录,因为第二次提交会失败。
不过,cookie存储有个致命弱点,如果cookie被劫持(xss攻击很容易得到用户cookie),那么有一次gameover。
黑客将直接实现csrf攻击。

<?php

/*

* PHP简单利用token防止表单重复提交

* 此处理方法纯粹是为了给初学者参考

*/

session_start();

function set_token() {

  $_SESSION['token'] = md5(microtime(true));

}

function valid_token() {

  $return = $_REQUEST['token'] === $_SESSION['token'] ? true : false;

  set_token();

  return $return;

}

//如果token为空则生成一个token

if(!isset($_SESSION['token']) || $_SESSION['token']=='') {

  set_token();

}

if(isset($_POST['test'])){

  if(!valid_token()){

    echo "token error";

  }else{

    echo '成功提交,Value:'.$_POST['test'];

    echo "<br/>";

    echo "token:".$_SESSION['token'];

  }

}

?>
发布了48 篇原创文章 · 获赞 0 · 访问量 340

猜你喜欢

转载自blog.csdn.net/qq_21389693/article/details/105712946
今日推荐