【问题标题】:Inserting string which contain single quotes ' in SQL在 SQL 中插入包含单引号 ' 的字符串
【发布时间】:2014-01-15 12:20:42
【问题描述】:

我已经看到了很多解决方案,我不知道该遵循哪一个。 我认为我所拥有的会起作用,但经过进一步测试,我发现这不是真的。 我正在使用 VB 从给定的文件目录中提取 MS Excel 工作表,提取数据,然后插入到 SQL 数据表中。

这是我需要帮助的部分:

 If saRet(linex, 11) <> "" Then
 IntDesc = (saRet(linex, 11).ToString.Replace("'", "''"))
 Echo("Internal description: " & IntDesc)
        Else
           Echo("No internal description given")
           IntDesc = ""
 End If

在 SQL Server Studio 中篡改了一些测试插入语句后,我认为将 ' 替换为 '' 有效。很遗憾,没有。

下面是一个导致插入失败的字符串示例:

Set-up and Config of New Button on BP and UDF's for Despatch Process

在我的字符串操作之后,这里是插入语句(我已经删除了一些我的公司可能不想分享的数据,反正它是微不足道的):

NSERT INTO <tablename> VALUES ('2013-12-10', '12', '2013', 'AAAA', 'AAAA', '10668', 'JBT', 'Project - Config & System Build', 'CSB', '2', 'Y', 'N', '0', 'Set-up and Config of New Button on BP and UDF's for Despatch Process', 'Set-up and Config of New Button on BP and UDF''s for Despatch Process', '0', 'NULL')

非常感谢您的帮助! 谢谢。

【问题讨论】:

  • SQL 标记不适用于 SQL Server。这个问题与 VB6、Excel 或 VB.Net 无关。标记很差。
  • @Bob77 考虑到提供的例子是VB代码,有些人用VB写类似的EXCEL提取代码可能有同样的问题,我觉得标签是合适的。恭喜您在评论上浪费了我们俩的时间。
  • 我已经为您修复了标签,以使其适合您的要求以及您的问题中实际涉及的技术。请不要在标签后面添加“excel”或“vb6”。

标签: sql vb.net sql-injection


【解决方案1】:

最好的方法总是使用参数。那些为你处理一切,你不需要做任何逃避。

如果不能使用参数,则必须自己进行编码,这非常棘手。一种方法是使用可以安全编码的格式 - 例如,您可以使用二进制编码(例如cast(0xAABBCCDD as varchar(max))),而不是作为字符串文字插入。这是非常安全的,因为您可以确定没有无效字符会破坏它。当然,它也有它的问题。

就您的示例而言,将 ' 替换为 '' 可以正常工作(当然,您必须注意其他无效字符,例如尾行)。您的问题是您没有对 all 字符串进行编码。在您的示例中,最后一个字符串具有正确的编码,之前的字符串没有。这也很好地说明了确保正确编码的痛苦——你错过的一切都意味着一个错误,甚至是一种利用代码并造成伤害的方法。例如,如果描述是', ''0'', ''NULL''); delete from users --,会怎样?

【讨论】:

  • 谢谢伙计,我会四处看看这方面的一些文档。您提到了二进制编码,然后提供了一个看起来像 Hex 的示例?
  • @Cal 是的,我用十六进制表示法编写了它,但它是二进制文字。不要纠结这个,只是命名而已。只需逐个字符(如果没有更简单的方法)将其从 char 转换为 byte,然后用 2 位十六进制写入(例如 C# 中的 byte.ToString("X2"))。
猜你喜欢
  • 2013-05-29
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
相关资源
最近更新 更多