简单SQL注入
之前写的一篇博客,里面有一个登录实例,是通过字符串拼接完成对数据库的查询的。当我在用户名框中随便输个字符,在密码框中也随便输入几个字符并在后面加上【’ or ‘1’ = ‘1】,点击登录,登录成功。因为1=1永远成立,所以where后面的字符串永远返回true。
参数化查询
private void btnLogin_Click(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection("server=.;database=Test;uid=sa;pwd=jujianfei");
SqlCommand cmd = new SqlCommand("select UserName,Password from Login where UserName=@ass and Password=@add", conn);
//第一种写法
//SqlParameter sp = new SqlParameter("@ass", txtName.Text.Trim());
//SqlParameter sp2 = new SqlParameter("@add", txtPwd.Text.Trim());
//cmd.Parameters.Add(sp);
//cmd.Parameters.Add(sp2);
//第二种写法,特殊情况下报错
//cmd.Parameters.Add(new SqlParameter("@ass", txtName.Text.Trim()));
//cmd.Parameters.Add(new SqlParameter("@add", txtPwd.Text.Trim()));
//第三种写法
//SqlParameter[] spa = new SqlParameter[]{
// new SqlParameter("@ass", txtName.Text.Trim()),
// new SqlParameter("@add", txtPwd.Text.Trim())
//};
//cmd.Parameters.AddRange(spa);
//第四种写法
//cmd.Parameters.AddWithValue("@ass", txtName.Text.Trim());
//cmd.Parameters.AddWithValue("@add", txtPwd.Text.Trim());
//第五种写法,参数可以为输出参数
//SqlParameter sp = new SqlParameter("@ass", SqlDbType.NVarChar);
//SqlParameter sp2 = new SqlParameter("@add", SqlDbType.Char);
//sp.Value = txtName.Text.Trim();
//sp2.Value = txtPwd.Text.Trim();
//cmd.Parameters.Add(sp);
//cmd.Parameters.Add(sp2);
//第六种写法
SqlParameter sp = new SqlParameter("@ass", SqlDbType.NVarChar) { Value = txtName.Text.Trim() };
SqlParameter sp2 = new SqlParameter("@add", SqlDbType.Char) { Value = txtPwd.Text.Trim() };
cmd.Parameters.Add(sp);
cmd.Parameters.Add(sp2);
conn.Open();
MessageBox.Show(cmd.ExecuteScalar().ToString());
}
参数化解决了注入的问题,这六种参数化查询方法中,小项目中一般用第二种;大项目用第五种。