Effective C#原则39:使用.Net验证

用户的输入可能是多种多样的:你必须在交互式的控件中尽可能的验证输入 。写一些用户输入验证可能很做作,而且也有出错的可能,但还是很有必要的。 不能太相信用户的输入,用户可能会输入任何内容导致异常发生,进而进行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}))-?

时间: 2024-11-01 06:55:35

Effective C#原则39:使用.Net验证的相关文章

Effective C#原则47:选择安全的代码

.Net运行时已经设计好了,一些怀有恶意的代码不能渗透到远程计算机上并 执行.目前一些分部式系统依懒于从远程机器上下载和执行代码.如果你可以通 过Internet或者以太网来发布你的软件,或者直接从web上运行,但你须要明白 CRL在你的程序集中的一些限制.如果CLR不是完全相信一个程序集,它会限制一 些的行为.这些调用代码要有访问安全认证(CAS).从另一方面来说,CLR强制要 求基于角色的安全认证,这样这些代码才能或者不能在基于一个特殊的角色帐号 下运行. 安全违例是运行时条件,编译器不能强

Effective C#原则45:选择强异常来保护程序

当你抛出异常时,你就在应用程序中引入了一个中断事件.而且危机到程序 的控制流程.使得期望的行为不能发生.更糟糕的是,你还要把清理工作留给最 终写代码捕获了异常的程序员.而当一个异常发生时,如果你可以从你所管理的 程序状态中直接捕获,那么你还可以采取一些有效的方法.谢天谢地,C#社区不 须要创建自己的异常安全策略,C++社区里的人已经为我们完成了所有的艰巨的 工作.以Tom Cargill的文章开头:"异常处理:一种错误的安全感觉, " 而且Herb Sutter,Scott Meyer

Effective C#原则41:选择DataSet而不是自定义的数据结构

因为两个原则,把DataSet的名声搞的不好.首先就是使用XML序列化的 DataSet与其它的非.Net代码进行交互时不方便.如果在Web服务的API中使用 DataSet时,在与其它没有使用.Net框架的系统进行交互时会相当困难.其次, 它是一个很一般的容器.你可以通过欺骗.Net框架里的一些安全类型来错误 DataSet.但在现代软件系统中,DataSet还可以解决很多常规的问题.如果你明 白它的优势,避免它的缺点,你就可以扩展这个类型了. DataSet类设计 出来是为了离线使用一些存储

Effective C#原则33:限制类型的访问

并不是所有的人都须要知道所有的事.也不是所有的类型须要是公共的.对于每个类型,在满足功能的情况下,应该尽可能的限制访问级别.而且这些访问级别往往比你想像的要少得多.在一个私有类型上,所有的用户都可以通过一个公共的接口来访问这个接口所定义的功能. 让我们回到最根本的情况上来:强大的工具和懒惰的开发人员.VS.net对于他们来说是一个伟大的高产工具.我用VS.net或者C# Builder轻松的开发我所有的项目,因为它让我更快的完成任务.其中一个加强的高产工具就是让你只用点两下按钮,一个类就创建了,

Effective C#原则32:选择小而内聚的程序集

这一原则实际应该取这个名字:"应该创建大小合理而且包含少量公共 类型的程序集".但这太沉长了,所以就以我认为最常见的错误来命名: 开发人员总是把所有的东西,除了厨房里水沟以外(译注:夸张说法,kitchen sink可能是个口语词,没能查到是什么意思,所以就直译了.),都放到一个程 序集.这不利于重用其中的组件,也不利于系统中小部份的更新.很多以二进制 组件形式存在的小程序集可以让这些都变得简单. 然而这个标题对于程 序集的内聚来说也很醒目的.程序集的内聚性是指概念单元到单个组件的职责

Effective C#原则11:选择foreach循环

C#的foreach语句是从do,while,或者for循环语句变化而来的,它相对要好 一些,它可以为你的任何集合产生最好的迭代代码.它的定义依懒于.Net框架里 的集合接口,并且编译器会为实际的集合生成最好的代码.当你在集合上做迭代 时,可用使用foreach来取代其它的循环结构.检查下面的三个循环: int [] foo = new int[100]; // Loop 1: foreach ( int i in foo) Console.WriteLine( i.ToString( ));

Effective C#原则10:明白GetHashCode()的缺陷

这是本书中唯一一个被一整个函数占用的原则,你应该避免写这样的函数. GetHashCode()仅在一种情况下使用:那就是对象被用于基于散列的集合的关键 词,如经典的HashTable或者Dictionary容器.这很不错,由于在基类上实现的 GetHashCode()存在大量的问题.对于引用类型,它可以工作,但高效不高:对 于值类型,基类的实现经常出错.这更糟糕.你自己完全可以写一个即高效又正 确的GetHashCode().没有那个单一的函数比GetHashCode()讨论的更多,且令人 困惑

Effective C#原则7: 选择恒定的原子值类型数据

恒定类型(immutable types)其实很简单,就是一但它们被创建,它们(的值) 就是固定的.如果你验证一些准备用于创建一个对象的参数,你知道它在验证状 态从前面的观点上看.你不能修改一个对象的内部状态使之成为无效的.在一个 对象被创建后,你必须自己小心翼翼的保护对象,否则你不得不做错误验证来禁 止改变任何状态.恒定类型天生就具有线程完全性的特点:多访问者可同时访问 相同的内容.如果内部状态不能修改,那么就不能给不同的线程提供查看不一致 的数据视图的机会.恒定类型可以从你的类上安全的暴露出

Effective C#原则50:了解ECMA标准

ECMA标准是C#语言所有功能的官方说明.ECMA-334定义了C#语言1.0的标准, 你可以从The C# Programming Language这本书上学习C#2.0的计划(译注:现在 已经不是计划了),这本书的作者是Anders Hejlsberg, Scott Wiltamuth, 和 Peter Golde (Addison-Wesley, 2003).这本书是一个语言手册,而不是指南. 它详细说明了这门语言书面定义的每一个功能.每一种语言都只一种标记,可以 让你更加明白每一种语言的