Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中安全地生成SQL查询#_C#_Sql - Fatal编程技术网

C# 在C语言中安全地生成SQL查询#

C# 在C语言中安全地生成SQL查询#,c#,sql,C#,Sql,在C#中生成SQL查询最安全的方法是什么,包括清理用户输入,这样就不会被注入?我希望使用一个不需要外部库的简单解决方案。使用和为您处理它。许多人都在努力解决这些问题,以确保这些问题得到很好的缓解 如果不是,则至少对查询进行参数化。使用Sql参数: 这里有一个C语言的例子# 第一条经验法则是确保使用参数化查询/命令。基本上,不要动态构建包含用户输入到页面中的内容的sql字符串 如果在ORM(EF、L2S、Nhib)上使用,这通常在大多数情况下都会得到处理,因为它们大多数都运行参数化查询。将查询参

在C#中生成SQL查询最安全的方法是什么,包括清理用户输入,这样就不会被注入?我希望使用一个不需要外部库的简单解决方案。

使用和为您处理它。许多人都在努力解决这些问题,以确保这些问题得到很好的缓解

如果不是,则至少对查询进行参数化。

使用Sql参数:

这里有一个C语言的例子#


第一条经验法则是确保使用参数化查询/命令。基本上,不要动态构建包含用户输入到页面中的内容的sql字符串


如果在ORM(EF、L2S、Nhib)上使用,这通常在大多数情况下都会得到处理,因为它们大多数都运行参数化查询。

将查询参数化

如果您构建了一些TSQL,而这些TSQL又构建了一些其他动态TSQL-

“参数化”意味着什么

看,不要用这样的东西:

sqlCommand.CommandText = "select * from mytable where id = "+someVariable;
使用以下命令:

sqlCommand.CommandText = "select * from mytable where id = @id";
sqlCommand.Parameters.AddWithValue("@id", someVariable);

DBML的专有名称是linq2sql或高级版本称为实体框架。这些技术由Microsoft提供,并与visual studio集成良好。不需要额外的库


非常稳定的产品。

使用参数化查询

简单的例子

var sql = "SELECT * FROM MyTable WHERE MyColumn = @Param1";
using (var connection = new SqlConnection("..."))
using (var command = new SqlCommand(sql, connection))
{
    command.Parameters.AddWithValue("@Param1", param1Value);
    return command.ExecuteReader();
}
更详细的例子

protected void btnGoodAddShipper_Click(object sender, EventArgs e)
{
   string connStr = c
      "Server=(local);Database=Northwind;Integrated Security=SSPI";

   // this is good because all input becomes a
   // parameter and not part of the SQL statement
   string cmdStr =
      "insert into Shippers (CompanyName, Phone) values (" +
      "@CompanyName, @Phone)";

   using (SqlConnection conn = new SqlConnection(connStr))
      using (SqlCommand cmd = new SqlCommand(cmdStr, conn))
         {
             // add parameters
             cmd.Parameters.AddWithValue
                ("@CompanyName", txtCompanyName.Text);
             cmd.Parameters.AddWithValue("@Phone", txtPhone.Text);

             conn.Open();
             cmd.ExecuteNonQuery();
         }
}

本质上不要这样做

SqlCommand command = new SqlCommand(MyConnection);
command.CommandText = "Select * From MyTable Where MyColumn = '" + TextBox1.Text + "'"
...

基本上,永远不要直接从用户输入构建sql命令


如果您使用ORM,例如EntityFrameworks/POCO,则所有查询都以后一种形式完成。

some 1 file“外部库“可以让它变得非常简单,比如Dapper或Petapocown这到底意味着什么?SQL参数是一个很好的开始方式。如果应用程序开始增长,需要进行大量的SQL调用,可能是时候查看LINQ或某种类型的ORM了。我赞成(并且亲自使用很多LINQ to SQL),但我不认为这是一个简单的解决方案(您必须理解DATACONTRON哲学,以避免一些错误),但是就像我在评论中所说的那样。这里有一些小助手来构建参数化查询,我将使用它们而不是直接使用SqlClient类。它是显而易见的,而不是隐藏在一堆自动生成的代码下,这样你就不必费心去学习它是如何工作的。如果你理解它的原因,它只是提高了生产率。否则,闭上你的眼睛,交叉你的手指,说魔法的话,也许你所选择的神会对你微笑。始终在三个抽象级别上运行,实现的任意一方…@LV98您可能应该研究EF Core或Linq to DB,现在,这两个级别都可以实现Linq to MySql AFAIK。最简单的解决方案是linq2sql。。是否没有要写入的SQL查询?你是说像这样。从dc中的usr。用户在dc中加入ug。usr中的UserGroups.UserID等于ug.UserID在dc中加入gr。ug.GroupID上的gr等于gr.PkID选择新的{usr,gr}永远不要在nhib的道路上走太多配置要做。@Dilberted:我经常使用nhib。开始有点难,但在一个大型应用程序的生命周期中,它确实是值得的。对于更复杂的项目,它比EF/L2S更好。
SqlCommand command = new SqlCommand(MyConnection);
command.CommandText = "Select * From MyTable Where MyColumn = '" + TextBox1.Text + "'"
...
SqlCommand command = new SqlCommand(MyConnection);
command.CommandText = "Select * From MyTable Where MyColumn = @MyValue";
command.Parameters.AddWithValue("MyValue",TextBox1.Text);
...