string uid = "admin" ; string pwd = "123456"; -------- 正常的是要这样才能正确登录的.
在sql中的语句是: select conut(*) from database where uid='admin' and pwd='123456' 。
但是如果把密码改成 string pwd = "123' or '1' = '1";
在数据库的语句就成了 : select count(*) from database where uid = 'admin' and pwd = '123' or '1' = '1' ----因为后面有个 or '1'='1' 所以这个条件永远成立,即使密码错误也可以登录,甚至用户名错了都可以。高手们可以根据这个漏洞来测试你服务器的一些东西,具体我也不懂了。。
防止sql注入的办法就是参数化.下面上代码
// -> 在需要使用拼接的地方用@引导一个别名(变量)
// -> 创建SqlParameter对象,为别名赋值
// 通过构造函数
// -> 在执行SQL语句的时候,为cmd添加参数
string sql = "select count(*) from database where uid=@uid and pwd=@pwd";
SqlParameter uid = new SqlParameter("@uid", txtUid.Text.Trim());
SqlParameter pwd = new SqlParameter("@pwd", txtPwd.Text);
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["sql"].ConnectionString))
{
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
// 添加参数
cmd.Parameters.Add(uid);
cmd.Parameters.Add(pwd);
conn.Open();
int res = Convert.ToInt32(cmd.ExecuteScalar());
if (res > 0)
{
MessageBox.Show("登录成功");
}
else
{
MessageBox.Show("Error");
}
}
}作者: 贾文泽 时间: 2013-2-24 12:03
SQL注入是最有效,也是最常见的一种攻击方式,70%以上的网站存在SQL Injection 漏洞
SQL注入攻击的方法千变万化,并且不被浏览器拦截,这是他的可怕之处,我说两个最基础的,说明下原理就行【这种方法现在也是用不了的,能用的也不敢在这说哈】
可能语言不同,但是技术都是相同的,只供理解
1.当sql语句这么写的时候 $sql="select * from user where username='$username' and password='$password'";
可以用万能用户名登录后台管理界面(密码随便输,下同) 万能用户名: xx' union select & from users /*
同样,也有万能密码 万能密码: aa' or 1='1
2.1.当sql语句这么写的时候 $sql="select * from user where username=$username and password=$password"; 【没有单引号,mysql会把你的输入当数字对待】
万能用户名: 数字 union select * from users/*
万能密码: 数字 union select * from uesrs; 【用户名一定输成数字】