| 网站首页 | 新闻中心 | 系统安全 | 网络安全 | 安全技术 | 下载中心 | 
课件制作网.
收藏本站
设为首页
安全365
如何在服务器端检验表单的合法性
如何在服务器端检验表单的合法性
作者:佚名 文章来源:不详 点击数: 更新时间:2007-1-25 17:52:43

表单是客户端浏览器与服务器交互数据重要对象,如何使表单信息符合我们的规范要求,把有用的信息提交到服务器,成为任何一个站点重要项目。当然,你可以使用DW MX里的“行为”(不是服务器行为),来生成JS代码检查表单,这是在客户端执行的,如果用户的浏览器版本过低,可能会逃过客户端检验,直接提交到服务器了,假若你的数据库字段设为不允许为空,那么就会报错,这倒没什么,数据插不入了没关系,关键是这样会损害我们站点的声誉,说我们的技术水平低,让人笑掉大牙。我并不是说这样不好,客户端检验表单会减少对服务器资源占用,本文介绍的是如何在服务器端检验表单的,与客户端无关,任何不合法的信息均被拒之门外。最好两种方法都用,逃过了客户端还有在服务器端“设卡”彻底检验一次,任何非法信息都难逃我之眼耳。

准备好“架生”了吗?启动你的DW MX,打开你的注册页,依照本文介绍的方法,给你的注册页进行“小手术”,可以不费力气地达到目的。以下例子只要提供代码,使用了一些ASP内置函数,具体工作原理不再细讲,读者可根据注释自己理解代码执行原理。

了解表单常用来提交那种信息:

  1. 纯数字类型数据,除数值型数字外,不允许包含任何文本字符
  2. 纯文本类型数据,可以是任何字符
  3. 电子邮箱地址,必须有“@”和“.”这两个符号,格式:abc7294@163.com
  4. 电话号码,包括区号,格式:020-8574256
  5. 日期时间,格式:2004-4-22 16:25:15

本来,还有一个要求就是限制只填中文或英文,考虑到大家都是中华民族子女,没有必要把这点也限制了,填英文就不准填中文,所以本文没有介绍这点。我的要求就是以上5点,任何一条信息都必须是合法的,才能插入到数据库中。

一、检查文本域信息是否为数值型数据

文本域名称 Number
按扭我称 sub

要求:只能输入数字类型数据

源程序:

功能扩展:

(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)不能输入小数点

要求:只能输入整数,不能带有小数点

以上代码放在HTML标签的上面,用<%= text %>来输出提示信息,这个要放在<body></body>标签内的任何须要显示出错信息的地方。

二、检验文本类型数据

文本域名称 txt
按扭名称 Sub

要求:可以是任何字符,但不能为空

源程序:

功能扩展:

(1)限制字符数

要求:输入不大于6个字符和不小于2个字符


以上代码用于检查文本或文本区域字符数。

(2)过滤输入特殊字符

要求:不能输入“$”“~”“@”“#”“*”“/”/“)”“(”等字符

方法一:用replace()函数删除这些特殊字符

如果要想过滤更多的字符,text2= replace(text2,"/","")增加这句即可,把“/”换成你想要过滤的字符。

方法二:用Instr()函数阻止含有这些字符的文本通过检验

要求:不能含有上述特殊字符

如果你想添加更多自定过滤字符,增加and Instr(txtTT,"/")=0即可,把"/"改为你想限制输入的字符。

以上代码放在HTML标签的上面,用<%= text2 %>来输出提示信息,这个要放在<body></body>标签内的任何须要显示出错信息的地方。

三、检查电子邮箱地址格式是否正确

要求:电子邮箱地址必须含有“@”和“.”,在“@”和“.”之间不能少于一位字符,例如:

abc7294@.com这是错误的,abc7294@163.com才是对的。

文本域名称 email
按扭名称 Sub

源程序:

对于邮箱地址格式的检验,这是比较简单的方法,实际上程序只能对地址格式进行检验,究竟地址是否存在,程序就无能为力了。比较好的办法是,用户注册后成功后,用他提供的邮箱地址把密码发送到他的邮箱,并提示他,请在规定时间内打开邮箱取出密码激活帐号,否则系统将删除他的注册信息。当然,如果你的站点访问量很大,经常有一些无聊之人把一些不存在的信息插入你的数据库,如果你一条一条删,必把人累死。可用程序检测,过规定时间没有激活账号的,自动删除过期的记录。这个功能可以使用COMMAND命令实现。

以上代码放在HTML标签的上面,用<%= text3 %>来输出提示信息,这个要放在<body></body>标签内的任何须要显示出错信息的地方。

四、检查文本域的值是否包含区号间隔符

如格式:020-8956236

要求:必须填入区号

源程序:

文本域名称 Tel
按扭名称 Sub

以上代码只要检查号码中是否含有“-”这个间隔符,没的话即提示输入区号。

功能扩展:

(1)在上例基础上,限制区号位数最小不能少于3位,最大不能多于4位,并且区号的第一位数必须是“0”,电话号码最少不能小于5位,最大不能多于8位,必须全部为数字。

源程序:

经过此段程序检验,电话号码绝对符合要求,并且会非常聪地告诉操作者,错在那里了。

(2)如果是手机号码,必须为11位,不允许有“-”间隔符,号码必须为数字。

要求:手机号码数字位数不能少于10位,必须是数字,不允许有其它字符

源程序:请参考第一例。

以上代码放在HTML标签的上面,用<%= text4 %>来输出提示信息,这个要放在<body></body>标签内的任何须要显示出错信息的地方。

五、检验表单文本域的值是否为合法日期时间格式

要求:日期格式:2004-4-22  22:12:54 或 2004/4/22 22:12:54

文本域名称 tima
按扭名称 Sub

源程序:

本程序用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>密&nbsp;&nbsp; 码:</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>&nbsp;</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】
文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
     
     
     
    CSO们如何应对新技术的安
    普通企业如何应对黑客攻
    企业该如何防范由VoIP引
    浅谈IT如何实现企业的应
    黑客与正规企业是如何串
    如何无限制申请Gmail 2.
    企业如何避免人为因素的
    社会工程学:如何利用黑客
    如何在一个文件被添加到
    如何将“珊瑚虫”好友请

    Copyright © 2006-2008 www.anquan365.com 安全365
    建议使用1024*768分辨率及第三方浏览器对本站进行浏览