SQL注入
我们在编写sql语句的时候,常会这样来验证账号密码
string sql=$"select *from UserLogin where LoginId={User.LoginId} and LoginPwd='{User.LoginPwd}'";
sql注入可以利用传递特定参数来完成登录
例如,此时账号User.Login=1001,密码User.LoginPwd=zy123
string sql="select *from UserLogin where LoginId=1001 and LoginPwd='zy123'";
当我们不知道密码的时候可以这样(传递的参数为 'or 1=1 --)
string sql="select *from UserLogin where LoginId=1001 and LoginPwd=''or 1=1 --'";
先传递一个单引号与前面形成一对,再传入结果为true,接着注释掉原有的右边的单引号,这样就在不清楚密码的情况下实现了登录
怎么防止呢,可以用SQLParameter来对变量参数化
private string connString = ConfigurationManager.ConnectionStrings["TestConnectString"].ToString();
public UserLogin UserLogin(UserLogin userlogin)
{
//参数化,特殊符号转义成普通字符串,防止sql注入
SqlParameter[] paras = new SqlParameter[]
{
new SqlParameter("@userloginId",userlogin.LoginId),
new SqlParameter("@userloginPwd",userlogin.LoginPwd)
};
string sql = "select LoginId,LoginPwd,LoginName from UserLogin where LoginPwd=@userloginPwd and LoginId=@userloginId";
SqlConnection conn = new SqlConnection(connString);
conn.Open();
//创建执行脚本的对象
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddRange(paras);
//提交查询
SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
//判断是否正确,正确封装Name,否则置空
if (sdr.Read())
{
userlogin.LoginName = sdr["LoginName"].ToString();
}
else
{
userlogin = null;//登录失败
}
sdr.Close();
return userlogin;
}
SqlParameter还可以作为参数传入其他方法里,如SqlHelper
/// <summary>
/// 执行一个结果集的查询
/// </summary>
/// <param name="sql">sql语句</param>
/// <param name="paras">SqlParameter参数</param>
/// <returns>返回一个数据流</returns>
public static SqlDataReader ExeReader(string sql, params SqlParameter[] paras)//params 设置为可选参数(即可传可不传值)
{
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(sql, conn);
if (paras.Length != 0)
{
cmd.Parameters.AddRange(paras);
}
try
{
conn.Open();
return cmd.ExecuteReader(CommandBehavior.CloseConnection);//定义了
}
catch (Exception ex)
{
throw new Exception("static SqlDataReader ExeReader(string sql)方法出错" + ex.Message);
}
}
public UserLogin Login(UserLogin userlogin)
{
SqlParameter[] para = new SqlParameter[]
{
new SqlParameter("@userloginId",userlogin.LoginId),
new SqlParameter("@userloginPwd",userlogin.LoginPwd)
};
//封装sql语句
string sql = "select LoginId,LoginPwd,LoginName from UserLogin where LoginPwd=@userloginPwd And LoginId=@userloginId";
//提交查询
SqlDataReader sdr = SQLHelper.ExeReader(sql,para);
//判断是否正确,正确封装Name,否则置空
if (sdr.Read())
{
userlogin.LoginName = sdr["LoginName"].ToString();
}
else
{
userlogin = null;//登录失败
}
sdr.Close();
return userlogin;
}
SqlParameter中new出来的参数必须有值(待验证)