-
-
SQL 注入是恶意用户输入 Transact-SQL 语句取代有效输入的过程。如果输入的语句没有经过验证直接传递到服务器,并且应用程序不慎执行了注入的代码,这种攻击有可能损坏或毁坏数据。
任何构造 SQL 语句的过程都应该针对注入漏洞进行审核,因为 SQL Server 将执行它扪收到的所有语法上有效的查询。技术熟练的蓄意攻击者甚至可以操作参数化数据。如果您使用动态 SQL,请确保将命令参数化,绝不要在查询字符串中直接包括参数值。
SQL 注入攻击剖析
注入过程的工作原理是过早终止某一文本字符串并追加一个新命令。因为插入的命令可能在执行之前已追加了其他字符串,攻击者可以使用注释标记“--”终止注入的字符串。执行时会忽略后续的文本。通过使用分号 (;) 分隔符可以插入多个命令。只要注入的 SQL 代码在语法上正确,就无法通过编程方式检测到这种篡改。因此,您必须验证所有用户输入并仔细检查将在您使用的服务器上执行构造的 SQL 命令的代码。切勿连接未经验证的用户输入。字符串连接是脚本注入的主要入口点。
string cmdText = "select count(1) from tb_user where userPwd=" + this.txtPwd.Text + " and userName=" + this.txtName.Text;
这里没有对两个文本框做任何处理很有可能被恶意者将txtName.Text的值追加 " or 1=1";
那么怎么登录都是正确的,这还是相对较好的恶意者,如果是在后面追加条 清空数据库的语句那么后果可想而知
分享解决办法
1.可以用正则将关键字替换成掉
Regex reg = new Regex("delete|update|select|or|and|where|"); this.txtName.Text = reg.Replace(this.txtName.Text, "");
2.将输入值进行参数化传送
string cmdText = "select count(1) from tb_user where userPwd=@pwd and userName=@Name;"; SqlParameter[] parms = new SqlParameter[] { new SqlParameter("@pwd",this.txtPwd.Text), new SqlParameter("@Name",this.txtName.Text) }; SqlCommand cmd = new SqlCommand(); cmd.Parameters.AddRange(parms); cmd.CommandText = cmdText; //........
3.就是利用存诸过程
create proc userLogin @pwd varchar(20), @Name varchar(20) as select count(1) from tb_user where userPwd=@pwd and userName=@Name; //要结合参数化传值 SqlParameter[] parms = new SqlParameter[] { new SqlParameter("@pwd",this.txtPwd.Text), new SqlParameter("@Name",this.txtName.Text) };
这篇博文要求会用正则及存诸过程和参数化传值给SQL
防止SQL注入式攻击的一些方法分享
最新推荐文章于 2024-01-11 08:48:39 发布