数据验证之完整示例

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

    现在,给出一个较完整的例子,全面说明数据验证要做的工作。在这个例子里,用户通过表单提交数据,通过验证后,写入数据库,并给出成功提示,否则给出失败提示。为了使代码简单,让用户只提交一项:用户名。
    所有这些工作,都在post.asp这一个程序中完成,利用Request.ServerVariables("REQUEST_METHOD")="POST"来判断表单是否提交,分别进行处理。自定义函数放在另一个文件(myfunction,asp)中,以便重复使用。
    首先分析一下,在验证的过程中,要做的工作。
    用户提交的用户名是字符型数据,允许用户输入任何字符,所以只需验证其是否为空,以及长度是否符合要求。
    要防止重复提交。用户可能通过不断点击“提交”按钮,或是当出现操作成功提示时刷新页面。为此,做下面两个工作:一是利用一段javascript,当提交按钮按下后,将其设为disabled;二是利用一个session来判断是否重复提交表单:在页面初始化的时候传一个session,操作成功时,清空这个session。表单提交后验证这个session,如果为空,说明是重复提交。(session会增加系统的开销,所以我一直不能肯定这是个好办法,你有更好的办法吗?)
    要防止伪造的表单。居心不良的人会伪造表单,以绕过你通过HTML或是JS设置的输入条件,所以我不用JS做数据验证。利用自定义函数ChkPost()来判断数据的来源。

    以下是post.asp的代码(其中第一行是include数据库连接文件,该文件代码在此略去):

<!--#include file="myconn.asp"-->
<!--#include file="myfunction.asp"-->
<%
'****************************************************************************************
'* NAME:post.asp                                                                       *
'* CODE:WWW.NETOP.CC                                                                   *
'*  USE:数据验证完整示例                                                               *
'* TIME:2005.7                                                                         *
'****************************************************************************************
Response.Buffer = true
Dim UserName

Response.Write "<html><body>"
'======***表单提交后:***======
if Request.ServerVariables("REQUEST_METHOD")="POST" then
   Dim founderr,callform,msg
   founderr = false    '是否有错误发生
   callform = false    '是否调用表单
   msg = ""            '提示信息

   '=======================================数据验证开始=================================
   if ChkPost() = false then
      msg = "<li>请勿从外部提交数据!</li>"
      founderr = true
      callform = false
   elseif session("redo") = "" then
      msg = msg + "<li>请勿重复提交!</li>"
      founderr = true
      callform = false
   else
      UserName = trim(Request.Form("uname"))
      if UserName = "" then
         msg = msg + "<li>请填写姓名"
         founderr = true
         callform = true
      elseif strLength(username) > 10 then  
         msg = msg + "<li>姓名长度超过限制"
         founderr = true
         callform = true
      end if
   end if
   '=======================================数据验证结束=================================

   '=======================================数据处理开始=================================
   if founderr = true then
      '错误处理(当callform=true时调用表单,此时提示信息与表单同时显示,便于用户修正错误)
      call message("500")
      if callform = true then call myform()
   else
      '写库开始(MyConn为myconn.asp中创建的Connection对象)
      ON ERROR RESUME NEXT
      MyConn.BeginTrans       '事务处理
      'AddNew方法写库 
      Dim MyRst,sqlStr
      set MyRst=server.createobject("adodb.recordset")
      MyRst.Open "[userinfo]",MyConn,0,3
      MyRst.AddNew
      MyRst("username").Value = UserName
      MyRst.Update
      MyRst.Close
      Set MyRst = Nothing
      '也可使用insert语句,注意此时要调用SQLEncode()
      'MyConn.Execute("insert into [uerinfo] (username)_
      '                       values ('"& SQLEncode(username) &"')")

      '显示结果
      if MyConn.Errors.count = 0 then
         msg = "<li>操作成功!"
         call message("500")
         MyConn.CommitTrans
         session("redo") = ""
      else
         msg = "<li>操作失败!"
         call message("500")
         MyConn.RollbackTrans
      end if
   end if
   '=======================================数据处理结束=================================

'======***页面初始化(表单提交前)***======
else
   session("redo") = 0
   UserName = ""
   call myform()
end if

Response.Write "</body></html>"
MyConn.Close
Set MyConn = Nothing

REM 子过程,定义表单
Sub myform()
   Response.Write "<table width=500 border=1 cellspacing=0 cellpadding=5 align=center>"&_
                  "<form name=form1 method=post onSubmit=submitonce(this)>"&_
                  "<tr height=30><td rowspan=2 width=100 align=center>姓名</td>"&_
                  "<td><input type=text name=uname size=40 "&_
                  "value="""&server.HTMLEncode(username)&"""></td>"&_
                  "<tr height=30><td>至多5个汉字或10个英文字符</td></tr>"&_
                  "<tr height=30><td colspan=2 align=center>"&_
                  "<input type=submit name=Submit value=提交></td></tr>"&_
                  "</form></table>"
end Sub
%>

    以下是myfunction.asp的代码:

<%
'****************************************************************************************
'* NAME:myfunction.asp                                                                 *
'* CODE:WWW.NETOP.CC                                                                   *
'*  USE:数据验证完整示例--通用函数                                                     *
'* TIME:2005.7                                                                         *
'****************************************************************************************

Rem 返回字符串的字节数
function strLength(str)
   ON ERROR RESUME NEXT
   DIM WINNT_CHINESE
   WINNT_CHINESE    = (len("中国")=2)
   if WINNT_CHINESE then
      dim l,t,c
      dim i
      l=len(str)
      t=l
      for i=1 to l
         c=asc(mid(str,i,1))
         if c<0 then c=c+65536
         if c>255 then
            t=t+1
         end if
      next
      strLength=t
   else
      strLength=len(str)
   end if
   if err.number<>0 then err.clear
end function

Rem 判断数据来源
function ChkPost()
   dim server_v1,server_v2
   chkpost=false
   server_v1=Cstr(Request.ServerVariables("HTTP_REFERER"))
   server_v2=Cstr(Request.ServerVariables("SERVER_NAME"))
   if mid(server_v1,8,len(server_v2))<>server_v2 then
      chkpost=false
   else
      chkpost=true
   end if
end function

Rem 转换SQL非法字符
function SQLEncode(fString)
   if isnull(fString) then
      SQLEncode = ""
      exit function
   end if
   SQLEncode=replace(fString,"'","''")
end function

Rem 提示信息
sub message(w)
    Response.Write "<table width="&w&" border=1 cellspacing=0 cellpadding=5 align=center>"&_
                   "<tr height=30><td>提示信息</td></tr>"&_
                   "<tr valign=top><td style=""color:red;"">"&msg&"</td></tr></table>"
end sub
%>
<script language="javascript">
//提交按钮只允许按下一次
function submitonce(theform){
   if (document.all||document.getElementById){
      for (i=0;i<theform.length;i++){
         var tempobj=theform.elements[i]
         if(tempobj.type.toLowerCase()=="submit"||tempobj.type.toLowerCase()=="reset")
            tempobj.disabled=true
      }
   }
}
</script>

    以上通过一个示例展示了对表单提交的数据进行验证的完整过程。具体的验证方法在有关数据验证的前面三篇文章中已做过说明。我想再强调一下myform()中的value="""&server.HTMLEncode(username)&""",请注意双引号及server.HTMLEncode()方法的使用。
    也许你注意到了,代码中没有将HTML代码与VBS代码混合,没有使用<%@ Language=VBScript %>,以及在Response.Write中使用了“&_”来连接字串,这样做都有助于提交效率。

[本文仅发表于www.netop.ccblog.csdn.net/netopsnetops.blogchina.com 若见于其它各处,皆为转载]

PCIe设备与AXI总线实战:如何用UVM验证RC到EP的数据流(含完整代码示例 本文详细解析了如何使用UVM验证平台实现PCIe设备与AXI总线之间的数据验证,涵盖从Root Complex到Endpoint的完整路径。通过构建分层的验证环境、协议转换验证及端到端数据一致性检查,提供可直接复用的代码示例,帮助工程师高效解决PCIe与AXI协同工作中的关键挑战。 阅读详情

相关推荐

告别手动校验!用Pydantic V2给你的FastAPI接口数据验证上个保险(附完整代码示例

本文详细介绍了如何使用Pydantic V2为FastAPI接口构建高效、安全的数据验证层。通过对比手动验证与Pydantic V2的性能差异,展示其40%的性能提升优势,并提供完整的安装、配置和高级验证技巧,帮助开发者快速实现企业级数据验证体系。

weixin_33701251的博客 127

数据校验和时间段重合处理:一个有趣的业务数据案例分享

多维度数据校验+时间段更新时间段的几种场景+更新、校验方案

qq_43522126的博客 678

生物信息学新手必看:从RNA-seq数据到关键基因验证完整流程(附代码示例

本文为生物信息学新手提供了从RNA-seq原始数据到关键基因验证完整实战流程。详细讲解了从Fastq文件处理、差异表达分析到筛选关键基因的全步骤,并附有可运行的代码示例。重点介绍了如何利用DESeq2进行差异分析、结果可视化以及通过富集分析为后续qPCR等湿实验验证提供可靠靶点,帮助研究者建立严谨、可复现的分析闭环。

weixin_28323057的博客 129

数据正确性验证(造数据篇)

数据正确性验证(造数据篇)

lqy729416873的博客 3964

数据校验的六种方式

数据校验是为保证数据完整性,用一种指定的算法对原始数据计算出的一个校验值。接收方用同样的算法计算一次校验值,如果和随数据提供的校验值一样,说明数据完整的。

司马懿的西山居 2万+

使用元数据设计测试用例

使用元数据设计测试用例 Jaydeep Kaur在软件测试的整个软件测试生命周期(STLC),包括需求分析,测试,交付和支持方面有近四十年的经验。有了为银行,保险公司和资本市场公司工作的经验,Jaydeep领导着卓越数据屏蔽中心Capgemini质量保证团队。她闲暇时间就读读小说,还对市场上最新的产品有着浓厚的兴趣。 Devjyoti Namata在为金融服务机构的软件测试的整个软件测试周期方

qiansanjia的专栏 1166

SpringMVC JSR 303数据校验案例

SpringMVC JSR 303数据校验案例 一、关于JSR303数据校验介绍 输入验证是Spring处理的最重要Web开发任务之一。在SpringMVC中,有两种方式可以验证输入,一是利用Spring自带的验证框架,二是利用本文所讲的JSR 303实现,如果你纠结于使用这两种中的哪一种,那么我建议你采用JSR 303,因为JSR 303是正式的Java规范,而且使用相对简单 Spring 3开始支持JSR-303验证框架,JSR 303是Java为Bean数据合法性校验所提供的标准框架。JSR-

qq_22075913的博客 479

php验证数据的类_php实现的表单验证完整示例

本文实例讲述了php实现的表单验证类。分享给大家供大家参考,具体如下:/*** 用法* use Validate\Validator;** $rules = [* ['name|名字', 'require|email|in:7,8,9|max:10|min:6|between:6,8|length:2', '名字不能为空|名字必须必须为正确的邮件地址'],* ['test|测试', '...

weixin_39942213的博客 270

tschema实战教程:5个高效构建API数据验证完整示例

tschema是一个轻量级(仅500字节)的工具,用于构建JSON schema类型,帮助开发者快速实现API数据验证。本文将通过5个实用示例,展示如何使用tschema轻松处理各种常见的数据验证场景,让你的API开发更高效、更可靠。 ## 1. 基础类型验证:构建用户注册表单验证 最常见的API验证场景是用户输入验证。使用tschema可以轻松定义字符串、数字等基础类型的验证规则: ```

gitblog_00947的博客 562

如何在5分钟内上手Norm?从安装到第一个数据验证示例完整指南

Norm是一个强大的数据规范和生成系统,它允许开发者定义数据结构并用于验证数据生成。本指南将帮助你快速掌握Norm的基本使用方法,从安装到实现第一个数据验证功能,全程只需5分钟! ## 🚀 快速安装Norm的两种方法 ### 方法一:通过Hex.pm安装(推荐) 在你的Elixir项目中,只需在`mix.exs`文件中添加以下依赖: ```elixir defp deps do [

gitblog_00290的博客 475

基于 SWIFT(魔搭社区) 训练 DeepSeek 模型 的完整代码示例:环境配置、数据准备、训练流程及推理验证

通过上述代码,可在SWIFT框架中高效完成DeepSeek系列模型的微调任务。低代码接口:10行核心代码即可启动训练。硬件适配性强:支持消费级显卡(如RTX 4090)完成7B模型微调。全流程支持:从训练、评测到部署无缝衔接。实际应用中可根据任务需求调整和训练轮次,更多参数细节可参考SWIFT官方文档。

学亮编程手记 1786

单点登陆(SSO)-完整示例-含数据验证

http://www.kafeitu.me/sso/2010/11/05/sso-cas-full-course.html

flash8627的专栏 3942

由于生成一个完整的游戏商城代码在多种电脑语言中涉及大量代码和复杂性,这里我将为您提供每种语言中一个简化的、概念性的代码示例。这些示例将包括主要功能和结构,但可能不包含完整的错误处理、用户验证数据库连

由于生成一个完整的游戏商城代码在多种电脑语言中涉及大量代码和复杂性,这里我将为您提供每种语言中一个简化的、概念性的代码示例。这些示例将包括主要功能和结构,但可能不包含完整的错误处理、用户验证数据库连接等。 1. Python (使用Flask框架) python from flask import Flask, render_template, request app = Flask(__name__) # 假设的游戏商品数据 games = [ {"id": 1,

FredaSophy的博客 670

如何设置自动化的数据备份完整验证

自动化数据备份完整验证的核心是通过脚本、工具链和任务调度系统,定期检查备份数据的哈希值、签名或可恢复性,确保数据在存储和传输过程中未被篡改或损坏。

Made In SQL 1618

由于生成一个完整的游戏商城代码超出了简短的回答范围,我将为您提供每种语言的一个非常简化的框架或示例,这些示例将指导您如何开始。请注意,这些示例不包括数据库连接、用户验证、错误处理、前端交互等关键功能,

在构建实际的游戏商城时,您需要考虑安全性、性能、可伸缩性、错误处理、日志记录、前端集成等多个方面。由于生成一个完整的游戏商城代码超出了简短的回答范围,我将为您提供每种语言的一个非常简化的框架或示例,这些示例将指导您如何开始。(这里只提供一个简单的Controller类,完整的Spring Boot项目需要更多的配置和文件)(这里只提供一个简单的Controller类,完整的Spring Boot项目需要更多的配置和文件)(同样,这里只提供一个简单的Controller类)// 假设的游戏商品数据

AmosKelvin的博客 327

Java XML 数字签名示例

Java XML 数字签名示例 去发现同类优质开源项目:https://gitcode.com/ 资源文件介绍 文件名: xmldigitalsignature1.zip 描述: 本资源文件提供了一个在 Java 中实现 XML 安全与数字签名的示例。该示例演示了如何使用 Java 中的数字签名技术来保护 XML 文档。具体来说,示例中的应用程序使用私钥对 XML 文档进行签名,然后将签名的 XM...

gitblog_09754的博客 816

java验证文件的完整性_JAVA中进行数据完整验证

最近在看JAVA安全方面的东东。简单地说,安全包括访问控制、数据安全两部分。安全访问控制是根据系统需求进行设计的,对资源进行访问控制的一种措施。而数据安全包括数据传输过程中的安全防范措施,包括数据完整性、传输安全性、接收/发送方不可否认性等方面。下面就数据完整验证部分做简单的介绍。假如我要下载一个最新版本的tomcat7 ,我会访问http://tomcat.apache.org/downloa...

weixin_39611937的博客 898

java验证用户名密码是否为空

我整理的一些关于【Java】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://d.51cto.com/f2PFnNJava验证用户名密码是否为空 在当今的应用程序开发中,用户认证是一个至关重要的环节。而在用户认证的过程中,首先需要做的工作就是验证用户输入的用户名和密码是否为空。这不仅是为了提高用户体验...

weixin_33683108的博客 195

MyBatis XML 配置完整示例(含所有核心配置项)

MyBatis XML 配置完整示例(含所有核心配置项)

爱的叹息的专栏 2931
上一篇: 数据验证之类型与格式
下一篇: ASP与验证码
netops
博客等级 码龄22年 1粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值