在SQL中插入包含单引号的字符串

时间:2014-01-15 12:20:42

标签: sql vb.net sql-injection

我已经看到了很多解决方案,我不知道应该遵循哪一个。 我认为我所拥有的东西会起作用,但经过进一步的测试,我发现这不是真的。 我正在使用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中篡改了一些测试插入语句之后,我认为替换'with'工作了。可悲的是,不是。

以下是使插入失败的字符串示例:

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

在我的字符串操作之后,这里是Insert语句(我已经删除了一些我公司可能不想分享的数据,无论如何都是无关紧要的):

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')

非常感谢任何帮助! 感谢。

1 个答案:

答案 0 :(得分:2)

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

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

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

,该怎么办?