SQL 安全性: 新型 SQL 截断攻击和防御方法
2009-02-10 10:23:52 来源:WEB开发网T-SQL 函数
可以看出,处理标识符和字符串的规则相对比较简单,如果您预先知道该字符串,可以手动对其进行分隔。但如果您要根据用户输入构建动态的 T-SQL 语句,该怎么办?您需要通过自动的方法来完成。两种 T-SQL 函数可帮您准备分隔字符串,它们是 QUOTENAME 和 REPLACE。
QUOTENAME 会返回一个 Unicode 字符串,并添加了分隔符,以使该输入字符串成为有效标识符。QUOTENAME 函数使用以下语法:
QUOTENAME ( 'string' [ , 'delimiter' ] )
您可以将要分隔的字符串和一个用作分隔符的单字符字符串传给 QUOTENAME。分隔符可以是方括号、单引号或双引号。
此函数主要用于准备分隔 SQL 标识符,因此它只接受 sysname 类型,在 SQL Server 中为 nvarchar(128)。您还可以使用此函数准备分隔 SQL 字符串,但由于参数长度的限制,因此它支持的字符串长度最多为 128 个字符(在这一点上,REPLACE 函数可发挥其用途)。图 1 显示了 sp_addlogin 如何使用 QUOTENAME 来准备分隔登录名和密码字符串。可以看出,由于 @loginname 和 @passwd 均为 sysname 类型,因此可使用 QUOTENAME 函数准备分隔 SQL 标识符和分隔字符串。因此,即使有人传递的是 @loginname = 'my[]dbreader' 和 @passwd = 'P@$$''w0rd',也不会有任何 SQL 注入机会,因为 QUOTENAME 对分隔字符进行了适当转义:
create login [my[]]dbreader] with password = 'P@$$''w0rd'
Figure1Delimiting Strings with QUOTENAME
- ››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表' (数...
更多精彩
赞助商链接