控制 SQL 服务器最适合 unicode 转换

Controlling SQL Servers best-fit unicode transformation

最近的白帽扫描让我意识到 SQL 服务器最适合的 unicode 转换。这意味着当包含 unicode 字符的字符串转换为非 unicode 字符串时,SQL 服务器将对字符进行最佳替换,以免用问号破坏您的数据。例如:

SELECT 'ŤĘŞŤ'

输出"TEST"

每个字符都替换为 "similar" ASCII 等效字符。这也可以在单个字符上看到,其中 unicode 字符 65308 (<) 转换为 ASCII 字符 60 (<)。

SELECT ascii(NCHAR(65308))

输出“60”

主要问题是,这个记录到底在哪里?我用 Google 搜索了各种短语并阅读了 Microsoft 文档,但我所能找到的只是人们希望进行手动转换,而没有任何文件 SQL 服务器明显的自动最适合 unicode 转换。此外,这可以关闭或配置吗?

虽然这种行为对于不将字符串存储为 unicode 的应用程序很方便,并且在大多数情况下可能会被完全注意到,但渗透测试将其报告为 "high" 漏洞,因为 unicode 转换可用于规避验证例程并导致XSS等漏洞

(以下是我在DBA.StackExchange上对相关问题的回答节选:Automatic Translation when Converting Unicode to non-Unicode / NVARCHAR to VARCHAR

这些 "best fit" 映射 记录在案,只是不在最容易找到的地方。如果您转到以下 URL,您将看到一个包含多个文件的列表,每个文件都以将 Unicode 字符映射到的代码页命名:

ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/

大多数文件最后更新(或至少放在那里)是在 2006 年 10 月 4 日,其中一个文件是在 2012 年 3 月 14 日更新的。这些文件的第一部分将 ASCII 代码映射到等效的 Unicode 代码点。但是每个文件的第二部分将 Unicode 字符映射到它们的 ASCII "equivalents".

我写了一个测试脚本,它使用代码页 1252 映射来检查 SQL 服务器是否真的在使用这些映射。这可以通过回答这两个问题来确定:

  1. 对于所有映射的代码点,SQL服务器是否将它们转换为指定的映射?
  2. 对于所有未映射的代码点,SQL服务器是否将它们中的任何一个转换为非“?”字符?

测试脚本太长放在这里,所以我把它贴在 Pastebin 上:

Unicode to Code Page mappings in SQL Server

运行 脚本将显示上面第一个问题的答案是 "Yes"(这意味着所有提供的映射都得到遵守)。它还将显示第二个问题的答案是 "No"(意思是,未映射代码点的 none 转换为 "unknown" 字符以外的任何字符)。因此,该映射文件非常准确:-)。

Furthermore, can this be turned off or configured?

我不这么认为,但这并不意味着不可能做到其中之一或两者。但是,应该注意这些映射是 "Microsoft" 映射,因此可以与 Windows 和 SQL 服务器一起使用;它们不是 SQL 服务器特定的。因此,即使可以找到这些东西的配置位置,更改也可能不是一个好主意,因为它会影响 OS.

上的所有内容 运行