【发布时间】:2013-07-07 04:06:20
【问题描述】:
我是 Asp.net 的新手,我刚刚开始使用类。我最近创建了一个类,它将为我处理大部分 SQL 查询,这样我就不必在所有文件上重复创建新连接。
我创建的一种方法将 SQL 查询作为参数并返回结果。我知道我应该使用参数化查询来避免 SQL 注入。我的问题是,当我将查询作为字符串参数传递时,我该怎么做?
例如,这是我将要调用的方法:
public static DataTable SqlDataTable(string sql)
{
using (SqlConnection conn = new SqlConnection(DatabaseConnectionString))
{
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Connection.Open();
DataTable TempTable = new DataTable();
TempTable.Load(cmd.ExecuteReader());
return TempTable;
}
}
所以从另一个文件我想像这样使用这个方法:
DataTable dt = new DataTable();
dt = SqlComm.SqlDataTable("SELECT * FROM Users WHERE UserName='" + login.Text + "' and Password='" + password.Text + "'");
if (dt.Rows.Count > 0)
{
// do something if the query returns rows
}
这可行,但仍然容易受到注射,对吗?有没有办法可以将变量作为参数传递给字符串?我知道如果我为查询创建一个新的 SQLCommand 对象并使用 Parameters.AddWithValue,我可以做到这一点,但我希望我的所有 SQL 命令都在单独的类中。
【问题讨论】:
-
你为什么使用内联查询?您可以使用存储过程来避免 sql 注入。存储过程是预先执行的 sql 查询。所以它会比内联查询运行得更快。只是建议使用存储过程。
-
去过一次,我强烈你钻研学习和ORM(我选择了实体框架)。我花了很多时间编写这样的代码才发现这是多么不必要!在为时已晚之前,学习实体框架。如果你没有太复杂的查询,主要是简单的 CRUD 操作,学习起来并不难..
-
Hiren,存储过程不是预先执行的查询。你是说执行计划吗?
-
@HirenDhaduk 存储过程已经过时了!如果可以避免,请不要使用它们。
-
@DarinDimitrov 我们并不是建议使用 ORM 来解决注入攻击的问题。我们建议的是一种不同的编程方法,他不需要处理这些事情。