较为周全的Asp.net提交验证方案

下面要对这个生成的“提交验证”类进行功能扩展,通过.Net的“部分类”或“扩展方法”技术都可以轻松实现,这里采用的是“部分类”技术:

引用生成的ADO.NET Entity Framework数据模型的命名空间,且声明为部分类。
书写静态构造函数及一个静态属性:

static 提交验证()
{
   过期时间差值=3;
}

/// <summary>
/// 用于计算过期时间,单位为分钟
/// </summary>
public static double 过期时间差值
{
    get
    {
        return _过期时间差值;
    }
    set
    {
        _过期时间差值=value;
    }
}
private static double _过期时间差值;

书写添加验证信息的方法:

/// <summary>
/// 添加一个新的验证信息,注意在此前应为Session中的任意变量赋值,否则SessionID将随机变化,无法通过验证
/// </summary>
/// <param name="验证码">要保存的验证码</param>
/// <returns>验证信息ID</returns>
public static Guid 添加(string 验证码)
{
    var a = new 提交验证
    {
        ID = Guid.NewGuid(),
        会话ID = HttpContext.Current.Session.SessionID,
        是否已提交 = false,
        验证码 = 验证码,
        过期时间 = DateTime.Now.AddMinutes(过期时间差值)
    };
    using (CommonDBEntities c=new CommonDBEntities())
    {
        c.AddTo提交验证(a);
        c.SaveChanges();
    }
    return a.ID;
}

此方法将返回添加的验证信息的GUID,需注意的是在执行此方法之前,必须曾为Session赋值过,未赋值的话SessionID将是随机的,这会让后面的验证函数认为客户端被劫持。
获取验证信息的方法:

/// <summary>
/// 通过ID获取验证信息
/// </summary>
/// <param name="ID">验证信息ID</param>
/// <returns>验证信息</returns>
public static 提交验证 获取(Guid ID)
{
    try
    {
        提交验证 a;
        using (CommonDBEntities c = new CommonDBEntities())
        {
            a = c.提交验证.First(f => f.ID == ID);
        }
        return a;
    }
    catch { return null; }
}

验证用户提交信息的方法:

/// <summary>
/// 验证用户输入的验证码是否正确
/// </summary>
/// <param name="ID">验证信息ID</param>
/// <param name="验证码">用户输入的验证码</param>
/// <returns>返回错误信息,如验证成功则返回null</returns>
public static string 验证(Guid ID, string 验证码)
{
    var 验证信息 = 提交验证.获取(ID);
    if (验证信息 == null) return "验证信息无效或已过期";
    else if (验证信息.过期时间 < DateTime.Now) return "验证信息已过期";
    else if (验证信息.是否已提交) return "信息已被提交过";
    else if (验证信息.会话ID.Trim() != HttpContext.Current.Session.SessionID) return "验证信息被非法劫持";
    else if (验证信息.验证码.Trim().ToLower() != 验证码.ToLower()) return "验证码错误";
    else return null;
}

标记已提交信息及清理超时信息的方法:

/// <summary>
/// 将指定ID的验证信息设为已提交
/// </summary>
/// <param name="ID">验证信息ID</param>
public static void 设为已提交(Guid ID)
{
    using (CommonDBEntities c = new CommonDBEntities())
    {
        var a = c.提交验证.First(f => f.ID == ID);
        a.是否已提交 = true;
        c.SaveChanges();
    }
    清理(false);
}

/// <summary>
/// 清理数据库中已失效的旧数据
/// </summary>
/// <param name="是否清理已提交的数据">是否连带清理已提交过的数据,否则只清理过期数据< /param>
/// <returns>波及的数据总量</returns>
public static int 清理(bool 是否清理已提交的数据)
{
    int x = 0;
    using (CommonDBEntities c = new CommonDBEntities())
    {
        var a = c.提交验证.Where(f => f.过期时间 < DateTime.Now || (是否清理已提交的数据 ? f.是否已提交 : false));
        foreach (提交验证 f in a)
        {
            c.DeleteObject(f);
        }
        x=c.SaveChanges();
    }
    return x;
}

在设置已提交的方法中顺手清理超时信息。
至此,验证类就编写完成了。
接下来看看如何使用,先创建一个这样的页面:

如前所述,验证信息ID会明文发给客户端,即保存在HiddenField控件中。
CustomValidator用于显示错误提示。
以下为页面Load事件的代码:

注意在调用添加验证信息的函数之前设置过了Session的变量,确保SessionID不会再发生改变。
关于生成验证图片的代码到处都是,这里就不累述了,只要通过Url参数“ID”获取到GUID,再以此获取对应的验证码即可开始生成工作。
以下是页面提交的代码:

应用效果:

数据库数据:

时间: 2024-10-29 09:28:26

较为周全的Asp.net提交验证方案的相关文章

较为全面的Asp.net提交验证方案分析 (上)_实用技巧

比如: 验证码存储在页面代码或Cookies里,暴露给客户端: 通过Session存储的验证码,虽然解决了安全问题,但一个用户只使用一个变量存储验证码,假如用户同时打开一个以上的页面,分别提交的话,就无法正常使用了: 验证码不会过期,这会留下隐患,使暴力破解变得可行(当然也可以通过刷新间隔.提交间隔.黑名单等手段加以控制): 此外还有伴随着提交产生的另一个问题--重复提交. 为解决上述问题,我曾走过不少弯路,后来总结出了一个方案可以很好的解决这些问题,本文将结合ADO.NET Entity Fr

ASP.NET中验证控件的使用

原文:ASP.NET中验证控件的使用 前言:     前几日,无奈用JS判断控件的有效性,发现的确是一件费力.费神的事情!特别是针对邮件格式.邮政编码等的关于正则表达式的JS验证(其中涉及正则表达式的比较等,较烦~).其实对于这些常用的控件有效性验证,在Asp.Net中有单独的验证控件可供使用.他们可以满足一般的,诸如非空,范围.比较等的验证.   验证控件:    Asp.Net中内置的验证控件有:RequiredFieldValidation.RangeValidation.RegularE

Asp.net MVC验证那些事(1)-- 介绍和验证规则使用

原文  Asp.net MVC验证那些事(1)-- 介绍和验证规则使用 数据的有效性验证,是程序开发中必不可少的环节.这篇文章,我们将用一个实例来说明如何在MVC中使用Validation来保证无论是新增或者更新数据的时候,都必须符合我们定义的验证规则,否则就会提示错误. 一, DRY原则 DRY是Don't repeat yourself的缩写,意思是不要写重复的代码.MVC中的Validation设计就是遵循了这个原则. 比如下面中的Movie类, 当用户在网页上填写Movie信息的时候,并

Asp.net MVC验证哪些事(3)-- Remote验证及其改进(附源码)

原文 Asp.net MVC验证哪些事(3)-- Remote验证及其改进(附源码) 表单中的输入项,有些是固定的,不变的验证规则,比如字符长度,必填等.但有些是动态的,比如注册用户名是否存在这样的检查,这个需要访问服务器后台才能解决.这篇文章将会介绍MVC中如何使用[RemoteAttribute]来解决这类验证需求,同时会分析[RemoteAttribute]的不足,以及改进的方法. 本文相关的源代码在这里 MVC-Remote-Validation.zip 一, RemoteAttribu

ASP.NETWeb服务器验证控件如何使用_实用技巧

什么是验证控件? 希望用户输入正确的类型的数据,为了验证用户输入是否满足要求,必须对输入的值.范围或格式进行检查..NET中验证控件在哪里? 在工具箱的验证分组里.常用的ASP.NET控件几个?分别是什么? 1)CompareValidator控件:与给定值比较. 2)CustomValidator控件:用户自己定制校验逻辑 3)RangeValidator控件:检查控件的值是否在给定的有效范围内. 4)RegularExpressValidator控件:使用正则表达式验证用户输入的数据是否符合

asp.net 身份验证机制实例代码_实用技巧

ASP.NET提供了3种认证方式:windows身份验证.Forms验证和Passport验证. windows身份验证: IIS根据应用程序的设置执行身份验证.要使用这种验证方式,在IIS中必须禁用匿名访问. Forms验证:用Cookie来保存用户凭证,并将 未经身份验证的用户重定向到自定义的登录页. Passport验证:通过Microsoft的集中身份验证服务执行的,他为成员站点提供单独登录和核心配置文件服务. 关于这三种验证方式的配置,推荐一篇文章:http://www.jb51.ne

ASP.NET中验证控件的使用方法_实用技巧

对于这些常用的控件有效性验证,在Asp.Net中有单独的验证控件可供使用.他们可以满足一般的,诸如非空,范围.比较等的验证,为用户登录页面添加输入数据验证功能和验证码功能.  验证控件:    Asp.Net中内置的验证控件有:RequiredFieldValidation.RangeValidation.RegularExpressValidation.CompareValidation.CustomValidation和ValidationSummary等六种.其中用户自定义验证控件,由于并

在ASP应用中验证用户身份

    交互式的Web应用比那些只提供静态Web页面的站点要求考虑更多的安全问题.注册与密码是保护敏感信息最为常用的手段.由于ASP没有直接提供验证用户身份的方法,因此,用户必须执行登录过程以便应用系统保存和提取用户相关信息.    一.示例站点概貌    本文通过一个示例站点ASPSecurity说明ASP应用中注册与密码保护的一般实现过程.我们把用户信息保存在Web服务器上的一个Access97数据库中,DSN名称为   ASPSecurity.唯一的数据库表拥有以下字段:Signon(文本

用ASP的安全验证来对windows 2000的管理者密码进行在线修改

window|安全|在线 IIS的安全验证机制做得很好,我们可以用ASP的安全验证来对windows 2000的管理者密码进行在线修改. 当有人登录站点时,利用ServerVariables集合中的LOGIN_USER捕获登录帐号,前提是必须关闭IIS中允许匿名登录这个选项,然后在changepwd.asp文件中通过ADSI来修改密码. 以下是程序: changepwd.htm <body> <!--与该输入表单有关的客户端验证脚本(即不允许新密码为空和两次密码输入是否相等的判断)请自行