-5

我在 Visual Studio 2012 中使用 ASP.NET C# 中的选择查询编写了登录身份验证代码。部分代码是

String conn = "Data Source=Srinidhi-PC\\sqlexpress;Initial Catalog=model;Integrated Security=True";
    SqlConnection con = new SqlConnection(conn);
    con.Open();
    String query ="select * FROM [original] WHERE firstname='" + TextBox1.Text + "' and password='" + TextBox2.Text + "'"; 
    SqlCommand cmd = new SqlCommand(query,con);
    SqlDataReader reader =  cmd.ExecuteReader();
    if (reader.HasRows == true)
        Response.Redirect("redirectpage.aspx");
    else
        Response.Write("Login Failure");

但每次,系统只响应“登录失败”。这里有什么问题?

ExecudeReader返回符合条件的记录。就查询而言,我写它是为了练习。我将在我的原始代码中添加参数。

4

2 回答 2

2

这里发生了很多事情,很难解开。

最重要的是,如果有人';(drop table [original])输入 TextBox1 怎么办?这被称为Sql Injection,它很糟糕,如果你正在学习成为一名程序员,你需要了解它是什么,以及如何避免它。

幸运的是,这是一个已解决的问题,您可以在整个网络上找到有关它的信息,甚至在 SO:SQL 注入攻击预防:我从哪里开始

经典 XKCD 来自http://xkcd.com/327/

接下来,如果reader.HasRows == false这并不意味着登录失败,则意味着查询返回了 0 行。如果您无法登录,那么调用con.Open()将引发异常,因此,您的问题是实际上您的查询没有返回数据。

此外,如果您只是计算行数以执行重定向,您可能希望使用count查询,该查询将执行得更快并使用更少的服务器资源。

于 2013-08-07T02:16:22.170 回答
1

我会改变你的代码如下

var query = "select COUNT(*) FROM [original] WHERE [firstname]=@firstname and [password]=@password";
var conn = "Data Source=Srinidhi-PC\\sqlexpress;Initial Catalog=model;Integrated Security=True";
using (var con = new SqlConnection(conn))
using (var cmd = new SqlCommand(query, con))
{
    cmd.Parameters.AddWithValue("@firstname", TextBox1.Text);
    cmd.Parameters.AddWithValue("@password", TextBox2.Text);
    con.Open();
    var result = (int)cmd.ExecuteScalar();
    if (result > 0)
        Response.Redirect("redirectpage.aspx");
    else
        Response.Write("Login Failure....");

}
于 2013-08-07T03:13:38.590 回答