【问题标题】:error in query in asp.net [duplicate]asp.net中的查询错误[重复]
【发布时间】:2016-04-15 14:47:52
【问题描述】:

错误显示无效的列名 mustufain。 mustufain 是UserName.Text.toString() 的值

string query = "select userid from register where username = " + UserName.Text.ToString() + " and " + "password = " + Password.Text.ToString();

SqlCommand cmd1 = new SqlCommand(query,connection);
connection.Open();
SqlDataReader rd1 = cmd1.ExecuteReader();
while(rd1.Read())
{
    Session["checkuserid"] = rd1["userid"];
}
connection.Close();

【问题讨论】:

  • 首先,ASP.NET 不执行查询。那就是 ADO.NET。其次,你应该通过连接构造sql语句。使用参数化查询。在这种情况下,您不知道用户输入了什么。如果是1;drop table users;-- 呢?
  • 谷歌搜索“Bobby Tables”看看会发生什么
  • SqlConnection、SqlCommand 和 SqlDataReader 实现IDisposable。您需要在它们的 finally 块中调用 dispose,或者将它们包装在 using statement 中以确保它们得到正确处理。如果你现在不这样做,你以后会遇到问题,并且很难追踪问题。
  • 您似乎将明文密码存储在数据库中。不要那样做!这是一个安全问题。密码应该是单向散列和加盐的,以使攻击难以检索明文密码。为了测试用户是否输入了正确的密码,您比较了散列副本。

标签: c# asp.net


【解决方案1】:

首先,您不应该使用字符串连接来构建查询,因为它会使您容易受到 SQL 注入攻击之类的攻击,并且可能导致您的查询不正确(因为您的参数周围缺少刻度线):

// This would attempt to state username = mustufain instead of 
// username = 'mustufain' (and SQL doesn't know what mustufain is)
var query = "select userid from register where username = '" + UserName.Text + "' and " + "password = '" + Password.Text + "'";

使用参数化的更好方法如下所示,它可以避免不正确的语法并为您提供防止任何讨厌的注入的保护:

// Open your connection
using(var connection = new SqlConnection("{your connection string}"))
{
     // Build your query
     var query = "SELECT TOP 1 userid FROM register WHERE username = @username AND password = @password";
     // Build a command (to execute your query)
     using(var command = new SqlCommand(query, connection))
     {
          // Open your connection
          connection.Open();
          // Add your parameters
          command.Parameters.AddWithValue("@username",UserName.Text);
          command.Parameters.AddWithValue("@password",Password.Text);
          // Execute your query
          var user = Convert.ToString(command.ExecuteScalar());
          // If a user was found, then set it
          if(!String.IsNullOrEmpty(user))
          {
               Session["checkuserid"] = user;
          }
          else
          {
               // No user was found, consider alerting the user
          }
     }
}

最后,您可能需要重新考虑如何存储凭据(以明文形式)。 ASP.NET 提供了各种各样的提供程序,可以帮助您处理此过程,因此您不必自己动手。

【讨论】:

    【解决方案2】:

    您正在尝试连接字符串以构建 sql 查询,并且像往常一样,您会遇到错误。在您的特定情况下,您忘记将字符串值括在单引号之间。但是执行此查询的唯一正确方法是通过参数化查询

    string query = @"select userid from register 
                    where username = @name and password = @pwd";
    using(SqlCommand cmd1 = new SqlCommand(query,connection))
    {
        connection.Open();
        cmd1.Parameters.Add("@name", SqlDbType.NVarChar).Value = UserName.Text;
        cmd1.Parameters.Add("@pwd", SqlDbType.NVarChar).Value = Password.Text;
        using(SqlDataReader rd1 = cmd1.ExecuteReader())
        {
            ....
        }
    }
    

    另请注意,在数据库中以明文形式存储密码是一种非常糟糕的做法,并且存在很大的安全风险。在这个网站上,有许多问题和答案解释了如何创建密码哈希并存储该哈希而不是明文

    例如:Best way to store passwords in a database

    【讨论】:

      猜你喜欢
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-16
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多