我有以下代码段。
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。
注意:我是这个应用程序的开发者。所以我没有做任何违法的事情。 :)
答案 0 :(得分:3)
查看SQL的这一部分:
"' AND Password = '"+ TextBox2.Text +"'"
使用您的密码,
"' AND Password = ''x'='x'"
这不是您想要的SQL。
即使您尝试执行SQL注入,也必须生成有效的SQL。通常,它是在关闭引号后用分号结束语句。见:
答案 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)几次超过断点以刷新上下文。互联网上有一些针对该特定错误的其他建议,所以如果您仍然遇到问题,可能需要进行一些谷歌搜索。