<font size="3" color="#ff00ff">SELECT COUNT(*) FROM SQLTMP WHERE name = 'admin' AND pass = 'admin' SELECT COUNT(*) FROM SQLTMP WHERE name = '' or 1=1 -- ' AND pass = '123' </font>
我们会发现我们输入的用户名变成了空,后面多了or 1=1 --'这又是为什么,什么原因导致的???
到离这里我们就应该看看这一段代码:
<font size="3" color="#ff00ff"> string sql = "SELECT COUNT(*) FROM admin WHERE name = '"+name+"'AND pass = '"+pass+"'"; </font>
我们可以看出SQL是中的name和pass是变量是用户输入的账号和密码
我们来看一下输入的用户名:' or 1=1 --
那么用户如输入'的时候就会自动把name = ''闭合
而 or 1=1 将where 条件永远成立
--在SQL是注释的意思会将后面的SQL语句注释掉!!!
那么我们就可以这么认为SQL语句到最后是这个样子的
<font size="3" color="#ff00ff">SELECT COUNT(*) FROM SQLTMP WHERE name = '' or 1=1</font>
0x04防御
有攻击的方式是会有防御的方式
据我所知常用的有俩种方式:
1.通过SQLParameter
好处:预编译SQL语句防止被转意
用法:
<font size="3" color="#ff00ff">string sql = "SELECT COUNT(*) FROM admin WHERE name = [url=home.php?mod=space&uid=116087]@name[/url] AND pass = @pass "; //创建SParameter[] SqlParameter[] para = { new SqlParameter("@name",name), new SqlParameter("@pass",pass) }; SqlCommand sqlcom = new SqlCommand(sql, SqlCon); //通过Parameters.addRange方法将para[]放进去 sqlcom.Parameters.AddRange(para); int i = (int)sqlcom.ExecuteScalar(); </font>
@符号代表的参数,我们把拼接的方式换成了参数的形式
2.存储过程
1.首先在数据库中创建存储过程
<font size="3" color="#ff00ff">CREATE PROC Login (@name VARCHAR(20) ,@pass VARCHAR(20)) AS SELECT COUNT(*) FROM admin WHERE name =@name AND pass = @pass GO </font>
2. 调用存储过程
<font size="3" color="#ff00ff">SqlParameter[] para = { new SqlParameter("@name",name), new SqlParameter("@pass",pass) }; SqlCommand sqlcom = new SqlCommand(); sqlcom.Connection = SqlCon; sqlcom.CommandText = "Login"; //指定执行类型为存储过程 sqlcom.CommandType = CommandType.StoredProcedure; sqlcom.Parameters.AddRange(para); int i = (int)sqlcom.ExecuteScalar(); </font>
好了,关于本文给大家介绍的.NET应用程序SQL注入就给大家介绍到这里,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的,在此也非常感谢大家对脚本之家网站的支持!
您可能感兴趣的文章: