Fad*_*lil 4 c# sql sql-server sql-injection sqlparameter
我正在研究C#项目,我是这项技术的新手.
我想从SQL Server 2008中读取一些数据,然后编写以下代码
public User select(string username, string password)
{
string connection = ConfigurationManager.ConnectionStrings["lawyersDBConnectionString"].ConnectionString.ToString();
string sql = string.Format("select * from users where userName = '{0}' and password = '{1}'", username, password);
SqlConnection con = new SqlConnection();
con.ConnectionString = connection;
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(sql, con);
User user = new User();
DataRow dr;
try
{
da.Fill(ds);
dr = ds.Tables[0].Rows[0];
user.Id = Convert.ToInt16(dr["userID"]);
user.FirstName = (string)dr["firstName"];
user.LastName = (string)dr["lastName"];
user.Email = (string)dr["email"];
user.Username = (string)dr["userName"];
user.Password = (string)dr["password"];
user.type = (string)dr["type"];
return user;
}
catch (Exception ex)
{
return null;
}
}//end of select method
Run Code Online (Sandbox Code Playgroud)
但我读过一篇关于SQL注入的文章,我想使用SQL参数来避免这种情况,但我不知道如何.
这是对代码的简单修改.未经测试,但基本上它包括在一次性对象周围添加using语句以及使用SqlCommand及其参数集合
string connection = ConfigurationManager.ConnectionStrings ["lawyersDBConnectionString"].ConnectionString.ToString();
string sql = "select * from users where userName = @uname and password = @pwd";
DataSet ds = new DataSet();
using(SqlConnection con = new SqlConnection(connection))
using(SqlCommand cmd = new SqlCommand(sql, con))
{
con.Open();
cmd.Parameters.AddWithValue("@uname", username);
cmd.Parameters.AddWithValue("@pwd", password);
using(SqlDataAdapter da = new SqlDataAdapter(cmd))
{
User user = new User();
DataRow dr;
da.Fill(ds);
dr = ds.Tables[0].Rows[0];
user.Id = Convert.ToInt16(dr["userID"]);
user.FirstName = (string)dr["firstName"];
user.LastName = (string)dr["lastName"];
user.Email = (string)dr["email"];
user.Username = (string)dr["userName"];
user.Password = (string)dr["password"];
user.type = (string)dr["type"];
return user;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意命令文本不直接包含用户和密码的字符串,而是一个简单的参数占位符(@uname and @pwd).将参数添加到SqlCommand集合时,这些占位符称为参数名称.
看看检索到的数据的用法我强烈建议你看看像Dapper这样的简单ORM工具可以直接翻译User对象中的所有代码