文章教程

9.4技术解惑

8/31/2020 9:56:04 PM 人评论 次浏览

Web开发者,特别是ASP开发者,一直对数据验证比较恼火,因为当好不容易写出数据提交程序的主体以后,还不得不花大把时间去验证用户的每一个输入是否合法。如果开发者熟悉JavaScript或者VBScript,则可以用这些脚本语言轻松实现验证。但是又需要考虑用户浏览器是否支持这些脚本语言。如果对这些脚本语言不是很熟悉或者想支持所有用户浏览器,就必须在ASP程序里面验证,但这样就会增加服务器负担。现在有了ASP.NET后,不但可以轻松实现对用户输入的验证,而且还可以选择验证是在服务器端进行还是在客户端进行,再也不必考虑那么多了。这样程序员就可以将重要的精力放在主程序的设计工作上了。

对数据进行检查验证时,按时机可以分为客户端检查和服务器端检查。在客户端检查是指通过客户端脚本(如JavaScript脚本或者VBScript脚本)进行检查。利用客户端脚本检查的好处是减小网络流量、减轻服务器压力和反映迅速。因为客户端脚本是在客户端运行,定义好检验规则后,在客户端就可以完成检验。一旦不能通过验证客户端马上就能得到提示信息,而不用将整个表单提交到服务器(笔者早些年就有这样的经历:网速28.8kbit/s的情况下提交一个注册表单,数分钟后得到服务器的反馈:用户名不符合要求),用户体验非常好。客户端验证也有一些缺点:因为验证规则完全定义在客户端脚本中,不怀好意的窥探者可以从这些客户端代码找出用户脚本的漏洞或者某些跳过脚本验证的方法,从而使网站的健壮性出现问题,这就对客户端代码的客户端脚本编程能力提出了挑战。另外,客户端验证可能会使程序员写得非常优秀的代码在短短几天便流传于整个网络,不能进行版权控制。

在服务器端检查是指将表单提交到服务器后,在服务器上用服务器端代码进行验证。例如,用C#或者VB.NET等。服务器端验证的优点是验证规则对用户来说是一个黑匣子,比较难找出验证代码的漏洞,并且服务器端验证的代码编写相对客户端脚本要容易得多。但是服务器端验证也有缺点,那就是大量的复杂验证会降低服务器的性能。

因此,一般验证办法都是将上面两种验证方法相结合,利用客户端验证建立验证的第一道关卡,这个关卡将大量无意中填写的不符合要求的数据阻止在客户端。然后在服务器端建立第二道关卡,将那些利用了客户端脚本漏洞的数据阻止在保存之前。

如果在开发中要提高网站的健壮性,需要遵循如下两个原则。

(1)尽量减少让用户输入的机会,如数据的录入时间可以设置为该条记录自动获取数据库服务器的当前时间,这一点可以在创建或者设计表的时候实现。例如下面的代码。

create table ActionLog (
    LogID       bigint        identity(1,1),
    UserID       int         not null,
    UserIP      varchar(15)      not null,
    ActionDate     datetime        null default getdate(),
    ActionDescription  nvarchar(800)       not null,
    ActionStatus    tinyint        not null,
    WebSiteID    int          not null,
    constraint PK_ACTIONLOG primary key (LogID)
)

在上述代码中,ActionDate字段就是设置成自动获取数据库服务器当前时间,这样在插入记录时无需在这个字段插入值。如果这个值让用户填写,则可能会造成如下两个后果。

  • 用户没有按照要求的格式填写。
  • 即使按照要求的格式填写,也可能不填写当前时间。
  • 如果采用上面的办法就能有效地避免这个问题。

(2)不要过分相信用户一定会按照要求规规矩矩去做,他们可能不太懂得格式规则和要求之类的,这就经常需要对用户填写的数据进行检查。如果能对用户提交的数据进行充分的检查,那么就能有效地提高程序的健壮性,这样也能从某些途径上堵住黑客入侵系统的漏洞。


教程类别