• PHP生成token防止表单重复提交


    1、提交按钮置disabled
    当用户提交后,立即把按钮置为不可用状态。这种用js来实现。
    提交前代码如下:

    $("#submit").attr('disabled','true');
    $("#submit").val("正在提交,请稍等");
    执行后,把按钮置为原来状态
    代码如下:

    $('#submit ').removeAttr('disabled');
    $("#submit ").val("确定提交");
    这样只是针对一些简单的前台提交了,如果我们自己做个表单站长提交给我们php逻辑层文件就过滤这那个js了。
    过期时间法
    用户提交按钮后生成一个token(每次业务提交token 为唯一值)存入session,并设置过期时间。当用户再此提交时,检测token是否一致且是否过期,若一致且没有过期,则认为提交了二次
    例子

    <?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'];
      }
    }
    ?>
    <form method="post" action="">
      <input type="hidden" name="token" value="<?php echo $_SESSION['token']?>">
      <input type="text" name="test" value="Default">
      <input type="submit" value="提交" />
    </form>
    方法二

    <?php
    //开启session
    session_start();
    //如果有提交标识
    if(isset($_GET['action']) && $_GET['action'] === 'save'){
      //如果有session且跟传过来的值一样才算提交
      if(isset($_SESSION['__open_auth']) && isset($_POST['auth']) && $_SESSION['__open_auth'] == $_POST['auth']){
       print_r($_POST);
       $_SESSION['__open_auth'] = null;//清空
      else {
       //走起
       header("location: post.php");
      }
      exit();
    }
    //授权
    $auth = $_SESSION['__open_auth'] = time();
    ?>
    <!doctype html>
    <html>
    <head>
      <meta charset="UTF-8">
      <title>post</title>
    </head>
    <body>
      <form action="post.php?action=save" method="post">
      <ul>
        <li>
         <input type="hidden" name="auth" value="<?php echo $auth;?>">
         <input type="text" name="userName">
        </li>
        <li>
         <input type="password" name="userpass">
        </li>
        <li>
         <input type="submit" value="走起">
        </li>
        <li>
         <?php echo time(); ?>
        </li>
       </ul>
      </form>
    </body>
    </html>
    mysql php数据库重复记录防止

    <?php 
    $link=mysql_connect(‘localhost’,’root’,’root’); //得到MySQL数据库连接 
    $username=$_GET["name"]; //得到从客户端表单传过来的数据 
    $q="select * from usertable where user_name='$username'"
    mysql_query("SET NAMES gb2312"); //避免出现中文乱码 
    $rs = mysql_query($q, $link); //查询数据库 
    $num_rows = mysql_num_rows($rs); //得到查询结果的总行数 
    if($num_rows==0

    $exec="insert into student (user_name) values ($username)"
    mysql_query("SET NAMES gb2312"); 
    mysql_query($exec, $link); //若没有此用户则将数据插入到数据库(注册用户) 
    echo "用户注册成功!"

    else 

    echo "该用户名已存在,请重新选择用户名!"

    ?>
    session过期法有非常重要的一点是一个session设置与提交成功与不成功时的一个session验证了,这个有点像登录一样的如果登录成功了我们要清除session这个原理也差不多。
  • 相关阅读:
    对象序列化流使用
    字符输入流结合字符打印流实现复制文件
    python 安装一些 直接使用pip无法安装的包 的方法
    linux记不住
    SIP
    uniapp不同型号手机适配
    uniapp app头部渐变
    vue安卓苹果下载链接合并
    Typescript
    Nodejs
  • 原文地址:https://www.cnblogs.com/qhorse/p/4717633.html
Copyright © 2020-2023  润新知