SQLServer2005联机丛书SQLInjection发送反馈请参阅全部折叠全部展开SQLInjection是一种攻击方法,它可以将恶意代码插入到以后将传递给SQLServer供分析和执行的字符串中。任何构成SQL语句的过程都应进行注入漏洞检查,因为SQLServer将执行其接收到的所有语法有效的查询。SQLInjection的主要形式包括直接将代码插入与SQL命令串联并执行的用户输入变量。一种间接的攻击会将恶意代码注入要在表中存储或作为元数据存储的字符串。在存储的字符串随后串连到一个动态SQL命令中时,将执行该恶意代码。基本的攻击是提前终止文本字符串,然后追加一个新的命令。由于插入的命令可能在执行前追加其他字符串,因此攻击者将用注释标记“--”来中止注入的字符串。执行时,此后的文本将被忽略。以下脚本阐释了一个简单的SQLInjection攻击。此脚本通过串联硬编码字符串和用户输入的字符串而生成一个SQL查询。复制代码varShipcity;ShipCity=Request.form("ShipCity");varsql="select*fromOrdersTablewhereShipCity='"+ShipCity+"'";用户将被提示输入一个城市名称。如果用户输入Redmond,则查询将由以下这样的脚本组成:复制代码select*fromOrdersTablewhereShipCity='Redmond'如果用户输入如下内容会怎样呢?Redmond';droptableOrdersTable--此时,查询将由如下所示的脚本组成:复制代码select*fromOrdersTablewhereShipCity='Redmond';droptableOrdersTable--'“;”字符表示一个查询的结束和另一个查询的开始。“--”字符序列则表示当前行余下的部分是一个注释,应该忽略。如果更改后的代码语法正确,则服务器将执行该代码。SQLServer在处理此语句时,将首先选择OrdersTable中的所有记录(其中ShipCity为Redmond),然后删除OrdersTable。只要注入的SQL代码语法正确,就无法用编程方式来检测篡改。因此,必须验证所有用户输入,并仔细检查在服务器中执行构造SQL命令的代码。下面讨论了一些编写代码的最佳做法。验证所有输入始终通过测试类型、长度、格式和范围来验证用户输入。实现对恶意输入的预防时,请注意应用程序的体系结构和部署方案。请记住,为在安全环境下运行而设计的程序可能被复制到不安全的环境中。以下建议应被视为最佳做法:对应用程序接收的数据不做任何有关大小、类型或内容的假设。例如,评估以下内容:如果是一个用户在需要邮政编码的位置无意中或恶意地输入了一个10MB的MPEG文件,应用程序会做出什么反应?如果在文本字段中嵌入了一个DROPT...