【问题标题】:Single quote handling in a SQL stringSQL 字符串中的单引号处理
【发布时间】:2011-01-10 07:53:12
【问题描述】:

我有一个应用程序,其中文本字段中的值被发送到数据库。

例如,我有一个包含一个字段(文本框)的表单。当我按下确定按钮时,文本字段的内容将作为记录插入到表中。我只是将文本框的文本修剪并提取到变量中并将其传递给我的 SQL 字符串。

问题在于,每当像“It's”或“Friend's”这样的单引号被识别为字符串的结尾。在 Delphi 中,我看到了类似 QuotedString 的东西来避免这种情况。你有什么想法吗?

【问题讨论】:

  • 你在使用参数化查询吗?
  • 虽然您可以安全地引用字符串,但您应该按照 Mitch 的建议使用参数化查询。
  • @Gabe:我猜他会满足于他的问题的答案,而不是解决真正的问题。 SQL 注入我们来了!!!!
  • @Gabe:是的。它只需要一两个就可以滑过,它是“你好,小鲍比桌!”
  • Mitch:如果你说的是在 LIKE 模式中转义 %,这与 SQL 注入无关,即使是参数化查询也必须手动完成。

标签: c# sql .net escaping


【解决方案1】:

永远不要构建这样的 SQL 语句,这是非常不安全的(read this)。使用参数,即:

var command = new SqlCommand("select * from person where firstname = @firstname");
SqlParameter param  = new SqlParameter();
param.ParameterName = "@firstname";
param.Value         = "testing12'3";
command.Parameters.Add(param);

【讨论】:

  • 我正在做的是一个非常简单的应用程序。这就是我没有使用它的原因。无论如何,非常感谢。
  • @JCTLK:以正确的方式去做。如果发现有用,小应用程序会变成更大的应用程序。此外,请让您的代码库充满应该复制的模式,而不是不受欢迎的模式。
  • @JCTLK:这并不复杂,从长远来看会有巨大的好处。
  • 它甚至可以压缩到 1 行来添加一个参数:command.Parameters.AddWithValue("@FirstName", "testing12'3");
  • @Mitch Wheat - 是的。我还应该注意到,它会尽可能地从 .NET 中计算出 SqlDbType(例如,字符串将始终作为 NVARCHAR 传入)。我的首选是始终明确使用 db 类型 + 大小。
【解决方案2】:

使用.Replace("'","''''")

例如

string name = txtName.Text.Replace("'","''''");

现在name 可以在存储过程等中作为参数传递。

【讨论】:

    【解决方案3】:

    希望对你有帮助……

    public static string DoQuotes(string sql)
        {
            if (sql == null)
                return "";
            else
                return sql.Replace("'", "''");
        }
    

    【讨论】:

    • 在此处删除 cmets - 它们已经失控并吸引了 很多 标志 - 一些标志足以触发自动删除。总结:很多 人认为,当参数同样简单且更健壮时,此处基于引用的方法是一个非常糟糕的主意。其他人(好的,OP)不同意。
    • 在参数化(无论出于何种模糊原因)确实不可能的情况下,了解如何处理引号的更强大的处理方法会很有帮助。
    • 此方法适用于不需要 SQL 注入的小型个人应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    相关资源
    最近更新 更多