2009-10-14 59 views
1

获取数据移入和移出SQL表与C#获取数据移入和移出SQL表与C#

我建立了一个将数据放入一个SQL表中的C#应用​​程序。

我目前在.net中使用SqlConnection类。 本文开始。 http://www.codeproject.com/KB/database/sql_in_csharp.aspx

我曾考虑过将Linq转换成SQL,但之前没有做过,也不知道如何起床和去。


今天嗯,我对面,我试图在其添加的数据,其中包括一个“'”,这打破了我的INSERT语句中的错误跑。我需要做一些研究,并开始想知道潜伏的其他问题。如果我尝试添加数据“drop table”会怎么样?

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

回答

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到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(); 
4

最好处理需要与用户输入混合的数据库查询的方式是parameterized them。现在,LINQ to SQL会为你做这件事,但简单的旧ADO.NET也可以让你做到这一点(正如我链接的文章所描述的那样)。

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

1

看起来你正在做一些动态SQL,即在C#中使用各种字符串操作,然后运行这些动态即时创建SQL语句。

这种做法非常灵活,但引入了SQL injection的风险。这是一种偶然的情况,是自我造成的,但假设构建SQL语句时使用的某些元素是通过html字段提供的,恶意用户可以制作特定的字符串以有效地“DROP TABLE”或更糟......

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

LINQ to SQL也可以用来处理这种类型的事情。