------------- Windows phone 手机开发 、ASP .NET培训、期待与您交流!----------------
SQL注入攻击是发生在应用程序之数据库层的安全漏洞。简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序中忽略了检查,那么这些注入进去的指令就会被数据库服务器误认为是正常的SQL指令而运行,因此招到破坏。有部分人认为SQL注入攻击只是针对于Microsoft SQL Server而来,但是只要是支持批量处理SQL指令的数据库服务器,都有可能受到此种手法的攻击。
那么应用程序如果有以下状况,可能会招到SQL注入漏洞攻击:
1 在应用程序中使用字符串联结方式组合SQL指令。
2 在应用程序连结数据库时使用权限过大的帐户(例如很多开发人员都喜欢用sa(自带的最高权限的系统管理员帐户)连接Microsoft SQL Server数据库)。
3 在数据库中开放了不必要但权力过大的功能(例如在Microsoft SQL Server数据库中的xp_cmdshell延伸预存程序或是OLE Automation预存程序等)
4 太过于信任用户所输入的数据,未限制输入的字符数,以及未对用户输入的数据做潜在指令的检查。
下面我用代码解释具体的SQL注入漏洞攻击是怎么是实现的:
private void button1_Click(object sender, EventArgs e)
{
string userName=this.textBox1.Text.Trim();
string Password=this.textBox2.Text;
using (SqlConnection conn = new SqlConnection(@"Data Source=.\Sqlexpress;AttachDbFileName='|DataDirectory|\Database1.mdf';Integrated Security=True;User Instance=True"))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select * from T_Users where UserName='" + userName + "'";
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
string dbPassword = reader.GetString(reader.GetOrdinal("Password")).ToString();
if (dbPassword == Password)
{
MessageBox.Show("登录成功!");
}
else
{
MessageBox.Show("密码错误!");
}
}
else
{
MessageBox.Show("用户名错误!");
}
}
}
}
}
如果我将数据库中的用户名更改为:1' or '1'='1,密码还是数据库中的正确密码就会出现如下图片中的效果:
居然登录成功了,这就是所谓的SQL注入漏洞攻击,如果在给cmd.CommandText添加监视就会知道它是怎么攻击的,select * from T_Users where UserName='1' or '1'='1'这就是我输入用户名后产生的select语句,它的结果始终为true。
那么如何防止这种SQL注入攻击呢?可以为cmd添加参数:
cmd.CommandText = "select * from T_xiaowei where UserName=@UserName";
cmd.Parameters.Add("UserName", userName);
这样就可以防止SQL注入攻击了。
------------- Windows phone 手机开发 、ASP .NET培训、期待与您交流!----------------