2016-01-22 50 views
0

我有这样的C#代码检索与ADO.NET从SQL Server数据库中的数据:语法注入SQL服务器的SQL语句转换为C#代码

//Define ADO.NET objects 
    string selectSQL; 
    selectSQL = "SELECT * FROM slip "; 
    selectSQL += "WHERE slip_id='" + txtSlipID_srch + "'"; 

我在书上读到的语法,并已获得在大学的语法,但我没有给它一个解释,除了“这是语法”。我谈论的语法如下:

'" + txtSlipID_srch + "' 

即字段名txtSlipID_srch由一个单引号,双引号和一个加号的约束。

有人可以帮我翻译一下吗?我会很感激。

+6

你应该归还这本书并要求你的大学退款。这是从C#执行SQL代码的一种可怕方式,因为它会将您的应用程序打开到SQL注入,这是一个巨大的安全风险。 –

+1

大学的名字是什么,我想把它列入我的黑名单。 :) –

+3

不要听书 - **使用参数化查询**! –

回答

1

谁教你了这个语法真的教会你一个错误的东西。
如您所猜,此语法将字符串txtSlipID_srch的内容连接到您的SQL文本,从而形成固定文本和可变部分的完整指令。整个事情然后传递给数据库引擎执行。

但允许用户输入文本框的东西,然后使用该输入来建立SQL查询确实是一个错误的事情

,用户可以输入任何东西,任何东西也可能是一个很好伪造的字符串改变您的意图并破坏您的数据库或获取您不希望他看到的信息(密码或信用卡号码)。它被称为Sql Injection,并且有数以千计的关于如何实现这种黑客技术的文章。我不想重复任何事情,你可以简单地看看这个well known comics+question+answers并阅读下面的解释

除此之外。存在正确解析字符串的问题。在您的字符串变量中出现单引号可能会导致您的查询无效,因为单引号用于分隔传递给数据库的字符串值。使用转换过程的小数和日期应该在字符串中进行转换。同样在这里,您应该为数据库创建正确的文本(它是否像逗号或小数点?,日期格式为'dd/MM/yyyy'或'MM/dd/yyyy'或什么?等等)

唯一有效的方法是使用你写你的命令文本以这种方式参数化查询

selectSQL = "SELECT * FROM slip WHERE [email protected]"; 

现在没有更多的两个字符串和字符串值的两边没有单引号'的串联转义“他们,但只是一个名为@id的参数占位符。

ADO.NET库将提供相应的类来处理该参数,并将该值传递给数据库引擎,以便在该数据库引擎中进行正确处理。

SqlCommand cmd = new SqlCommand(selectSQL, connection); 
cmd.Parameters.Add("@id", SqlDbType.NVarChar).Value = txtSlipID_srch; 
SqlDataReader reader = cmd.ExecuteReader(); 
...... 
+0

非常感谢大家....我现在正在通过你的答案。干杯。 – Trevor

0

因为你想要得到的SQL看起来像这样:

SELECT * FROM slip WHERE slip_id='somevalue' 

它需要在产生的SQL语句中的单引号。

双引号是定义C#代码中的字符串。 单引号是定义SQL语句中的字符串。

0

使用单引号的原因是因为SQL期望字符串值被括在单引号中。 (如在其他答案解释)

不要使用字符串连接创建SQL查询。您的输入可能来自用户,任何恶意用户都可以利用它。阅读关于SQL Injection

你可以做,以更好的方式:

使用参数

using (SqlConnection conn = new SqlConnection("connection string")) 
using (SqlCommand cmd = new SqlCommand("SELECT * FROM slip WHERE [email protected]", conn)) 
{ 
    cmd.Parameters.AddWithValue("@slipID", txtSlipID_srch);//Even use .Add and specify data type 
    //open connection 
    //execute command 
} 

using statement命令执行后处置掉的资源。

(另外,如果你的书没有提及使用parameters后,那么你没有关闭这本书,从别的地方读好)在这种情况下

0

的+是连接运算符。在示例中,txtSlipID_srch是一个包含值的变量,并将该值连接到另一个字符串(即,您的SQL语句)。就像我想说你好马尔滕你今天好吗?我会写string greeting = "Hello " + yourNameVariable + " how are you today?";。所以,当Maarten存储在yourNameVariable中时,它会获取这些信息并将它与其他两个字符串连接起来。请注意,我还必须包含空格以确保字符串正确显示?但正如每个人都指出的那样,在构建sql语句(它们本身就是字符串)时,绝不应该使用它,因为这会让用户能够传入一个字符串,以便让它们对数据库执行更多的破坏性语句。