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