sql注入问题

时间:2011-05-10 11:55:40

标签: asp.net sql code-injection

我有以下代码段。

SqlCommand cmd = new SqlCommand("SELECT FName,LName FROM EMPLOYEE_TABLE WHERE EmployeeID = '" +TextBox1.Text + "' AND Password = '"+ TextBox2.Text +"'", con);
SqlDataReader x = cmd.ExecuteReader();

try
{ 
    if (x.Read())
    {
        name = (string)x["FName"] +' '+ (string)x["LName"];
        Session["NAME"] = name;
        Session["ID"] = TextBox1.Text;
        Response.Redirect("sample.aspx?action=On_Click");
    }
    else
    {
        errormsg.Text = "login failed.Please enter Valid UserID and Password";
        errormsg.ForeColor = System.Drawing.Color.Red;
    }
}
catch (Exception exp)
{
    errormsg.Text = "Sorry,You dont have access to this portal.";
}
finally
{
    x.Close();
    con.Close();
}

现在,当我使用有效ID(存在)和密码为 abc'或'x'='x 时,它会登录到数据库中表的第一个帐户。直到这没关系。

但是,当我尝试调试代码时,会抛出错误Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack.

此外,如果它抛出错误,那么为什么它会登录到数据库的第一个帐户。注意:数据库的第一个帐户具有与我提供的用户ID不同的用户ID。

注意:我是这个应用程序的开发者。所以我没有做任何违法的事情。 :)

3 个答案:

答案 0 :(得分:3)

查看SQL的这一部分:

   "' AND Password = '"+ TextBox2.Text +"'"

使用您的密码,

   "' AND Password = ''x'='x'"

这不是您想要的SQL。

即使您尝试执行SQL注入,也必须生成有效的SQL。通常,它是在关闭引号后用分号结束语句。见:

enter image description here http://xkcd.com/327/

答案 1 :(得分:1)

好的,根据您所遇到的主要问题提供答案(如您所述,您是SQL注入问题的新手)。

SQL注入是由使用用户输入作为构造的一部分动态构建SQL查询引起的。 .Net中最简单的解决方案是创建参数化查询。

我认为杰夫阿特伍德有一篇最完整而简洁的文章,提供了解释和完整的例子here

引自上面的链接:

SqlConnection conn = new SqlConnection(_connectionString);
conn.Open();
string s = "SELECT email, passwd, login_id, full_name " + 
  "FROM members WHERE email = @email";
SqlCommand cmd = new SqlCommand(s);
cmd.Parameters.Add("@email", email);
SqlDataReader reader = cmd.ExecuteReader();

手头的问题:

它仍然登录帐户的原因是查询仍然是“有效”。

该语句仍将被执行,相关记录仍将从数据库返回,不会抛出任何异常。

提供无效数据时,唯一可以停止登录过程的方法是在执行查询之前验证输入。您应该始终在将数据发送到数据库之前验证用户输入。如果用户要提供:

username'; drop table users;--

作为用户名,您将遇到很多的麻烦。

答案 2 :(得分:0)

您遇到的错误是调试错误,而不是实际的程序异常。这就是你正常运行它的原因。

为了解决这个错误,我首先要确保一切都在使用Debug构建运行。此外,请确保您当前正在调试要检查的变量的函数。尝试踩踏(F10)几次超过断点以刷新上下文。互联网上有一些针对该特定错误的其他建议,所以如果您仍然遇到问题,可能需要进行一些谷歌搜索。