【问题标题】:the select query is not executing选择查询未执行
【发布时间】:2013-08-07 02:05:13
【问题描述】:

我在 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 返回符合条件的记录。就查询而言,我写它是为了练习。我将在我的原始代码中添加参数。

【问题讨论】:

  • 你永远不应该使用内联 SQL,因为它会让你面临 SQL 注入攻击,并且还可能导致包含空格和/或无效字符的数据。试试TextBox1.Text.Trim()TextBox2.Text.Trim() 看看是否有帮助。我假设original 是您要从中选择的数据库表的实际名称。如果您硬编码其中的值,查询是否在 SQL Server 中工作?
  • ' 或 1=1 -- 这应该可以帮助您:)
  • (reader.HasRows == true)s 可以缩短为 (reader.HasRows)。你甚至不需要一个读者,只需要一个伯爵(星)。从 [original] 中的 select count(start) 开始
  • 不,即使我对字符串中的值进行硬编码,查询也不会给我答案:(
  • 但我的问题是没有(零)值,你得到什么吗?只是测试您是否正在打桌子并且桌子有任何值。只是来自 [original] 的 Select 星。

标签: c# asp.net .net sql-server


【解决方案1】:

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

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

幸运的是,这是一个已解决的问题,您可以在整个网络上找到有关它的信息,甚至在 SO:SQL Injection attack prevention: where do I start

来自http://xkcd.com/327/

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

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

【讨论】:

    【解决方案2】:

    我会改变你的代码如下

    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....");
    
    }
    

    【讨论】:

      猜你喜欢
      • 2020-07-31
      • 1970-01-01
      • 2015-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多