C# 在C语言中将值直接插入db语法

C# 在C语言中将值直接插入db语法,c#,sql,database,C#,Sql,Database,插入不带参数的值完全可以理解为什么不允许这样做,例如,您希望防止sql注入。但是,我不明白为什么仍然是一个大禁忌,同时也不做以下事情: cmd.CommandText = "SELECT * FROM [Students] WHERE StudentID = " + studentID + ";"; int getID = (int)cmd.ExecuteScalar(); 选择的时候有什么害处?我不太理解下

插入不带参数的值完全可以理解为什么不允许这样做,例如,您希望防止sql注入。但是,我不明白为什么仍然是一个大禁忌,同时也不做以下事情:

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

                    int getID = (int)cmd.ExecuteScalar();
选择的时候有什么害处?我不太理解下面的参数。我不是在质疑它,我只是想知道为什么参数是必要的,以及我可以从上面的代码中得到什么结果,而不是使用下面的选项

var pStudentID = new SqlParameter("@studentID", SqlDbType.Int);
                pStudentID.Value = studentID;
                cmd.Parameters.Add(pStudentID);
假设此输入:

var studentID = "''; drop table users;--"
 cmd.CommandText = "SELECT * FROM [Students] 
                    WHERE StudentID = " + studentID + ";";
如果调用此select,将完全删除表用户

参数将有助于只批准要添加到查询中的合法输入。

假设此输入:

var studentID = "''; drop table users;--"
 cmd.CommandText = "SELECT * FROM [Students] 
                    WHERE StudentID = " + studentID + ";";
如果调用此select,将完全删除表用户


通过只批准要添加到查询中的合法输入,参数会有所帮助。

使用参数有两个原因

Sql注入—您的第一个示例很容易受到Sql注入攻击。这意味着,如果studentID是从web表单输入的,那么有人可以使用“-”注释掉select字符串,并针对数据库发出其他命令

准备-如果使用参数,可以准备sql语句,这是语法的一种预编译。在高容量情况下,这可能会稍微更有效


编辑:前几天我在reddit上看到了这段视频,它是sql注入工作原理的一个很好的例子。

使用参数更好有两个原因

Sql注入—您的第一个示例很容易受到Sql注入攻击。这意味着,如果studentID是从web表单输入的,那么有人可以使用“-”注释掉select字符串,并针对数据库发出其他命令

准备-如果使用参数,可以准备sql语句,这是语法的一种预编译。在高容量情况下,这可能会稍微更有效


编辑:前几天我在reddit上看到了这段视频,这是sql注入工作原理的一个很好的例子。

感谢澄清:从现在起我将坚持使用参数。顺便说一句,你的reddit链接不起作用,页面找不到感谢澄清:从现在起,我将坚持使用参数。顺便说一句,你的reddit链接不起作用,page not Found感谢一个很好的例子:这让我意识到没有参数的db是多么脆弱。感谢一个很好的例子:这让我意识到没有参数的db是多么脆弱。看起来你还没见过面。看起来你还没见过面。