SQL Server安全-加密术和SQL注入攻击

日期: 2008-06-03 来源:TechTarget中国

  SQL Server上的加密术:


  SQL Server上内置了加密术用来保护各种类型的敏感数据。在很多时候,这个加密术对于你来说是完全透明的;当数据被存储时候被加密,它们被使用的时候就会自动加密。在其他的情况下,你可以选择数据是否要被加密。SQL Server可以加密下列这些组件:


  ·密码


  ·存储过程,视图,触发器,用户自定义函数,默认值,和规则。


  ·在服务器和用户之间传输的数据


  密码加密术:


  SQL Server自动将你分配给登陆和应用角色的密码加密。尽管当你可以从主数据库中直接察看系统表格而不需要密码。你不能给对这种情况作出任何修改,事实上,你根本不能破坏它。


  定义加密术:


  在有些时候,如果对对象进行加密是防止将一些信息分享给他人。例如,一个存储进程可能包含所有者的商业信息,但是这个信息不能和让其他的人看到,即使他们公开的系统表格并可以看到对象的定义。这就是为什么SQL Server允许你在创建一个对象的时候进行加密。为了加密一个存储进程,使用下面形式的CREAT PROCEDURE 语句:


  create PROCEDURE procedurename [;number]
  [@parameter datatype
  [VARYING][ = defaultvalue][OUTPUT]]
  [, …]
  [WITH RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION]


  我们关心的仅仅是可选的WITH参数。你可以详细说明ARECOMPILE或者ENCRYPTION,或者你可以同时说明它们。ENCRYPTION关键字保护SQL Server它不被公开在进程中。结果,如果ENCRYPTION在激活的时候系统存储进程sp_helptext就会被忽视,这个存储进程将被存储在用户创建进程的文本中。如果你不想要加密,你可以使用alter PROCEDURE,忽略WITH ENCRYPTION子句来重新创建一个进程。


  为了能够使用加密术。用户和服务器都应该使用TCP/IP NetworkLibraries用来连接。运行适当的Network Utility和检查Force protocol encryption,看下表,用户和服务器之间的连接将不会被加密。


用户和服务器之间的连接



  加密也不能完全自由。当连接确定后,要继续其他的构造,并且用户和服务器必须运行代码来解释加密和解释的包裹。这里将需要一些开销并且当在编译码的时候会使进程慢下来。如果网络包裹在你控制范围之外,使用这种做法是非常好的。


  加密术中缺少什么?


  你可以注意到在这个列表中缺少一些被加密的东西:你表格中的数据。在你存储数据之前,SQL Server不会提供任何内置的工具来加密你的数据。如果你需要保护存储在SQL Server上的数据,我们给你两条建议:


  第一,你可以利用GRANT和DENY关键字来控制你想哪个用户可以在SQL Server中读取的数据。


  第二.如果你真的想对数据加密,不要设法加密码。你可以利用被测试过的商业产品的算法。


  SQL 注入攻击


  SQL 注入攻击是一个常规性的攻击,它可以允许一些不法用户检索你的数据,改变服务器的设置,或者在你不小心的时候黑掉你的服务器。SQL 注入攻击不是SQL Server问题,而是不适当的程序。如果你想要运行这些程序的话,你必须明白这冒着一定的风险。


  测点定位弱点


  SQL 注入的脆弱点发生在程序开发员构造一个where子句伴随着用户的输入的时候。比如,一个简单的ASP程序允许用户输入一个顾客的ID然后检索公司的全部人员的名字,如果顾客ID如果作为ASP页面的请求串的一部分返回,那么开发员可以编写下面的代码获得数据:


  strConn = “Provider=SQLOLEDB;Data Source=(local);” & _
  ”Database=Northwind;Integrated Security=SSPI”
  Set cnn = Server.createObject(“ADODB.Connection”)
  cnn.Open strConn
  strQuery = “select ContactName FROM Customers ” & _
  “where CustomerID = ’” & Request.Form(“CustID”) & “’”
  Set rstResults = cnn.&#101xecute(strQuery)
  Response.Write(rstResults.Fields(“ContactName”).Value)
现在你知道什么地方有问题了吧?如果用户知道一个用户的ID,他可以通过检索来获得全部的相应的名字。现在明白了?


  获得额外的数据


  当然,对于一个攻击程序,尽管它不知道任何顾客的ID,甚至不用去猜,它也可以获得数据。为了完成这个工作,它将下面的文本输入到应用程序调用顾客ID的textbox中:


  customer ID:
  ’union ALL select ContactName FROM Customers
  where CustomerID <>’


  如果你输入了这个代码,你将会看到返回一个询问语句:


  select ContactName FROM Customers
  where CustomerID = ’’
  union ALL select ContactName FROM Customers
  where CustomerID <>’’


  通过获得空和非空顾客的ID并集,这个查询语句会返回数据库中所有的相关姓名。事实上,这个union技术可以被用来获得你数据库中大多数信息,看看这个CustomerID的值:


  ’union ALL select FirstName + ’ ’ + LastName FROM
  Employees where LastName <>’


  它将SQL语句变成:


  select ContactName FROM Customers
  where CustomerID = ’’
  union ALL select FirstName + ’ ’ + LastName FROM
  Employees where LastName <>’’


  看,那就是攻击程序从你的数据库获得的第一个雇员的名字。


更多的攻击程序


  如果SQL注入仅仅只有数据暴光这个弱点就已经够糟糕的了,但是,实际上一个良好的攻击程序可以通过这个弱点获取你数据库中所有的资料。看下面这个例子:


  ’;drop TABLE Customers;–


  SQL语句变成:



  select ContactName FROM Customers
  where CustomerID = ’’
  ; drop TABLE Customers;– ’


  这个分号使语句和SQL Server隔离,所以,这里实际上是两个语句。第一个语句不存在的名字,第二个则撤消的整个Customers表。两个—SQL Server注释符,它可以使子句不发生语法错误。


  使用这个技术的变异,一个攻击程序可以在任何SQL语句或者存储过程上运行。通过使用xp_cmdshell扩展存储过程,一个攻击程序同样可以在操作系统命令下运行,显然,这是一个严重的漏洞。


  保护自己的数据库


  现在,你知道如何防范SQL注入攻击了吗?首先,你不能在用户输入中构造where子句,你应该利用参数来使用存储进程。在最初的ASP页面下,重新写的部分将和刚才我们在表中所看到的东西相似。即使你认为在你的应用程序中没有脆弱点,你应该遵守最小特权原则。使用我们建议的其他安全技术允许你的用户仅仅访问他们能够访问的。在你没有发现你数据库脆弱点的时候,只有这样,不会使你的数据库崩溃。


  最后的建议


  这就是全部的SQL Server安全系列。也许你现在不是一个全面的专家,但是你已经了解了很多反面。下一步就是你要保护你SQL Server数据,记住你在这里所学到的知识,并利用到你的数据库中保证你的数据不被那些黑客攻击。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐

  • 使用透明数据加密技术保护静态数据

    透明数据加密(Transparent Data Encryption, TDE)是一个加密静态数据的有效工具。专家将在本文中详细介绍TDE的特性与未来。

  • SQL Server数据库安全检查清单

    SQL Server对于组织来说是个敏感信息库,管理者需要确保只有授权用户才能访问到这部分敏感信息。

  • SQL Server安全设置最佳实践

    数据库管理员的主要职责之一是:确保他们所管理的所有SQL Server实例都安全。SQL Server安全本身是一个非常广泛的主题,这篇文章仅仅是我介绍的八个最佳实践。

  • SQL Server 2012安全性:功能更新

    数据库基础架构的安全对于任何组织来说都是及其重要的,这也正是微软公司近几年在SQL Server安全功能方面投入巨大的原因。