【问题标题】:Entering data with a ' (apostrophy) into SQL Server CE table在 SQL Server CE 表中输入带有 '(撇号)的数据
【发布时间】:2013-07-02 20:01:39
【问题描述】:

我如何才能将诸如"John's shoe" 之类的数据输入到 SQL Server CE 表(3.5 版)中,因为插入语句等不接受在诸如以下语句的语句中使用 ' 撇号:

INSERT INTO ShowsDB(Item) VALUES('+ "John's shoes" + "')

【问题讨论】:

  • 这允许 SQL 注入攻击。使用参数化查询,您既可以减轻攻击,又可以插入单引号。

标签: c# sql-server-ce


【解决方案1】:

基本上,您必须避免将数据直接放入 SQL 中。改用参数化 SQL:

// I'm assuming you're opening the connection already
string sql = "INSERT INTO ShowDB(ITEM) VALUES (@Name)";
using (var command = new SqlCommand(sql, connection))
{
    command.Parameters.Add("@Name", SqlDbType.NVarChar).Value = "John's shoes";
    command.ExecuteNonQuery();
}

使用参数化 SQL 有三个好处:

  • 避免SQL injection attacks
  • 避免不必要和危险的字符串转换(尤其是日期/时间类型)
  • 将“代码”(SQL) 与数据(参数)分开,使其更易于理解

【讨论】:

  • 好的,这似乎可行,但我也尝试检查数据是否已经存在并且不起作用: var rows = dataTable.Select("Item = " + "John's shoes"); if (rows.Length == 0)
  • @user1842134:你没有提到使用数据表。正是因为这种事情,我不是DataTable.Select 的忠实粉丝。您最好只遍历行并检查每一行。
【解决方案2】:

标准的 SQL 转义是引号应该加倍,所以你的查询变成了

INSERT INTO ShowsDB(Item) VALUES('+ "John''s shoes" + "')

这对于诸如针对数据库副本运行 SELECT 语句以诊断问题之类的事情非常好,但绝不应该在实际生产系统中使用。参数化查询是您的朋友。

【讨论】:

  • 以任何方式使用它都是一个坏习惯。参数化查询应始终 100% 使用,即使您知道查询是安全的或处于安全环境中也是如此。只需一个人将一些代码复制/粘贴到您的项目中,您现在就容易受到攻击。如果你养成了一直参数化的习惯(这实际上比与所有引号和字符转义作斗争要容易),你就永远不会犯错误。
猜你喜欢
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
相关资源
最近更新 更多