前言

之前一直听说过防止sql注入,但是一直不太清楚是干什么的,现在听了牛腩老师的课程终于对它有所了解了。
   度娘说,sql注入就是:就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。那么防止sql注入就是一种网站防止黑客攻击的方式。如果您还不是很明白,请跟着小编一起来学习!

sql注入攻击的总体思路

(1)寻找到sql注入的位置
   (2)判断服务器类型和后台数据库类型
   (3)针对不同的服务器和数据库特点进行注入攻击

实例

举一个简单的栗子:
登录界面,要求输入用户名和密码,可以这样输入实现免账户登录:
用户名:’or 1=1-
密码:
   点击登录后如果没有进行防止sql注入处理,这个非法用户就登录进去了。

分析

我们知道后台会有这样一个sql语句:
String sql = “select * from user_table where username=’”+userName+” ’ and password=’ “+password+” ‘”;
当输入了用户名和密码之后sql语句就会变成:
SELECT * FROM user_table WHERE username=’’or 1 = 1 – and password=’’
   条件后面username=”or 1=1 用户名等于 ” 或1=1 那么这个条件一定会成功;然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都能正确执行,用户轻易骗过系统,获取合法身份。
   而且更可怕的是sql注入不仅可以非法登录系统,还可以通过输入到系统中的数据对系统的数据库进行增删改!那么如果这个系统是中国建设银行,后果大家可想而知了!所以防止sql注入就如同我们家里的防盗门一样重要!
防止sql注入
       防止sql注入的方法有很多,牛腩中使用的是参数化查询。
(1)sql注入代码:
sqlhelper:

public int  test()  
{  
   int res;  
   using (cmd=new SqlCommand("insert into category(name) values(@caName)"),GetConn())  
   {  
        cmd.Parameters.Add(new SqlParameter("@caName","牛腩测试"));  
        res=cmd.executeNonQuery();  
   }  
return res;  
}

categoryDAO:

public bool Insert(string caName)  
{  
    bool flag=false;  
    string sql="insert into category(name) values("+caName +")";  
    int res =sqlhelper.ExecuteNonQuery(sql);  
    if (res>0)  
    {  
        flag=true;  
     }  
    return flag;  
}

(2)修改:老师在SQLHelper里面使用参数paras,在categoryDAO中使用@caName这样的参数,再为@caName这个参数赋值,这样就防止了SQL注入,在机房中也是利用这中参数化查询的方式来防止这种漏洞的。
通过以上的代码我们可以知道参数化查询是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来赋值, SQL Server 的参数格式是以 “@” 字符加上参数名称而成的。后修改后的代码:
(2)修改:老师在SQLHelper里面使用参数paras,在categoryDAO中使用@caName这样的参数,再为@caName这个参数赋值,这样就防止了SQL注入,在机房中也是利用这中参数化查询的方式来防止这种漏洞的。
通过以上的代码我们可以知道参数化查询是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来赋值, SQL Server 的参数格式是以 “@” 字符加上参数名称而成的。后修改后的代码:
sqlhelper:

public  int  ExecuteNonQuery(string cmdText,SqlParameter [] paras,CommandType ct)  
        {  
            int res;  
            using (cmd=new SqlCommand(cmdText,GetConn ()))  
            {  
                cmd=new SqlCommand (cmdText,GetConn ());  
                cmd.CommandType =ct;  
                res=cmd.ExecuteNonQuery ();  
            }  
            return res ;  
        }

categoryCAO:

public Boolean Insert(string caName)  
        {  
            bool flag = false;  
            string sql = "insert into category(name) values(@caName)";  
            SqlParameter[] paras = new SqlParameter[]  
            {  
                new SqlParameter ("@caName",caName )  
            };  
             int res=sqlhelper .ExecuteNonQuery (sql);  
            if (res>0)            
            {  
                flag =true ;  
            }  
            return flag;  
        }

总结

在学习牛腩的过程中才发现,原来敲机房的时候就已经接触过sql注入的实例了,只不过当时不知道而已,牛腩老师讲的很详细,对于sql注入的理解也加深了一层,但是仍然有很多新的知识需要学习,在之后的学习中不断学习吧!