表单是客户端浏览器与服务器交互数据重要对象,如何使表单信息符合我们的规范要求,把有用的信息提交到服务器,成为任何一个站点重要项目。当然,你可以使用DW MX里的“行为”(不是服务器行为),来生成JS代码检查表单,这是在客户端执行的,如果用户的浏览器版本过低,可能会逃过客户端检验,直接提交到服务器了,假若你的数据库字段设为不允许为空,那么就会报错,这倒没什么,数据插不入了没关系,关键是这样会损害我们站点的声誉,说我们的技术水平低,让人笑掉大牙。我并不是说这样不好,客户端检验表单会减少对服务器资源占用,本文介绍的是如何在服务器端检验表单的,与客户端无关,任何不合法的信息均被拒之门外。最好两种方法都用,逃过了客户端还有在服务器端“设卡”彻底检验一次,任何非法信息都难逃我之眼耳。
准备好“架生”了吗?启动你的DW MX,打开你的注册页,依照本文介绍的方法,给你的注册页进行“小手术”,可以不费力气地达到目的。以下例子只要提供代码,使用了一些ASP内置函数,具体工作原理不再细讲,读者可根据注释自己理解代码执行原理。
了解表单常用来提交那种信息:
- 纯数字类型数据,除数值型数字外,不允许包含任何文本字符
- 纯文本类型数据,可以是任何字符
- 电子邮箱地址,必须有“@”和“.”这两个符号,格式:abc7294@163.com
- 电话号码,包括区号,格式:020-8574256
- 日期时间,格式:2004-4-22 16:25:15
本来,还有一个要求就是限制只填中文或英文,考虑到大家都是中华民族子女,没有必要把这点也限制了,填英文就不准填中文,所以本文没有介绍这点。我的要求就是以上5点,任何一条信息都必须是合法的,才能插入到数据库中。
一、检查文本域信息是否为数值型数据
要求:只能输入数字类型数据
源程序:
<% if request.form("sub")="提交" then'按提交按扭时,触发表单检验程序 dim NOber'声明变量 NOber=request.form("Number")'把文本域赋值给NOber变量 if NOber="" then'当文本域内容为空时 text="对不起!输入不能为空!"'输出提示信息 elseif Isnumeric(NOber)=True then'当输入的是数字的时,结果为真 OFFNO=True'打开OFFNO,用此变量判断,执行插入记录程序 text=NOber'输出正确提示信息 else'最后,文本域不是数字格式,输出出错信息 text="对不起!你输入的数字格式不正确!" end if'表单检验结束 end if %>
功能扩展:
(1)限制数字位数
要求:用户输入的数字不能小于6位和大于12位
源程序:
<% if request.form("sub")="提交" then'按提交按扭时,触发表单检验程序 dim NOber'声明变量 NOber=request.form("Number")'把文本域赋值给NOber变量 if NOber="" then'当文本域内容为空时 text="对不起!输入不能为空!"'输出提示信息 elseif Isnumeric(NOber)=True then'当输入的是数字的时,结果为真 if len(NOber)<=12 and len(NOber)>=6 then'用LEN函数检文本域字节数是否在6至12内 OFFNO=True'打开OFFNO,用此变量判断,执行插入记录程序 text=NOber'输出正确提示信息 else text="对不起!你输入的数字不能大于12位和小于6位" end if else'最后,文本域不是数字格式,输出出错信息 text="对不起!你输入的数字格式不正确!" end if'表单检验结束 end if %>
(2)不能输入小数点
要求:只能输入整数,不能带有小数点
<% if request.form("sub")="提交" then'按提交按扭时,触发表单检验程序 dim NOber'声明变量 NOber=request.form("Number")'把文本域赋值给NOber变量 if NOber="" then'当文本域内容为空时 text="对不起!输入不能为空!"'输出提示信息 elseif Isnumeric(NOber)=True then'当输入的是数字的时,结果为真 if len(NOber)<=12 and len(NOber)>=6 then'用LEN函数检文本域字节数是否在6至12内 if Instr(NOber,".")=0 then'判断文本域的值是否带有小数点 OFFNO=True'打开OFFNO,用此变量判断,执行插入记录程序 text=NOber'输出正确提示信息 else text="对不起!你输入的数字不能带有小数点" end if else text="对不起!你输入的数字不能大于12位和小于6位" end if else'最后,文本域不是数字格式,输出出错信息 text="对不起!你输入的数字格式不正确!" end if'表单检验结束 end if %>
以上代码放在HTML标签的上面,用<%= text %>来输出提示信息,这个要放在<body></body>标签内的任何须要显示出错信息的地方。
二、检验文本类型数据
要求:可以是任何字符,但不能为空
源程序:
<%if request.form("Sub")="提交" then dim txtTT'声明变量 dim text2'用于输出提示信息 txtTT=request.form("txt") if txtTT<>"" then'当输入不为空时 OFFNO=True'打开OFFNO,用此变量判断,执行插入记录程序 text2=txtTT else text2="对不起!输入不能为空!" end if end if %>
功能扩展:
(1)限制字符数
要求:输入不大于6个字符和不小于2个字符
<% if request.form("Sub")="提交" then dim txtTT'声明变量 dim text2'用于输出提示信息 txtTT=request.form("txt") if txtTT<>"" then'当输入不为空时 if len(txtTT)<=6 and len(txtTT)>=2 then'检查字符长度 OFFNO=True'打开OFFNO,用此变量判断,执行插入记录程序 text2=txtTT else text2="对不起!输入的字符不能大于6个和小于2个。" end if else text2="对不起!输入不能为空!" end if end if %>
以上代码用于检查文本或文本区域字符数。
(2)过滤输入特殊字符
要求:不能输入“$”“~”“@”“#”“*”“/”/“)”“(”等字符
方法一:用replace()函数删除这些特殊字符
<%if request.form("Sub")="提交" then dim txtTT'声明变量 dim text2'用于输出提示信息 txtTT=request.form("txt") if txtTT<>"" then'当输入不为空时 if len(txtTT)<=6 and len(txtTT)>=2 then'检查字符长度
OFFNO=True'打开OFFNO,用此变量判断,执行插入记录程序 text2= replace(txtTT,"$","")'删除字符 text2= replace(text2,"~","") text2= replace(text2,"*","") text2= replace(text2,"@","") text2= replace(text2,"#","") text2= replace(text2,"/","") text2= replace(text2,"/","") else text2="对不起!输入的字符不能在于6个和小于2个。" end if else text2="对不起!输入不能为空!" end if end if %>
如果要想过滤更多的字符,text2= replace(text2,"/","")增加这句即可,把“/”换成你想要过滤的字符。
方法二:用Instr()函数阻止含有这些字符的文本通过检验
要求:不能含有上述特殊字符
<% if request.form("Sub")="提交" then dim txtTT'声明变量 dim text2'用于输出提示信息 txtTT=request.form("txt") if txtTT<>"" then'当输入不为空时 if len(txtTT)<=6 and len(txtTT)>=2 then'检查字符长度 if Instr(txtTT,"$")=0 and Instr(txtTT,"~")=0 and Instr(txtTT,"@")=0 &_ Instr(txtTT,"#")=0 and Instr(txtTT,"*")=0 and Instr(txtTT,"/")=0 and Instr(txtTT,"/")=0 then OFFNO=True'打开OFFNO,用此变量判断,执行插入记录程序 text2= txtTT else text2="对不起!不能输入“$”“~”“@”“#”“*”“/”/“)”“(”等字符" end if else text2="对不起!输入的字符不能在于6个和小于2个。" end if else text2="对不起!输入不能为空!" end if end if %>
如果你想添加更多自定过滤字符,增加and Instr(txtTT,"/")=0即可,把"/"改为你想限制输入的字符。
以上代码放在HTML标签的上面,用<%= text2 %>来输出提示信息,这个要放在<body></body>标签内的任何须要显示出错信息的地方。
三、检查电子邮箱地址格式是否正确
要求:电子邮箱地址必须含有“@”和“.”,在“@”和“.”之间不能少于一位字符,例如:
abc7294@.com这是错误的,abc7294@163.com才是对的。
源程序:
<% if request.form("Sub")="提交"then dim txtemail dim text3 txtemail=request.form("email") if (Instr(txtemail,".")-Instr(txtemail,"@"))>1 and (Instr(txtemail,".")>0 and Instr(txtemail,"@"))>0 then OFFNO=True'打开OFFNO,用此变量判断,执行插入记录程序 text3=txtemail else text3="对不起!你输入的电子邮箱地址格式不正确或为空!" end if end if %>
对于邮箱地址格式的检验,这是比较简单的方法,实际上程序只能对地址格式进行检验,究竟地址是否存在,程序就无能为力了。比较好的办法是,用户注册后成功后,用他提供的邮箱地址把密码发送到他的邮箱,并提示他,请在规定时间内打开邮箱取出密码激活帐号,否则系统将删除他的注册信息。当然,如果你的站点访问量很大,经常有一些无聊之人把一些不存在的信息插入你的数据库,如果你一条一条删,必把人累死。可用程序检测,过规定时间没有激活账号的,自动删除过期的记录。这个功能可以使用COMMAND命令实现。
以上代码放在HTML标签的上面,用<%= text3 %>来输出提示信息,这个要放在<body></body>标签内的任何须要显示出错信息的地方。
四、检查文本域的值是否包含区号间隔符
如格式:020-8956236
要求:必须填入区号
源程序:
<% if request.Form("sub")="提交" then dim TelTXT dim text4 TelTXT=request.form("Tel") if TelTXT<>"" then if Instr(TelTXT,"-")>0 then'检查号码中是否含有“-” OFFNO=True'打开OFFNO,用此变量判断,执行插入记录程序 text4=TelTXT else text4="对不起!必须输入区号!" end if else text4="对不起!电话号码输入不能为空!" end if end if %>
以上代码只要检查号码中是否含有“-”这个间隔符,没的话即提示输入区号。
功能扩展:
(1)在上例基础上,限制区号位数最小不能少于3位,最大不能多于4位,并且区号的第一位数必须是“0”,电话号码最少不能小于5位,最大不能多于8位,必须全部为数字。
源程序:
<% if request.Form("sub")="提交" then dim TelTXT dim text4 TelTXT=request.form("Tel") if TelTXT<>"" then'当值不为空时向下执行 if Instr(TelTXT,"-")>0 then'检查号码中是否含有“-”,有的向下执行 if Isnumeric(replace(TelTXT,"-",""))=True then'删除“-”然后检查是否数字,是数字的话向下执行 if Instr(TelTXT,"-")>3 and Instr(TelTXT,"-")<6 then'检查区号是否在3至4位以内 if left(TelTXT,1)=0 then'检查区号头位数字是否为0 if len(TelTXT)-Instr(TelTXT,"-")>=5 and len(TelTXT)-Instr(TelTXT,"-")<=8 then'检查电话号码是否在5位至8位以内 OFFNO=True'打开OFFNO,用此变量判断,执行插入记录程序 text4=TelTXT else text4="对示起!电话号码不能多于8位小于5位。" end if'检查电话号码位数 else text4="对不起!区号应位数字必须是0!" end if'检查区号头位数字是否为0结束 else text4="对不起!区号位数不能少于3位和大小4位。" end if'检区号位数结束 else text4="对不起!电话号码必须是数字!" end if'删除“-” else text4="对不起!必须输入区号!" end if'检区号结束 else text4="对不起!电话号码输入不能为空!" end if'检查文本域是否为空结束 end if'响应提交表单结束 %>
经过此段程序检验,电话号码绝对符合要求,并且会非常聪地告诉操作者,错在那里了。 (2)如果是手机号码,必须为11位,不允许有“-”间隔符,号码必须为数字。
要求:手机号码数字位数不能少于10位,必须是数字,不允许有其它字符
源程序:请参考第一例。
以上代码放在HTML标签的上面,用<%= text4 %>来输出提示信息,这个要放在<body></body>标签内的任何须要显示出错信息的地方。
五、检验表单文本域的值是否为合法日期时间格式
要求:日期格式:2004-4-22 22:12:54 或 2004/4/22 22:12:54
源程序:
<% if request.form("sub")="提交" then'按提交按扭时,触发表单检验程序 dim Timel dim text5 Timel=request.form("Timel") if Timel<>"" then if isdate(Timel)=True then OFFNO=True'打开OFFNO,用此变量判断,执行插入记录程序 text5=Timel else text5="对不起!请输入正确日期!" end if else text5="对不起!日期输入不能为空!" end if end if'响应表单按扭程序结束 %>
本程序用isdate()函数检查文本域输入的是不是标准的日期格式和数值,它能很聪明的告诉你:如下日期表达式是错误的
2001-12-21 24:12:58
因为没有“24”小时,所以是错误的,令人欣喜的是,这是由ASP内置函数来检验的,不用编写一大堆代码来限制这些数值范围了。
以上代码放在HTML标签的上面,用<%= text5 %>来输出提示信息,这个要放在<body></body>标签内的任何须要显示出错信息的地方。
经过以上五段代码的重重检验,你的用户系统将无懈可击,任何不合法的表单信息均被彻底拒之于门外,并且会很聪明的告诉操作者,所有出错信息,提示用户重新输入。
升级你的程序
以下把上面编写的代码拼合在一起,构成一个完整的注册页,你可以把它复制到DW MX中,在设计视图下察看它的页面样式和测试,本页代码没与数据库连接,可以直接测试效果。
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <% if request.form("ADD")="form1" then '检查用户名是否为空 dim txtTT'声明变量 dim text1'用于输出提示信息 txtTT=request.form("user") if txtTT<>"" then'当输入不为空时 if len(txtTT)<=15 and len(txtTT)>=2 then'检查字符长度 if Instr(txtTT,"$")=0 and Instr(txtTT,"~")=0 and Instr(txtTT,"@")=0 &_ Instr(txtTT,"#")=0 and Instr(txtTT,"*")=0 and Instr(txtTT,"/")=0 and Instr(txtTT,"/")=0 then OFFNO1=True'打开OFFNO,用此变量判断,执行插入记录程序 else text1="对不起!不能输入“$”“~”“@”“#”“*”“/”/“)”“(”等字符" end if else text1="对不起!用户名字符必须在于2至15个以内。" end if else text1="对不起!用户名不能为空!" end if
'检查密码 dim pws, pws2,text2,OFFNO2 pws=request.form("pws") pws2=request.form("pws2") if pws<>"" then if pws=pws2 then OFFNO2=True'打开OFFNO,用此变量判断,执行插入记录程序 else text2="对不起!两次输入的密码不一致!" end if else text2="对不起!密码输入不能为空!" end if
'检查电子邮箱地址格式 dim txtemail,text4 txtemail=request.form("email") if (Instr(txtemail,".")-Instr(txtemail,"@"))>1 and (Instr(txtemail,".")>0 and Instr(txtemail,"@"))>0 then OFFNO3=True'打开OFFNO,用此变量判断,执行插入记录程序 else text3="对不起!你输入的电子邮箱地址格式不正确或为空!" end if
'检查QQ号码是否为数字 dim NOber'声明变量 dim text'输入信息 NOber=request.form("QQ")'把文本域赋值给NOber变量 if NOber="" then'当文本域内容为空时 text="对不起!QQ不能为空!"'输出提示信息 elseif Isnumeric(NOber)=True then'当输入的是数字的时,结果为真 if len(NOber)<=15 and len(NOber)>=6 then'用LEN函数检文本域字节数是否在6至12内 if Instr(NOber,".")=0 then'判断文本域的值是否带有小数点 OFFNO4=True'打开OFFNO,用此变量判断,执行插入记录程序 else text4="对不起!QQ不能带有小数点" end if else text4="对不起!QQ号码不能大于15位和小于6位" end if else'最后,文本域不是数字格式,输出出错信息 text4="对不起!QQ号码必须是数字!" end if'表单检验结束
'检电话号码格式是否正确 dim TelTXT dim text5 TelTXT=request.form("Tel") if TelTXT<>"" then'当值不为空时向下执行 if Instr(TelTXT,"-")>0 then'检查号码中是否含有“-”,有的向下执行 if Isnumeric(replace(TelTXT,"-",""))=True then'删除“-”然后检查是否数字,是数字的话向下执行 if Instr(TelTXT,"-")>3 and Instr(TelTXT,"-")<6 then'检查区号是否在3至4位以内 if left(TelTXT,1)=0 then'检查区号头位数字是否为0 if len(TelTXT)-Instr(TelTXT,"-")>=5 and len(TelTXT)-Instr(TelTXT,"-")<=8 then'检查电话号码是否在5位至8位以内 OFFNO5=True'打开OFFNO,用此变量判断,执行插入记录程序 else text5="对示起!电话号码不能多于8位小于5位。" end if'检查电话号码位数 else text5="对不起!区号应位数字必须是0!" end if'检查区号头位数字是否为0结束 else text5="对不起!区号位数不能少于3位和大小4位。" end if'检区号位数结束 else text5="对不起!电话号码必须是数字!" end if'删除“-” else text5="对不起!必须输入区号!" end if'检区号结束 else text5="对不起!电话号码输入不能为空!" end if'检查文本域是否为空结束
'检查生日期格式是否正确 dim Timel dim text6 Timel=request.form("datel") if Timel<>"" then if isdate(Timel)=True then OFFNO6=True'打开OFFNO,用此变量判断,执行插入记录程序 else text6="对不起!请输入正确的生日日期!" end if else text6="对不起!生日日期输入不能为空!" end if end if %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>如何在服务器端检验表单的合法性</title> </head> <body> <%if OFFNO1=True and OFFNO2=True and OFFNO3=True and OFFNO4=True and OFFNO5=True and OFFNO6=True then%> <% '注:这里放置COMMANAD插入命令... %> <table width="506" border="1" align="center" cellpadding="3" cellspacing="0"> <tr> <td width="506">恭喜!注册成功!</td> </tr> </table> <%else%> <form name="form1" method="post" action=""> <table width="572" border="0" align="center" cellpadding="3" cellspacing="1" bgcolor="#FFCC66"> <tr bgcolor="#FFFFFF"> <td width="101">用户名:</td> <td width="456"> <input name="user" type="text" id="timel8" value="<%=request.form("user")%>"> 必填,2至15个以内</td> </tr> <tr bgcolor="#FFFFFF"> <td>密 码:</td> <td> <input name="pws" type="password" id="timel9" value="<%if OFFNO2=True then response.write(request.form("pws"))%>"> 必填</td> </tr> <tr bgcolor="#FFFFFF"> <td>重复密码:</td> <td> <input name="pws2" type="password" id="timel10" value="<%if OFFNO2=True then response.write(request.form("pws2"))%>"> 必填</td> </tr> <tr bgcolor="#FFFFFF"> <td>电子邮箱:</td> <td> <input name="email" type="text" id="timel11" value="<%=request.form("email")%>"> 必填</td> </tr> <tr bgcolor="#FFFFFF"> <td>QQ:</td> <td> <input name="qq" type="text" id="timel12" value="<%=request.form("qq")%>"> 必须为数字</td> </tr> <tr bgcolor="#FFFFFF"> <td>联系电话:</td> <td><input name="tel" type="text" id="tel" value="<%=request.form("tel")%>"> 要填区号,格式:020-5584795</td> </tr> <tr bgcolor="#FFFFFF"> <td>出生日期:</td> <td><input name="datel" type="text" id="datel" value="<%=request.form("datel")%>"> 格式:1980-5-20</td> </tr> <tr bgcolor="#FFFFFF"> <td> </td> <td><input name="Sub" type="submit" id="Sub3" value="提交"> <input name="ADD" type="hidden" id="ADD" value="form1"></td> </tr> </table> </form> <%if request.form("ADD")="form1" then if OFFNO1<>True or OFFNO2<>True or OFFNO3<>True or OFFNO4<>True or OFFNO5<>True or OFFNO6<>True then%> <table width="571" border="1" align="center" cellpadding="0" cellspacing="0"> <tr> <td width="571"><%= text1%></td> </tr> <tr> <td><%= text2%></td> </tr> <tr> <td><%= text3%></td> </tr> <tr> <td><%= text4%></td> </tr> <tr> <td><%= text5%></td> </tr> <tr> <td><%= text6%></td> </tr> </table> <%end if end if%> <% end if %> </body> </html>
升级注意事项:
可以把HTML标签上的ASP代码放入你的注册页,把各文本域名称对号入座修改成与你的注册页相对应即可,如无特别要求,程序基本上不用改了。
如果你使用COMMAND命令插入记录,请把命令体放在:
<%if OFFNO1=True and OFFNO2=True and OFFNO3=True and OFFNO4=True and OFFNO5=True and OFFNO6=True then%> <% '注:这里放置COMMANAD插入命令... %> <table width="506" border="1" align="center" cellpadding="3" cellspacing="0"> <tr> <td width="506">恭喜!注册成功!</td> </tr> </table> <%else%>
...
<%end if%>
如果你用的是DW MX的“插入记录”行为,请找到两句代码:
If (CStr(Request("MM_insert")) = "form1") Then
代码是相同的,只不过有两句,把它都修改成:
If (CStr(Request("MM_insert")) = "form1") and OFFNO1=True and OFFNO2=True and OFFNO3=True and OFFNO4=True and OFFNO5=True and OFFNO6=True then
就OK了。
做成功了吗?做成了,叫你的朋友帮你测试一下,别忘了在你朋友面前自夸一下,“俺的技术又更上一层楼了”,哈哈。
<------------完-----------> 【转自世纪安全网 http://www.21safe.com】
|