SQL Server加密和SQL注入
2008-04-02 10:58:58来源:互联网 阅读 ()
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.Execute(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扩展存储过程,一个攻击程式同样能够在操作系统命令下运行,显然,这是个严重的漏洞。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: 无日志恢复数据库
下一篇: SQL Server小技巧
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash