- string dataDir = AppDomain.CurrentDomain.BaseDirectory;
- if (dataDir.EndsWith(@"\bin\Debug\")
- || dataDir.EndsWith(@"\bin\Release\"))
- {
- dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;
- AppDomain.CurrentDomain.SetData("DataDirectory", dataDir);
- }
- string str = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\db5.mdf;Integrated Security=True;User Instance=True";
- using (SqlConnection conn = new SqlConnection(str))
- {
- conn.Open();
- using (SqlCommand cmd =conn.CreateCommand())
- {
- string name =txtName.Text;
- string password =txtPassword.Text;
- cmd.CommandText = "select count(*) from T_user where username =@name and password =@password";
- cmd.Parameters.Add(new SqlParameter("name",name));
- cmd.Parameters.Add(new SqlParameter("password",password));
- //int i =()cmd.ExecuteNonQuery();
- int i= (int)cmd.ExecuteScalar();
- if (i>=1)
- {
- MessageBox.Show("登录成功");
- }
- }
复制代码 在用户的输入没有为转义字符过滤时,就会发生这种形式的注入式攻击,它会被传递给一个SQL语句。这样就会导致应用程序的终端用户对数据库上的语句实施操纵。比方说,下面的这行代码就会演示这种漏洞:
statement := "SELECT * FROM users WHERE name = '" + userName + "'; "
这种代码的设计目的是将一个特定的用户从其用户表中取出,但是,如果用户名被一个恶意的用户用一种特定的方式伪造,这个语句所执行的操作可能就不仅仅是代码的作者所期望的那样了。例如,将用户名变量(即username)设置为:
a' or '1'='1,此时原始语句发生了变化:
SELECT * FROM users WHERE name = 'a' OR '1'='1';
如果这种代码被用于一个认证过程,那么这个例子就能够强迫选择一个合法的用户名,因为赋值't'='t永远是正确的。
|