我在Visual Studio 2012中使用ASP.NET C#中的select查询编写了一个用于登录验证的代码。部分代码是
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
返回与条件匹配的记录。就查询而言,我是为了练习而写的。我将在原始代码中添加参数。
答案 0 :(得分:2)
这里发生了很多事情,很难解开。
最重要的是,如果有人在TextBox1中输入';(drop table [original])
怎么办?这被称为Sql Injection,这很糟糕,如果你正在学习成为一名程序员,你需要了解它是什么,以及如何避免它。
幸运的是,这是一个已解决的问题,你可以在网上找到有关它的信息,即使在这里也是如此:SQL Injection attack prevention: where do I start
接下来,如果reader.HasRows == false
并不意味着登录失败,则表示查询返回0行。如果您无法登录,则对con.Open()
的调用将引发异常,因此,您的问题实际上是您的查询未返回数据。
此外,如果您只计算行以执行重定向,则可能需要使用count
查询,该查询将执行得更快并且使用更少的服务器资源。
答案 1 :(得分: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....");
}