SQL 安全性: 新型 SQL 截断攻击和防御方法
2009-02-10 10:23:52 来源:WEB开发网DROP LOGIN my_dbreader
如果您试着删除一个使用 DROP 作为其名称(也是关键字)的登录名会怎样?如果您使用以下 SQL 语句,SQL Server 会返回一个语法错误。
DROP LOGIN DROP
如果您要删除像 my][dbreader 这样的登录名又会怎样?这也会引发语法错误。
在上面两个例子中,由于登录名为关键字或包含特殊字符,因此您需要提供一些开始和结束标记,以便 SQL Server 可以识别 SQL 语句中的对象名。
您可以使用双引号或方括号作为 SQL 标识符的分隔符,而在 QUOTED_IDENTIFIER 设置(一种基于连接的设置)启用时您可以只使用双引号。为简便起见,最好始终使用方括号。
要成功删除 DROP 登录名,您可以使用方括号来构造您的 SQL 语句:
DROP LOGIN [DROP]
但以下语句会怎样?DROP LOGIN [my][dbreader]
在这种特殊情况下,由于登录名 my][dbreader 中包含分隔字符,因此 SQL 会认为 [my] 是登录名,因为它被包含在方括号内。由于 [dbreader] 跟在登录名后面,因此该语句并不构成正确的 SQL 语句,会导致语法错误。您可以通过用另一个右方括号对上面的右方括号进行转义来解决这一问题。因此,如果您执行以下语句,SQL Server 将成功删除 my][dbreader 登录名:DROP LOGIN [my]][dbreader]
转义机制只是使右方括号的出现次数增加了一倍。您无需改动其他字符,包括左方括号。
准备分隔字符串与准备分隔 SQL 标识符类似,主要区别就是需要使用的分隔字符。在介绍与构建分隔字符串相似的规则之前,先来看以下几个例子。
假设您希望创建 dbreader 登录名,密码是 P@$$w0rd。您会使用以下 SQL 语句:
CREATE LOGIN [dbreader] WITH PASSWORD = 'P@$$w0rd'
在该语句中,P@$$w0rd 是由单引号分隔的字符串数据,因此 SQL 知道该字符串从哪里开始,到哪里结束。但如果字符串数据中包含单引号会怎样?SQL Server 会引发一个错误,因为该语句为无效语句:CREATE LOGIN [dbreader] WITH PASSWORD = 'P@$$'w0rd'
您需要对字符串中出现的所有单引号进行转义,构造有效的 SQL 语句:CREATE LOGIN [dbreader] WITH PASSWORD = 'P@$$''w0rd'
当您执行该语句时,SQL Server 将创建 dbreader 登录名,密码为 P@$$'w0rd。
您还可以使用双引号作为分隔符,但正如我前面提到的,这种方法是否成功完全取决于 QUOTED_IDENTIFIER 设置是否已开启。因此,最好始终使用单引号作为字符串的分隔符。
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接