SQL注入安全威胁

发表于:2009-7-23 13:52

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:译者:风过无息    来源:51Testing投稿

  SQL注入对于那些使用动态的SQL数据库的系统是一个严重的威胁(也就是说,应用系统运行的时候,SQL会被编译)。一个熟知SQL技术的黑客很容易攻击这样防护薄弱的系统,但良好的应用程序设计可以减少风险。不要只是眼于满足纸上谈兵,设计人员就必须仔细考虑如何防护黑客可能对应用系统进行的攻击。此外,数据库管理员必须给软件开发者最小系统的权限。

  创建一个测试应用系统

  我们创建一个简单的测试应用系统可以帮你更好的理解SQL注入是怎么实现的。这个系统是用SQL Server Northwind数据库。为了简化创建应用系统,Employees表是用来作为的用户表。用户的第一个名字和最后一个在名字都存在Employees表。第一个名字和最后一个名字和实际的应用系统中输入的用户名和密码关联。用户可以登录时使用动态SQL,一个参数化查询或存储过程。

  你可以下载SQL语句ValidateUserProc.sql,或者得到应用系统的源代码injectSQL.cs 或者injectSQL.vb。

  虽然这个示例应用程序是一个Windows应用程序,这可能是一个Web应用程序,甚至是Java应用程序。采用动态SQL和完全独立于操作系统,数据库厂商,和编写应用程序的编程语言,造成的直接后果就是出现这样的缺陷。

  ……………………

  查看全文请点击下载http://www.51testing.com/html/82/n-141082.html

  通过存储过程来预防

  存储过程可以在创建的时候被编译,但是这些SQL语句在创建的时候会被冻结住,参考上面的例子

  ' or 1=1-

  利用Stored Proc Login按钮,SQL事件探查器显示实际执行:

  exec ValidateUser @FirstName = N''' or 1=1--',@LastName = N''

  Where @FirstName contains the following characters: ' or 1=1-

  当FirstName包含' or 1=1-这样的字符时,无论你输入的@FirstName还是 @LastName,存储过程将始终只有执行在创建时候所定义在存储过程中的SELECT语句。 SQL语句的执行是不会因为输入而改变。此存储过程包含2个输入,都是字符串,不管这些输入字符串包含什么,都会被总是当作字符串。即使一个分号被视为普通的输入字符,而不是SQL语句分隔符。

  需要特别声明的是,存储过程本身并不防范SQL注入,也就是说如果存储过程本身使用动态SQL的话它也可以SQL注入。在一个取名为sp_excutesql的存储过程中建立SQL字符串在执行的时候与在应用程序中建立SQL字符串在执行的时候一样易受攻击。有一点需要澄清的是:一个存储过程并不一定是易受SQL注入的攻击和它的取名无关。这完全取决于用户怎样使用它。

  以下是SQL事件探查表明在执行时有一个企图绕过身份验证,而使用一个参数化查询:

  exec sp_executesql

  N'select EmployeeID from Employees

  where FirstName = @FirstName and LastName = @LastName',

  N'@FirstNamenvarchar(4000),@LastName nvarchar(4000)'

  , @FirstName = N''' or 1=1--'

  , @LastName = N''

  正如你所看到的,一个参数化查询是类似于存储过程,因为它处理的输入作为参数,而不是字符串,可以改变文字的查询字符串。如果您下载并审查代码示例,您将看到的代码,以参数化查询与代码调用一个存储过程是非常相似的。

  ……………………

查看全文请点击下载:http://www.51testing.com/html/82/n-141082.html

版权声明:51Testing软件测试及相关内容提供者拥有51testing.com内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号