2011-05-10 62 views
2

我有以下代码片段。sql注入问题

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’=”×然后将其登录到数据库中的第一个帐户表中的。直到这很好。

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

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

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

+2

第一个问题是,如果你是开发商,你是知道SQL注入的,你为什么不至少使用参数化查询? – Jaymz 2011-05-10 12:02:49

+0

雅,很好的问题。多数民众赞成bcoz我刚才了解到SQL注入,所以我尝试在我自己的应用程序。然而我没有太多的想法回合参数化查询。 – scooby 2011-05-10 12:05:04

+0

.net有一些建立在一些blatent sql注入问题的保护(微软正在做我认为你应该要做的事)。我猜你正在遇到这些。我记得当我第一次发现SQL注入时,我也遇到了它们。 – Chad 2011-05-10 13:41:57

回答

3

看看你的SQL的这部分:

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

有了您的密码,这是

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

这是不是你想要的SQL。

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

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

0

您遇到的错误是调试错误,而不是实际的程序异常。这就是为什么当你正常运行时它会工作。

为了弥补这个错误,我首先要确保所有东西都在Debug版本中运行。另外,确保你正在调试你想要检查的变量的功能。尝试跨越断点几次(F10)以刷新上下文。在互联网上有一些其他的建议,如果你仍然有问题,你可能需要做一些搜索。

+0

我不关心这个错误。所有我想知道,如果在调试模式下应用程序进入catch语句,然后在哪里,我把我的Response.Redirect(“sample.aspx?action = On_Click”); ,这样它就不会直接进入该页面,而是通过catch块。 – scooby 2011-05-10 12:07:54

+0

这不是你发布的问题,虽然... – Jaymz 2011-05-10 12:13:02

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;-- 

作为用户名,你将在一个很多麻烦

+0

谢谢,这确实有帮助。我明白这个错误。我想我需要改变我的代码中很多东西。 因此,如果我写这样的查询,那么它是完全安全的SQL注入? – scooby 2011-05-10 12:18:07

+0

是的,如果从一开始就没有设计这样做,重写应用程序以抵御SQL注入确实是一项艰巨的任务。 – Jaymz 2011-05-10 12:19:46