操作系统集成安全性()
() 接下来需要创建一个用户他只具有SELECT该视图的特权而没有其他特权该用户将自动地被指定给PUBLIC角色
CREATE LOGIN LibraryGuest
WITH PASSWORD = comein;
USE library;
CREATE USER LibraryGuest FOR LOGIN LibraryGuest;
GO;
另外也可以使用已经存在的登录名GUEST
() 授予新用户访问服务器和对vwLastYearBooks视图运行SELECT语句的特权
GRANT SELECT ON libraryvwLastYearBooks TO LibraryGuest;
REVOKE SELECT INSERT DELETE ON books FROM LibraryGuest;
GO;
() 断开RDBMS的连接并使用新的凭据用户ID和密码重新连接数据库
() 运行下面的查询
SELECT * FROM vwLastYearBooks
() 尝试对BOOKS表运行SELECT查询
示例说明
新创建的用户LibraryGuest被授予了对视图vwLastYearBooks的SELECT特权并撤消了该用户对BOOKS表选取数据的特权因此即使视图所显示的数据来自于BOOKS表但BOOKS表本身对于用户LibraryGuest是不可访问的
使用约束提供安全性
约束常常用于维护完整性包括参照完整性数据完整性(也称为实体完整性)或者域完整性
域完整性约束例如CHECK约束用于检验数据是否具有正确的格式和内容例如在LIBRARY数据库中下面代码中定义的CHK_ISBN约束用于检验输入到数据库中的ISBN号是否具有指定的长度
ALTER TABLE books
ADD CONSTRAINT chk_ISBN
CHECK (LEN(bk_isbn) = OR LEN(bk_isbn) = )
这样无论是合法还是非法的企图只要输入了长度不等于或的无效数据就会产生一个错误数据被保护以避免出现不一致在将数据提交给数据库之前先对其进行检验这是一种非常高效的安全措施
DEFAULT值是强制执行域完整性的另外一种机制当声明了DEFAULT值后如果在查询中省略了数据则DEFAULT约束可以确保使用一个默认值而不是使用空白或NULL值
DEFAULT约束是破坏了安全性还是代表了一种安全性的强制机制这仍然需要讨论一方面它避免了数据的不一致性这是好的方面但是另外一方面它通过避免疏忽或遗漏造成的错误降低了对数据录入的精确要求并且方便了恶意入侵者借机插入数据
实体完整性本质上指的是一行数据它是通过索引和诸如PRIMARY KEY约束或UNIQUE约束等来维护的它可以高效地防止用户输入重复的值例如在社会安全号码(SocialSecurity numberSSN)列上设置约束可以避免恶意用户使用相同的SSN和不同的名字来重复地获得好处
对于声明了关系的表参照完整性维护着表与表之间关系的健康参照完整性是一个都不能少方针的RDBMS版本它强制执行这样的约束如果父表中没有相对应的父记录则子表中也不允许存在子记录只要在子表中还具有一条对应的子记录就不允许删除父表中与之对应的父记录
约束本身只能为数据库的安全性提供非常有限的保护应该作为RDBMS整体安全性所提供的更为健壮的安全机制的补充
存储过程和触发器(在第章中已经介绍过)也是实现安全性的措施之一存储过程有助于限制对数据库对象的访问并实现输入检验触发器则是存储过程的一个变种当在表上执行INSERTUPDATE或DELETE操作时它将自动执行用于检验数据或者累积审计信息
SQL注入
对于使用了动态构建SQL语句(关于动态SQL的更多信息请参考第章)的数据库应用程序SQL注入是利用该弱点进行攻击的一种技术SQL注入技术背后的思想是修改底层的SQL语句要么在WHERE子句中应用更宽泛的选取条件要么在SQL语句的末尾追加额外的SQL命令例如如果在客户端应用程序中使用下面的SQL语句检查一个特定的user_ID(这样的语句显然是蹩脚的)期望的结果是如果没有返回任何行则表示身份验证失败
SELECT * FROM users WHERE user_id = + <user_ID> +
现在假设恶意攻击者在user_ID域中输入了somebody OR a=a那么该语句将翻译为下面的语句
SELECT FROM Users WHERE user_ID = somebody OR a = a
由于没有somebody这个user_ID因此WHERE子句的第一部分将会失败但是对第二个部分a = a求值的结果为TRUE因此将返回一行数据从而可能会认为该用户已经通过了身份验证
在前面的例子中攻击者还可以采用输入<user_ID> ;<另外一条SQL语句>这样的形式迫使服务器执行一个意料之外的语句例如
SELECT FROM Users WHERE user_ID = somebody ; DELETE FROM books;
如果执行了上面的语句将删除BOOKS表中的所有记录(这要求对数据库的结构具有一定的知识或者聪明地猜测出攻击方的意图)
返回目录SQL实战新手入门
编辑推荐
Oracle索引技术
高性能MySQL
数据仓库与数据挖掘培训视频教程