ValidateRequest错误还是SQL Server Bug?

时间:2012-04-04 10:18:55

标签: sql-server validation xss

我正在阅读article。它说:

  

该字符以值%uff1c表示。如果将此值传递给SQL数据库中的varchar字段,则它将转换为实际的<字符。我没有在nvarchar字段上看到这项工作

好吧,我认为这是一个SQL Server错误,而不是ValidateRequest hack!如果我写%uff1c,SQL Server必须将其保存为%uff1c。或者,至少,它应该由admin选择的字符集“再次”编码%uff1c

我错了吗?

2 个答案:

答案 0 :(得分:2)

这不是一个错误,而是一个功能(但你不能使用它)。

文章的重点是:如果你想发布一个包含'&lt;'的字符串,请转换每个&lt;到<(Unicode代码点FF1C)以避免验证错误。

SQL Server收到包含<的Unicode字符串,并尝试处理它。如果表列或过程参数的数据类型启用了Unicode(NCHAR,NVARCHAR,每个字符2个字节),则不会进行任何转换,SQL Server会存储原始值。

但是,如果将值传递给VARCHAR(每个字符1个字节)列或变量,则字符<(2字节代码点)将转换为&lt;。扩展AakashM的代码来说明:

DECLARE @nv nvarchar, @v varchar
SET @nv = N'<'
SET @v = '<'
SELECT @nv, @v, CONVERT(varchar, @nv)

<   <   <

但是,由于这是21世纪,数据库应该能够支持每种标准化的语言和符号和字符,因此很少有情况可以证明使用VARCHAR数据。

答案 1 :(得分:1)

SQL Server无法在<{1}}字段中存储<。在这种情况下你想发生什么:

varchar

(请注意,<不是通常的左尖括号字符,而是带有代码点DECLARE @v varchar(1) SET @v = '<' SELECT @v 的Unicode字符)。

以上结果为FF1C(通常的左尖括号字符)。如果你想说这是一个错误,你应该说出期望的结果是什么。