热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

验证码的三个常见漏洞和修复方法

这篇文章主要介绍了验证码的三个常见漏洞和修复方法,本文讲解了把验证码存储在Cookie中、没有进行非空判断、没有及时销毁验证码三个常见问题和解决方法,需要的朋友可以参考下

把验证码存储在COOKIE中

一般来说,我们会把验证码的值用Session存储起来,通过对比用户提交的验证码和Session中的验证码,就可以知道输入是否正确。由于Session会占用服务器资源,我曾经想过是否可以把验证码的值加密后存储在COOKIE中。不过事实证明,这只是异想天开罢了。

假设验证码的值是a,通过sha1加密后得到的值为b = sha1(a),并且把b存储在COOKIE中。而用户提交的验证码值为c,通过判断sha1(c)是否与b相等,可以知道输入的验证码是否正确。然而,COOKIE是受客户端控制的。如果用户事先通过肉眼看到验证码的值是a,又从COOKIE中得知此时的加密值为b,那么,他只要在提交前把COOKIE的值修改为b,提交的验证码值为a,就可以永远通过验证。

没有进行非空判断

这种情况可以直接用代码来说明:

代码如下:

if (Request["captcha"] == Session["captcha"] as string)
{
    // 验证通过,继续操作
}

假设用户绕过了系统提供的表单直接提交数据,此时验证码还没生成,Session["captcha"]为空。用户不提交验证码时,Request["captcha"]也为空。于是,验证通过了。

要解决这个问题,其实只要加个非空判断就可以了:

代码如下:

if (!String.IsNullOrEmpty(Request["captcha"]) &&
    Request["captcha"] == Session["captcha"] as string)
{
    // 验证通过,继续操作
}

没有及时销毁验证码

使用验证码要遵循一个原则,在一次比对之后,无论用户输入正确与否,都要立刻将验证码销毁。

如果不这样做,就可以出现以下情况:

假设用户输入错误,且验证码没有重新生成,那么他就可以一直尝试,直到正确为止。虽然机器对图片的一次性识别率比较低,但是,如果同一张图片你给它无限次机会的话,它还是可以识别出来的。
假设用户输入成功,且验证码没有销毁,那么在Session过期之前,他就可以一直用这个验证码通过验证。


推荐阅读
  • 在项目需要国际化处理时,即支持多种语言切换的功能,通常有两种方案:单个包和多个包。本文将重点讨论单个包的实现方法。 ... [详细]
  • Java EE 平台集成了多种服务、API 和协议,旨在支持基于 Web 的多层应用程序开发。本文将详细介绍 Java EE 中的 13 种关键技术规范,帮助开发者更好地理解和应用这些技术。 ... [详细]
  • Linux 防火墙与端口管理必备命令
    在使用 Linux 系统进行服务部署和问题排查时,防火墙和端口管理是不可或缺的操作。本文将详细介绍如何查看防火墙状态、端口占用情况,以及如何开放和关闭端口,帮助初学者更好地掌握这些技能。 ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • MongoDB核心概念详解
    本文介绍了NoSQL数据库的概念及其应用场景,重点解析了MongoDB的基本特性、数据结构以及常用操作。MongoDB是一个高性能、高可用且易于扩展的文档数据库系统。 ... [详细]
  • 本文详细介绍如何在忘记MySQL服务器密码的情况下进行密码重置,包括具体的步骤和注意事项。 ... [详细]
  • 本文将探讨UDP(User Datagram Protocol)协议的特点及其适用场景,与常见的TCP协议进行对比,帮助读者更好地理解和选择合适的传输协议。 ... [详细]
  • 阿里云服务器搭建详解——Ubuntu
    由于自己电脑配置跟不上,双系统一开,整个电脑就会变得非常卡顿,所以决定在阿里云买一个云服务器。听朋友说,学生买的话是非常便宜 ... [详细]
  • h5调用本地摄像头和麦克风一
    h5调用本地摄像头和麦克风一,Go语言社区,Golang程序员人脉社 ... [详细]
  • 使用HTML和JavaScript实现视频截图功能
    本文介绍了如何利用HTML和JavaScript实现从远程MP4、本地摄像头及本地上传的MP4文件中截取视频帧,并展示了具体的实现步骤和示例代码。 ... [详细]
  • 直播带货系统中的推流技术详解
    本文介绍了RTMP(实时消息传输协议)及其在直播带货系统中的应用,并详细探讨了带货直播系统的连麦方案,包括服务端合流和客户端合流的优势与劣势。 ... [详细]
  • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
  • 本文介绍了如何查看PHP网站及其源码的方法,包括环境搭建、本地测试、源码查看和在线查找等步骤。 ... [详细]
  • 深入理解Redis中的字典实现
    本文详细介绍了Redis中字典的实现机制,包括其底层数据结构、哈希表与哈希节点的关系、元素添加方法及rehash操作的具体流程。 ... [详细]
  • 小程序的授权和登陆
    小程序的授权和登陆 ... [详细]
author-avatar
cui115588
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有