在C#

时间:2016-06-26 23:43:10

标签: c# sql database

INSERT没有参数的值是完全可以理解的,为什么不允许这样做,例如想防止sql注入。但是我不明白为什么它仍然是一个很大的没有做以下事情:

 cmd.CommandText = "SELECT * FROM [Students] 
                    WHERE StudentID = " + studentID + ";";

                    int getID = (int)cmd.ExecuteScalar();

仅仅SELECT时,它的危害是什么?我不太了解以下参数的要点。我没有质疑它,我只是想知道为什么参数是必要的,以及我可以从上面的代码得到什么后果而不是使用下面的选项。

var pStudentID = new SqlParameter("@studentID", SqlDbType.Int);
                pStudentID.Value = studentID;
                cmd.Parameters.Add(pStudentID);

2 个答案:

答案 0 :(得分:3)

使用参数有两个原因。

  1. Sql Injection - 你的第一个例子很容易受到sql注入攻击。这意味着如果从web表单输入studentID,有人可以使用' - 注释掉select字符串并对数据库发出其他命令。

  2. 准备 - 如果使用参数,则可以准备sql语句,这是语法的预编译。在高容量情况下,这可能会稍微提高一些性能。

  3. 编辑:我前几天在reddit上看过这个视频,这是sql注入如何工作的一个很好的例子。sql injection

答案 1 :(得分:1)

假设此输入:

var studentID = "''; drop table users;--"
 cmd.CommandText = "SELECT * FROM [Students] 
                    WHERE StudentID = " + studentID + ";";

如果调用此select会完全删除表用户。

通过批准仅将合法输入添加到查询中,参数将有所帮助。