Sql server 控制SQL Server最适合unicode转换

Sql server 控制SQL Server最适合unicode转换,sql-server,unicode,sql-server-2012,penetration-testing,Sql Server,Unicode,Sql Server 2012,Penetration Testing,最近的一次whitehat扫描让我了解了SQL Server最适合的unicode转换。这意味着,当包含unicode字符的字符串转换为非unicode字符串时,SQL Server将尽可能对字符进行最合适的替换,以避免用问号破坏数据。例如: SELECT 'ŤĘŞŤ' 输出“测试” 每个字符都替换为“相似”的ASCII等效字符。这也可以在单个字符上看到,其中unicode字符65308(<)被转换为ASCII字符60()(以下是我对DBA.StackExchange上相关问题回答的摘录:)

最近的一次whitehat扫描让我了解了SQL Server最适合的unicode转换。这意味着,当包含unicode字符的字符串转换为非unicode字符串时,SQL Server将尽可能对字符进行最合适的替换,以避免用问号破坏数据。例如:

SELECT 'ŤĘŞŤ'
输出“测试”

每个字符都替换为“相似”的ASCII等效字符。这也可以在单个字符上看到,其中unicode字符65308(<)被转换为ASCII字符60()(以下是我对DBA.StackExchange上相关问题回答的摘录:)

这些“最佳匹配”映射是有文档记录的,只是不在最容易找到的地方。如果您转到以下URL,您将看到多个文件的列表,每个文件都是根据其将Unicode字符映射到的代码页命名的:

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

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

  • 对于所有映射的代码点,SQL Server是否将它们转换为指定的映射
  • 对于所有未映射的代码点,SQL Server是否将其中任何一个转换为非“”字符
  • 测试脚本太长,无法放置在此处,因此我将其发布在Pastebin上:

    运行脚本将显示上面第一个问题的答案是“是”(意味着所有提供的映射都得到了遵守)。它还将显示第二个问题的答案是“否”(意味着,除了“未知”的字符外,没有任何未映射的代码点转换为其他字符)。因此,该映射文件非常精确:-)

    此外,这可以关闭或配置吗


    我不这么认为,但这并不意味着不可能做到一个或两个。但是,应该注意的是,这些映射是“Microsoft”映射,因此可以与Windows和SQL Server一起使用;它们不是特定于SQL Server的。因此,即使可以找到这些东西的配置位置,更改也可能是个坏主意,因为它会影响操作系统上运行的所有内容。

    一位朋友指出了这一点,我在最初的谷歌搜索中没有发现这一点。它有助于“为什么”,但对行为的文档记录或修改则没有帮助。这就开始深入研究排序的“如何”和“为什么”。这会让你毛骨悚然。另外,只要更改数据库的排序规则,就可能更改SELECT ascii(NCHAR(65308))返回的内容。链接中的OWASP preso对于“为什么”来说是一个非常好的选项。它讨论了SQL走私SQLi与同字形转换等,并演示了如何偷偷摸摸一些人可以对你鲍比表。或者更糟。看起来可能比我想象的要深一点。这一直延伸到Unicode规范()和支持该规范的不同供应商方法。现在我知道的比我想知道的更多。:-)Shawn,CFML的canonicalize()函数(来自ESAPI库)不影响Unicode字符,因为它们已经是其规范形式,这意味着它们不会以任何方式转义。该数据库使用什么编码?您一定要确保如果插入
    “Ť඲Ť”
    ,数据库实际上存储
    “Ť඲Ť”
    (不是
    ?“
    ,或者类似于
    “TEST”
    )的内容。
    SELECT ascii(NCHAR(65308))