我们常常在提交页面设置验证码防止重复提交,但有些时候设置了验证码不一定有用,看看下面的例子:

实现用户注册的功能,需要提交以下字段:username,password,regCode,注册成功后跳转到登录页面,接受页面进行如下处理:

if($_POST['regCode'] != $_SESSION['regCode']) {msg('验证码不一致');
}
$username = $_POST['username'];
$password = $_POST['password'];
if(! check_username($username)) {msg('用户名不合法');
}
if(! check_password($password))) {msg('密码不合法');
}
if(check_user_exists($username)) {msg('用户名已被占用');
}
if(! $this->user_model->save(array('username' => $username,'password' => $password,
))) {msg('注册失败');
}
header("Location:login.php");

可以看到对用户名、密码都做了校验,且设置了验证码,那是不是就没问题了呢?可以看到服务端只做了验证码校验,但在使用完验证码后并未删掉验证码,这样在下次请求中验证码是否可以重复使用呢? 我们知道验证码通常情况下存储在SESSION中,只要SESSION中验证码不被删掉而客户端请求的CookieID相同,服务端会认为是同一个用户,根据同一个CookieID想必服务端还可以拿到验证码再次使用。 我们可以这个动作用程序来模拟,并尝试多次执行:

$cookie = 'PHPSESSID=pgfac511q271k5vvije46kf634';
$post_data = array('username' => 'pp'.time(),'password' => time(),'regCode' => 'dksi',
);
$ch = curl_init("http://localhost/regist.php");
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
curl_setopt($ch,CURLOPT_HTTPHEADER, array("Cookie: ".$cookie));
$rs = curl_exec($ch);
if(curl_errno($ch)) {throw new Exception('Curl Error:'.curl_error($ch));
}
curl_close($ch);
var_dump($rs);

我们只需要从浏览器上取到产生的cookie内容和显示的验证码即可,而这些通过ff或者chrome很容易就可以拿到。多次执行之后会发现数据库插入了多条记录,也就是验证码没有起到防刷的目的。同样,也可以在提交页面的时候尝试直接F5刷新,上面的逻辑则会提示用户名已被占用。

该问题产生的根本原因就是验证码使用一次之后还可以再次使用,所以解决也很简单,只需要在注册成功之后清掉验证码的值即可,再次请求时服务端session里已经没有该值了,验证码就校验不通过了。

这样的问题本属于很小的问题,但是在系统中不经意就发生了,不要让验证码变得毫无意义,等刷了几百万用户后才后知后觉

PHP中没用的验证码相关推荐

  1. [转载]windows7中没用boot.ini文件而是改用BCDEDIT来配置了

    原文地址:windows7中没用boot.ini文件而是改用BCDEDIT来配置了作者:开心骝哥 本人安装的Win7,因为机上有两个系统,一个dos系统,一个win7系统,开机时总是会在系统选择的界面 ...

  2. 注册/找回密码等功能中发送手机验证码后倒计时效果的实现(基于vue)

    注册/找回密码等功能中发送手机验证码后倒计时效果的实现,基于vue.element-ui <template><el-button size="small" ty ...

  3. .NET中生成动态验证码

    NET中生成动态验证码 验证码是图片上写上几个字,然后对这几个字做特殊处理,如扭曲.旋转.修改文字位置,然后加入一些线条,或加入一些特殊效果,使这些在人类能正常识别的同时,机器却很难识别出来,以达到防 ...

  4. 江苏省电子税务局中文点选验证码识别研究

    最近突发奇想,想研究一下中文识别.因为之前研究过简单数字,字母类的识别,这种识别种类很少,数字就10个,字母顶多就26个.但是一到中文,常用字就有3000多个,数量级有了巨大提升.不知道传统的方法还是 ...

  5. Java中使用图片验证码 --菜鸟小回

    Java中使用图片验证码 一.第一种方式 工具类 @WebServlet("/BufferImage") public class BufferImage extends Http ...

  6. 使用OpenCV 破解QQ登录中的滑动验证码

    系列文章目录 第一篇: Java实现QQ登录 第二篇: Selenium QQ自动化登录 第三篇: 使用OpenCV 破解QQ登录中的滑动验证码 文章目录 系列文章目录 文章目录 前言 一.登录流程 ...

  7. [pig框架实战] 手撕视频管理发布平台[02] - pig框架源码分析(去除开发过程中每次输入验证码的过程,方便快速登录)

    需求 将自己搭建好的项目添加到pig项目中 去除开发过程中每次输入验证码的过程,方便快速登录 去除验证码校验(服务器端) 去除验证码校验(前端) 将自己搭建好的项目myvideos添加到pig项目中 ...

  8. 魔方APP项目-07-客户端提交登录信息、在APICloud中集成防水墙验证码,前端获取显示并校验验证码、服务端校验验证码、保存用户登录状态,APICloud提供的数据存储、客户端保存用户登陆数据

    用户登录 一.客户端提交登录信息 html/login.html,代码: <!DOCTYPE html> <html> <head><title>登录& ...

  9. RPA中关于“滑动”验证码与按照“语序”点击两类验证码

    学Python,用RPA 艺赛旗RPA2020.1版本 正在免费下载使用中,欢迎下载使用 www.i-search.com.cn/index.html?from=line1 最近发现很多伙伴在项目中都 ...

最新文章

  1. 目标检测算法终结篇:YOLOv7(非正式版)正式开源
  2. TX2---ORB_SLAM2
  3. 面试题整理11 数字在排序数组中出现的次数
  4. C++ 模板详解(二)
  5. 3级联动 ajax java_java+ajax(三级连动下拉框)
  6. 【数据结构与算法】之深入解析“课程表II”的求解思路与算法示例
  7. java 字符长度 中文_java判断中文字符串长度的简单实例
  8. android webview 字体 系统字体大小,Android 系统字体大小动态改变,导致webview中显示不兼容的问题解决...
  9. devops 文化_为什么回馈对DevOps文化很重要
  10. 服务器系统是选择CentOS,还是选择Ubuntu
  11. html中span隐藏属性,JS 如果改变span标签的是否隐藏属性
  12. win10系统迁移至SSD
  13. OKR目标管理专题及模板大全
  14. C#开发工控上位机编程 csdn_C#串口编程示例
  15. 定义幂函数C语言,【知识点】幂函数定义与性质
  16. 伊诺伊香槟分校计算机世界排名,2020年伊利诺伊大学香槟分校QS世界排名
  17. 基于Spire.Doc转PDF得方法,没有授权只能三页
  18. 手机怎么用外嵌字幕_【本地视频】手动去除字幕、水印的实用方法
  19. python计算矩阵行列式_基础 | Python 下的行列式值
  20. 一本通1612特别行动队

热门文章

  1. primer premier 5 64位_王者荣耀:必出破军的3位英雄,玩他们不出破军?说明你是个菜鸟!...
  2. 目标检测特殊层:ROI Align层详解
  3. backlight misc驱动范例 及应用程序范例
  4. fprintf,sprintf,sscanf,fscanf
  5. pytorch注意事项
  6. Improving RGB-D SLAM in dynamic environments: A motion removal approach
  7. 《设计团队协作权威指南》—第1章1.3节甘为螺丝钉
  8. Linux实战案例(4)CentOS清除用户登录记录和命令历史方法
  9. Codeforces Round #345 (Div. 2)
  10. Corosync+Pacemaker+DRBD实现Mysql服务的高可用