【问题标题】:c# textbox characters that can cause my SQL query to stop workingc# 可能导致我的 SQL 查询停止工作的文本框字符
【发布时间】:2012-04-25 14:21:10
【问题描述】:

我的 WinForm 中有一个文本框。

用户键入文本(他们的键盘允许的任何内容)。当他们点击保存时,有时会出现带有

的错误消息

查询表达式中的语法错误(缺少运算符)

我知道某些字符,例如 ' 正在破坏我的 SQL 查询

我有几个问题

  1. 我能做些什么来让我的查询不会中断并允许用户输入他们想要的任何内容?
  2. 如果没有办法执行 #1,我如何扫描文本并删除所有会破坏我的查询的字符?

【问题讨论】:

标签: c# sql winforms


【解决方案1】:

尝试使用参数将文本框值传递给查询。这也将防止 SQL 注入攻击。

应该是这样的:

SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT * from TableName WHERE FieldA = @FieldValue";
cmd.CommandType = CommandType.Text;

//Define SqlParameter object and assign value to the parameter
cmd.Parameters.Add("@FieldValue", SqlDbType.VarChar, 50);
cmd.Parameters["@FieldValue"].Value = TextBox.Value;

【讨论】:

  • 使用 SQL 参数,我可以有 ' " 和其他键盘字符?
  • 如果我这样做,我需要对我的代码进行重大更改。那么您是否有一个使用 OleDbCommand 的示例(从连接字符串到插入查询)
  • @CocoaDev,它的工作原理与 SqlCommand 相同。您的更改应该是微不足道的。
  • 我需要在插入参数之后做些什么吗?
  • 是这个 cmd.Parameters["@FieldValue"].Value = TextBox.Value;从 SQL 查询中检索数据是否正确?
【解决方案2】:

我知道像 ' 这样的某些字符正在破坏我的 SQL 查询

如果是这种情况,听起来您使用字符串连接来添加参数。

改用 SQL 参数,这应该可以解决您的问题。

另外值得注意的是,使用字符串连接构建 SQL 查询很容易出现SQL Injection

【讨论】:

    【解决方案3】:
    1. 更好的方法是使用参数化查询。见Adding Parameters to Commands。这不仅解决了你的不良性格问题,还消除了SQL-injection(维基百科)的危险。

    2. 如果您仍然喜欢使用字符串连接,那么用两个单引号替换单引号应该足够安全。

    string sql = "SELECT * FROM tbl WHERE Name = '" + name.Replace("'","''") + "'";
    

    【讨论】:

    • 选项 2 仍然容易发生 SQL 注入,并且不安全。
    • @Curt:你能告诉我一个文本条目的例子,它会为选项 2 注入恶意代码吗?我认为这是不可能的。
    猜你喜欢
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 2016-02-29
    • 2014-12-14
    • 2011-12-26
    • 2019-11-07
    相关资源
    最近更新 更多