【问题标题】:How do I convert a string into safe SQL String?如何将字符串转换为安全的 SQL 字符串?
【发布时间】:2011-04-03 10:18:47
【问题描述】:

我正在从一堆文本文件中生成一些 sql 插入语句。

这些文本文件通常是用户输入数据。我想清理这些数据,以免破坏插入语句。

例如,一些输入数据,人们使用了Don't这个词。 don't中的“'”会导致sql语句认为字符串已经结束,从而导致错误。

我可以调用任何 .NET 方法将所有这些字符转换为转义码或安全字符吗?

【问题讨论】:

  • 使用参数化查询(见链接问题)。
  • 那里的答案说将数据输入参数。我只是想通过查看文本文件来生成脚本。我的程序实际上并不会调用数据库,只是吐出脚本。
  • 不确定您的回复如何解决您使用参数化查询的建议。您生成的脚本只是使用参数化查询的脚本——您实际上不必调用数据库。
  • @Tim:“只是使用参数化查询的脚本” - 怎么样?带有参数化查询的.sql 脚本文件是什么样的?将参数值写入该文件时是否必须再次转义?

标签: .net sql sanitization


【解决方案1】:

您只需转义一个字符:ansi 0x27,也就是单引号:

safeString = unsafeString.Replace("'","''");

【讨论】:

  • 这假设 OP 在他们的 insert 声明中引用了所有值。如果他们正在生成这样的字符串INSERT INTO T1(numeric,string) values (1,'some string'),那么如果他们在第一列中有一些意外的坏数据,这将无济于事。 (例如'1,2); DROP TABLE ...'
  • @MartinSmith 然后使用 int.TryParse 作为第一个参数以确保它是一个干净的整数。
  • 插入语句中的逗号怎么样?
  • 这对我来说已经足够了。我将它包含在我的微 ORM (EntityLite) 中,用于非常大的 IN 谓词,以解决 2100 SQL Server 的最大参数数。我希望没有更多的角色需要照顾。我认为我对 SQL 注入过于偏执了。
  • @JohanAspel 在单引号中使用逗号应该不会导致问题。但是,如果它发生在您不期望字符串的地方,那么关于 TryParse 的其他评论将处理它
【解决方案2】:

不要清理你的字符串。请改用参数化查询,因为它们会处理所有清理工作。

您没有指定您使用的数据库,所以我假设它是 MS SQL Server。微软在官方 ASP.net 网站上有an article 与此有关。有关SqlCommand.Parameters 和AddWithValue 方法,另请参阅MSDN。

【讨论】:

  • +1 没有“安全”的方式将 SQL 语句连接在一起 - 使用参数化查询(总是!)是唯一可行的方法去
  • @marc_s:参数化查询只是部分解决方案。它们不能防止 SQL 注入到动态 SQL 查询中、javascript 注入到 varchar 字段中、参数注入到 html 标签中等。没有“银弹”注入解决方案。
  • 请参阅this example 了解动态 SQL 如何启用 SQL 注入,即使您使用 .NET 参数化查询
  • @MichaelStum 我想了更多,我同意您应该验证 XSS 的字符串,然后在安全的情况下存储它。也就是说,验证,但不要清理。让框架为您清理字符串。
  • OP 说他们想将INSERT 语句写入 SQL 脚本文件。从这个答案中不清楚参数化查询将如何在其中工作。一旦将参数值写入脚本文件,它们仍然需要以某种方式进行转义。
猜你喜欢
  • 2010-12-06
  • 2021-03-30
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多