C#参数化执行SQL语句,防止漏洞攻击本文以MySql为例【20151108非查询操作】
为什么要参数化执行SQL语句呢?
一个作用就是可以防止用户注入漏洞。
简单举个列子吧。
比如账号密码登入,如果不用参数,
写的简单点吧,就写从数据库查找到id和pw与用户输入一样的数据吧
sql:select id,pw where id='inputID' and pw='inputPW';
一般情况没什么问题,但如果用户输入的id或PW带 ‘ ,这是可能就会出现漏洞,bug了
比如用户输入的id是: 1‘ or ’1‘=‘1
这是sql语句执行的是:select id,pw where id='1‘ or ’1‘=‘1 ‘ and pw='inputPW';
那数据库里的所有账号密码都符合这个条件了。
简而言之,用户可以通过 ' 来改变你SQL的执行。
参数化就可以避免这个问题了。
/************************非查询操作*****************************************/ //今天太晚了,先写个非查询操作的,明天在写查询操作的。 /****函数*****/ /// <summary> /// 增删改数据,返回影响行数,没有则返回-1 /// </summary> /// <param name="sql">sql语句</param> /// <param name="ps">参数</param> /// <returns>返回影响行数</returns> static string connStr ="server=IP;User Id=账号名;password=密码;Database=表名"; public static int ExecuteNonQuery(string sql, params MySqlParameter[] ps) { using (MySqlConnection conn = new MySqlConnection(connStr)) { using (MySqlCommand cmd = new MySqlCommand(sql, conn)) { cmd.Parameters.AddRange(ps); conn.Open(); return cmd.ExecuteNonQuery();//返回受影响行数 } } } /****应用举例****/ public void InsertData() { int cid=1,aid=2; string name="hha"; string sql = "insert into tb_compart (compartID,compartName,areaID)values(@compartID,@compartName,@areaID);"; MySqlParameter[] ps ={ new MySqlParameter("@compartID",(object)cid), new MySqlParameter("@compartName",name), new MySqlParameter ("@areaID",(object)aid)}; int r = Mysql.MySQLHelper.ExecuteNonQuery(sql, ps);//r得值就是受影响的行数,执行失败r=-1; } }