查看: 2031|回复: 25

用参数的形式防止注入漏洞

[复制链接]
发表于 2012-12-3 05:57:24 | 显示全部楼层 |阅读模式
在判断用户登录时如果用了string.format字符串拼接的方式,用户有可能通过相应的拼接,去注视掉要求验证的代码;这样就有了漏洞;然而在net中通过参数的方式(本质是存储过程对这样的行为进行防范;)

protected void Button1_Click(object sender, EventArgs e)
        {
            string constr = "data source=.;initial catalog=UserDB1;User id=sa;password=admin";
            using(SqlConnection con=new SqlConnection(constr))
            {
               // string sql = string.Format("select count(*) from T_Users where FuserName='{0}' and Fpassword='{1}'",txtUserName.Text.Trim(),txtPassword.Text);
               //以上这种拼接sql语句的方法有sql注入漏洞攻击的问题 jk' or 1=1 --
                //如果避免注入漏洞攻击呢?使用参数的方法或存储过程的方法
                string sql = "select count(*) from T_Users where FuserName=@username and Fpassword=@password";

                using (SqlCommand cmd=new SqlCommand(sql,con))
                {
                    con.Open();
                   //在数据服务器端执行sql语句前需要告诉它@username,@password是谁。
                    //cmd.Parameters.AddWithValue("@username", txtUserName.Text.Trim());
                 
                    //cmd.Parameters.AddWithValue("@password", txtPassword.Text);
                    //每一个参数都是一个参数对象
                    //SqlParameter p1 = new SqlParameter("@username", txtUserName.Text.Trim());
                    //cmd.Parameters.Add(p1);
                    //SqlParameter p2 = new SqlParameter("@password", txtPassword.Text);
                    //cmd.Parameters.Add(p2);
                    //很多情况下参数的个数很多p1.....p9
                  
                    SqlParameter[] pms = new SqlParameter[] {
                  
                    new SqlParameter("@username", txtUserName.Text.Trim()),

  new SqlParameter("@password", txtPassword.Text)
                    };
                    cmd.Parameters.AddRange(pms);
//通过监视发现,ADO的参数替换的方法避免了注入漏洞攻击,它通过一个存储过程实现了把输入的任何字串作为字串处理的形式。
                    //exec sp_executesql N'select count(*) from T_Users where FuserName=@username and Fpassword=@password',N'@username nvarchar(13),@password nvarchar(4)',@username=N'jk'' or 1=1 --',@password=N'sfds'
                   //在sql中,把’单引号转意为字符串的方法是前面再加一个单引号。
                    //在sql中的参数都是以@开始的,
                    int r=Convert.ToInt32(cmd.ExecuteScalar());//把sql语句送到数据服务器端执行
                   con.Close();//可以提前关闭链接,提高效率。
                   if (r > 0)
                   {
                       Response.Write("登陆成功!");
                   }
                   else
                   {
                       Response.Write("登陆失败!");
                   }
发表于 2012-12-6 10:50:10 | 显示全部楼层
不知道说些什么  
发表于 2014-10-20 01:19:16 | 显示全部楼层
感謝樓主  
发表于 2014-10-26 19:04:17 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2014-11-6 05:38:41 | 显示全部楼层
来几句吧  
发表于 2014-11-18 18:35:30 | 显示全部楼层
原来这样也可以  
发表于 2014-12-6 12:45:14 | 显示全部楼层
慢慢来,呵呵  
发表于 2014-12-29 17:51:37 | 显示全部楼层
哎 怎么说那~~  
发表于 2015-1-29 14:17:57 | 显示全部楼层
(*^__^*) 嘻嘻……  
发表于 2015-3-3 18:28:06 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
高级模式
B Color Image Link Quote Code Smilies

本版积分规则