代码之家  ›  专栏  ›  技术社区  ›  Maestro1024

使用C将数据进出SQL表#

  •  1
  • Maestro1024  · 技术社区  · 15 年前

    使用C将数据进出SQL表#

    我构建了一个将数据放入SQL表的C应用程序。

    我目前正在.NET中使用sqlconnection类。 从这篇文章开始。 http://www.codeproject.com/KB/database/sql_in_csharp.aspx

    我曾经考虑过要查看linq to sql,但之前没有做过,也不知道该如何站起来继续。


    今天我遇到了一个bug,我试图添加包含“'”的数据,它破坏了我的insert语句。我做了一些研究,开始想知道还有什么其他的问题潜伏着。如果我尝试添加数据“Drop Table”,会怎么样?

    我的问题是,有没有更好的数据插入模型?我看林肯吗?还是在输入数据之前检查所有数据?

    3 回复  |  直到 15 年前
        1
  •  8
  •   Community CDub    8 年前

    你发现 SQL Injection Attacks . 出于您指定的原因,将用户提供的数据追加到SQL查询是不好的策略。系统中的任何用户都可以尝试通过插入一些SQL来窃取或破坏数据。

    处理它的方法在链接中描述,但基本上您指定了参数,并让提供的类正确地处理转义数据,这样,如果有人通过了“Drop Table”,它将简单地作为数据输入。

    以下是一个很好的例子 CodeBetter.com

    SqlCommand command = connection.CreateCommand();
    command.CommandText = "SELECT * FROM Customers WHERE CustomerID = @CustomerID";
    
    command.Parameters.Add(
           new SqlParameter("@CustomerID", SqlDbType.NChar, 5)).Value = customerID;
    

    或者,可以随意使用Linq to SQL。它将为您处理这个问题,并且从开发人员的角度来看更容易处理。您可以将数据库拖放到代码中,它将完全映射每个表。然后,您可以在代码中编写Linq的SQL语句版本,在代码中您将获得代码完成和编译时错误检查。 This SO question will get you started .

    下面是一些简单的LINQ代码,可以让您从数据库中读取客户,将其姓名写入屏幕,然后更新其个性化问候语(所有这些都可以避免SQL注入):

    Customer myCustomer = (
        from cust in myDatabase.Customers
        where cust.CustomerID == userPassedCustomerID
        select cust).Single();
    
    Console.WriteLine(myCustomer.FullName);
    
    myCustomer.PersonalizedGreeting = userPassedGreeting;
    myDatabase.SubmitChanges();
    
        2
  •  4
  •   Andrew Hare    15 年前

    处理需要与用户输入混合的数据库查询的最佳方法是 parameterized them . 现在,LinqtoSQL将为您实现这一点,但普通的老ADO.NET也允许您实现这一点(正如我链接的文章所描述的那样)。

    无论您是在调用存储过程还是在应用程序中创建动态查询以发送到RDBMS,这都是有效的。

        3
  •  1
  •   mjv    15 年前

    似乎您正在执行一些动态SQL,即使用C中的各种字符串操作动态创建SQL语句,然后运行这些语句。

    这种做法非常通用,但会带来 SQL injection . 这是一个偶然的情况,是自己造成的,但是假设构建SQL语句所使用的一些元素是通过HTML字段提供的,恶意用户可以设计一个特定的字符串来有效地“删除表”或更糟的情况…

    有很多方法可以解决这种情况,最常见的方法是使用参数化的SQL模板。使用这种技术,SQL语句的变量部分以单独的参数(在SQL级别称为参数)提供给SQL。ADO命令对象是用于调用参数化查询的工具。

    linq-to-sql也可以用来处理这类事情。