用户的输入可能是多种多样的:你必须在交互式的控件中尽可能的验证输入 。写一些用户输入验证可能很做作,而且也有出错的可能,但还是很有必要的。 不能太相信用户的输入,用户可能会输入任何内容导致异常发生,进而进行SQL 注入式攻击。我们不希望任何类似这样的事情发生。你应该了解足够的信息来怀 疑用户的输入。很好,每个人都应该这样做,这也就是为什么.Net框架已经扩展 了这样的功能,你可以使用这些功能从而使自己的代码编写工作减到最小,因为 我们要对用户输入的每一块数据都要进行验证。
.Net框架提供了不同的 机制来验证用户的输入,分别可以用在Web和Windows应用程序中。Web应用程序 应该在浏览器上进行数据验证,一般是使用JavaScript。一些验证控件在HTML面 而中生成一些JS代码,这对你的用户来说是很有效的:在对每一项输入时,他们 不用每次返回数据到服务上。这些Web控件是使用正则表达式的扩展功能来完成 对用户输入的验证,这些验证可以在页面提交到服务器之间完成。即使如此,你 还是要在服务器上做一些额外的验证,以免受到程序式的攻击。Windows就用程 序使用不同的模式。用户的输入可以直接在应用程序中用C#代码来验证。所有的 Windows控件都是可验证的,当你想通知用户的非法输入时。一般的模式是使用 属性访问时的异常来指示非法的输入。UI控件捕获这些异常然后显示错误给用户 。
你可以使用5个web控件来处理ASP.net应用程序中的大多数验证任务。 这5个控件都是由属性来控制这些要验证的特殊的字段。 RequiredFieldValidator 强制用户在给定字段中输入一个值,RangeValidator 要求特殊的字段提供的值在给定范围内,这个范围可是一个数的大小,也可以是 一个字符串的长度。CompareValidator 可以让你构造一个验证规则来验证表单 上两个同的控件。这三个控件都很简单。最后两个控件提供了强大的功能,可以 让你根据你想要求的方法进行验证。RegularExpression 验证使用与此同时表达 式来验证用户的输入。如果与比较返回匹配,输入的就是合法的。正则表达式是 很有用的语言。你可以为你所有的实际情况创建正则表达式。VS.net包含了一些 验证的表达式,这可以帮助你开始学习它。这有一些帮助你学习更多正则表达式 的有用资料,而且我强烈鼓励你学习它。但我不能跑题而不给你提供一些最常用 的构造。表5.1显示了最常用的一些正则表达式元素,你可能会在你的应用程序 中用来验证输入:
表5.1 常用的正则表达式
构造含意
[a -z]匹配单个小写字符。括号内的字符集中的任何字符与单个字符匹配。
\d任何数字。
^,$^表示串的开始, $表示结束。
\w匹配任何 单词.这是[A-Za-z0-9]简写。
(?NamedGroup\d{4,16})显示两个不同的常 用元素,?NamedGroup 定义了一个特殊的变量来引用匹配。{4,16}匹配前面的构 造至少4次最多16次。这一模式匹配一个至少包含4个但不超过16个数字的字符串 。如果匹配存在,那么结果会存储在NamedGroup中以便后面使用。
(a|b|c)匹配a或b或c。 用坚线分开的是选择操作:输入的可是其中的任何一个 。
(?(NamedGroup)a|b) 可选的。这与C#里的三元操作等效,也就是说, 如果NamedGroup 存在,匹配a,否则匹配b.
(译注,关于正则表达式这里 只是简单的说明了一下。觉得作者在这里写正则表达式很是不伦不类,即不全也 不精。)
使用这些及正则表达式的构造,你可以发现你可以验证用户提交 给你的任何内容。如果正则表达式还不够,你还可以通过从CustomValidator 派 生一个新在类添加你自己的验证。这是一个不小的工作,而且我尽可能的避免它 。当你用C#写了一服务器函数来验证数据后,还要用ECMAscript写一个客户端的 验证函数。我讨厌同样的事做两遍,而且我也尽可能的避免用ECMAscript写任何 内容,所以,我喜欢粘贴正则表达式式。
例如,这有一个正则表达式, 用于验证US的电话号码。它接受区号用括号括起来的,或者没有括号的,然后就 是区号和号码之间的空格,交换局号(exchange ),以及号码。区号和交换局号 之间的横线也是可选的:
((\(\s*\d{3}\s*\))|(\d{3}))-?\s*\d{3}\s*-\s*\d{4}
通过查验每一个组的表达式,这样的逻辑是很清楚的:
((\(\s*\d{3}\s*\))|(\d{3}))-?