因此，只有严密地验证用户输入的合法性，才能有效地抵抗黑客的攻击。应用程序可以用多种方法（甚至是验证范围重叠的方法）执行验证，例如，在认可用户输入之前执行验证，确保用户输入只包含合法的字符，而且所有输入域的内容长度都没有超过范围（以防范可能出现的缓冲区溢出攻击），在此基础上再执行其他验证，确保用户输入的数据不仅合法，而且合理。必要时不仅可以采取强制性的长度限制策略，而且还可以对输入内容按照明确定义的特征集执行验证。下面几点建议将帮助你正确验证用户输入数据：
⑴始终对所有的用户输入执行验证，且验证必须在一个可靠的平台上进行，应当在应用的多个层上进行。
⑶设立“信任代码基地”，允许数据进入信任环境之前执行彻底的验证。
⑷登录数据之前先检查数据类型。
⑸详尽地定义每一种数据格式，例如缓冲区长度、整数类型等。
⑹严格定义合法的用户请求，拒绝所有其他请求。
⑺测试数据是否满足合法的条件，而不是测试不合法的条件。这是因为数据不合法的情况很多，难以详尽列举。
下面给出了五个例子，阐述如何按照上述建议增强应用程序的安全性。这些例子示范了代码中可能出现的缺陷，以及它们带来的安全风险、如何改写最少的代码来有效地降低攻击风险。
盲目信任用户输入是保障Web应用安全的第一敌人。用户输入的主要来源是HTML表单中提交的参数，如果不能严格地验证这些参数的合法性，就有可能危及服务器的安全。
下面的C#代码查询后端SQLServer数据库，假设user和password变量的值直接取自用户输入：
从表面上看，这几行代码毫无问题，实际上却可能引来SQL注入式攻击。攻击者只要在user输入域中输入“OR1=1”，就可以顺利登录系统，或者只要在查询之后加上适当的调用，就可以执行任意Shell命令：
在编写这几行代码时，程序员无意之中作出了这样的假定：用户的输入内容只包含“正常的”数据――合乎人们通常习惯的用户名字、密码，但不会包含引号之类的特殊字符，这正是SQL注入式攻击能够得逞的根本原因。黑客们可以借助一些具有特殊含义的字符改变查询的本意，进而调用任意函数或过程。
域验证器是一种让ASP.NET程序员对域的值实施限制的机制，例如，限制用户输入的域值必须匹配特定的表达式。
要防止上述攻击行为得逞，第一种办法是禁止引号之类的特殊字符输入，第二种办法更严格，即限定输入域的内容必须属于某个合法字符的集合，例如“[a-zA-Z0-9]*”。
然而，仅仅为每个输入域引入验证器还不能防范所有通过修改参数实施的攻击。在执行数值范围检查之时，还要指定正确的数据类型。
也就是说，在使用ASP.NET的范围检查控件时，应当根据输入域要求的数据类型指定适当的Type属性，因为Type的默认值是String。
由于没有指定Type属性值，上面的代码将假定输入值的类型是String，因此RangeValidator验证器只能确保字符串由0-9之间的字符开始，“0abcd”也会被认可。
要确保输入值确实是整数，正确的办法是将Type属性指定为Integer：
在ASP.NET应用中，几乎所有HTML页面的__VIEWSTATE隐藏域中都可以找到有关应用的信息。由于__VIEWSTATE是BASE64编码的，所以常常被忽略，但黑客可以方便地解码BASE64数据，用不着花什么力气就可以得到__VIEWSTATE提供的详细资料。
默认情况下，__VIEWSTATE数据将包含：
设置EnableViewStatMAC="true"，启用__VIEWSTATE数据加密功能。然后，将machineKey验证类型设置成3DES，要求ASP.NET用TripleDES对称加密算法加密ViewState数据。
正如前文“篡改参数”部分描述的，攻击者可以在输入域中插入特殊字符，改变SQL查询的本意，欺骗数据库服务器执行恶意的查询。
恶意查询有可能获取后端数据库保存的任何信息，例如客户信用卡号码的清单。
除了前面介绍的办法――用程序代码确保输入内容只包含有效字符，另一种更加健壮的办法是使用SQL参数API（例如ADO.NET提供的API），让编程环境的底层API（而不是程序员）来构造查询。
使用这些API时，程序员或者提供一个查询模板，或者提供一个存储过程，然后指定一系列的参数值，由底层API将参数值嵌入到查询模板，然后将构造出来的查询提交给服务器查询。这种办法的好处是确保参数能够正确地嵌入，例如，系统将对引号进行转义处理，从根本上杜绝SQL注入式攻击的发生。同时，在表单中引号仍是一个允许输入的有效字符，这也是使用底层API的一个优点。
按照这种思路修改前文“篡改参数”部分的例子，结果如下：
跨站脚本执行（Cross-sitescripting）是指将恶意的用户输入嵌入到应答（HTML）页面。例如，下面的ASP.NET页面虽然简单，却包含着一个重大的安全缺陷：
在一个双层的安全体系中，对HTML页面中出现的外发用户数据执行输入验证和HTML编码，确保浏览器只把用户输入数据当成纯粹的文本，而不是其他具有特殊含义的内容，例如HTML代码、JavaScript脚本。
对于本例，只要加入一个HtmlEncode调用即可：
这样，应答HTML流将包含用户输入内容的HTML编码版本，也就是说，浏览器不会执行用户输入的JavaScript代码，因为根本不存在HTML的“＜SCRIPT＞”标记，用户输入的“＜”和“＞”字符已经被替换成HTML编码版本，即“＜”和“＞”。
由于需求不断变化，一些单位平均每三个月就要部署新的应用，同时由于人员流动，所以对程序员快速开发健壮的、高质量的代码寄予很高的期望。虽然对所有程序员进行代码安全技术的培训是十分必要的，但不可否认，自动检测代码安全漏洞的工具也有助于快速开发安全的应用程序。
到目前为止，程序员常用的工具只能涵盖功能测试的特定方面，例如性能测试，BUG/故障点侦查。人工检查代码有着许多与生俱来的局限，而且要求程序员具有丰富的代码安全经验，所以对于编写高质量的应用来说，面向应用程序安全及其在恶意环境下行为的工具也是十分关键的。
要迅速提高应用的质量和安全性，最有效的办法是给程序员提供一个自动测试应用的工具。如果在单元测试期间，工具能够检测出应用的安全缺陷，并将修补建议嵌入到代码之中，程序员就能立即找出代码中存在的错误，不仅方便了现有错误的修改，而且也有助于避免将来再犯同样的错误，不断地提高代码抗御攻击的能力。
结束语：Web服务应用正在爆炸式增长，越来越多的应用被推出到防火墙之外，安全性脆弱的Web应用面临的风险也只会有增无减。同时，为了在紧迫的时限之前快速完成应用开发，程序员面临的压力也越来越大。注重编写代码时的安全问题，同时投入必要的资源，这样才能为未来的Web服务应用做好准备，同时确保当前应用的高质量。只有从应用的出生之日开始就采取正确的措施来确保其安全性，才能构造出高质量、安全的应用。