使用SQLParameter解决SQL注入问题

20 篇文章 2 订阅

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出来的参数必须有值(待验证)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值