比较 sqldatareader 中的数据以登录详细信息的问题 C#(新手)

Issue with comparing data in sqldatareader to log in details C# (Newbie)

我的代码中的 if 语句有问题,我一直无法弄清楚为什么条件没有恢复为真。

private bool ValidationFunction(string UserName, string Password)
{
    bool returnBool = false;

    var strConnection = ConfigurationManager.ConnectionStrings["BankConnectionString"].ConnectionString;
    SqlConnection sqlConnection = new SqlConnection(strConnection);

    string query = "SELECT " + COLUMN_ID + ", " + COLUMN_MACHINEPIN + " FROM " + PERSON_TABLE + " WHERE " + COLUMN_ID + " = \'" + UserName + "\' AND " + COLUMN_MACHINEPIN + " = \'" + Password + "\'";
    SqlCommand command = new SqlCommand(query, sqlConnection);
    SqlDataReader rdr;

    sqlConnection.Open();
    rdr = command.ExecuteReader();

    while(rdr.Read())
    {
        if (UserName == rdr["Id"].ToString() & Password == rdr["MachinePin"].ToString())
        {
            returnBool = true;
        }

        return returnBool;
    }
    rdr.Close();
    return returnBool;
}

我试过同时使用列名和我在查询中使用的常量,但都不起作用,而且我不能完全让它工作。任何帮助将不胜感激

编辑:原来我从数据库中检索的数据有额外的白色 space 因为我使用了 nchar 所以我不得不使用 trim 函数。

试试这个:

   var username = rdr["Id"].ToString() 
   var password = rdr["MachinePin"].ToString())
   Debugger.Break(); 

在调试器语句中打开直接 windows 并手动输入比较,直到确定根本原因。

UserName==username;
Password = password;

调试技巧

你知道如何打开即时Window吗?转到 Debug/Windows/Immediate。它允许您在调试点输入 C# 语句。

无法读取数据

如果无法读取 rdr["Id"],例如 InvalidOperation 等,那么您遇到了以下问题之一:

  1. 连接字符串从未打开连接
  2. 错误Database/Table
  3. 字段名称不正确
  4. 安全失败。

您应该检查每个步骤的状态代码,如果您没有看到任何东西,那么这很可能是一个安全问题,因为银行不会宣传哪里出了问题(有道理,不要告诉黑客任何事情)。

安全问题

如果是安全问题,您必须降低到线路级别。跟踪并查看 Return 代码。另一方将首先结束会话。您应该在打开通信之前看到安全层握手,如果握手不起作用,会话将立即终止,没有进一步的细节。

追踪

Wireshark 使用简单,下载速度快,并可在线显示所有内容。使用 Wireshark 进一步深入研究应用层看不到的东西。

您应该使用 && 而不是 &。

& is a bit-wise "AND", meaning that it works on the bit level, whereas && is a logical "AND" meaning it works at boolean (true/false) level.

我还会整理一下您的代码。如果不参数化您的输入,您将面临 SQL 注入攻击。

您还可以将一次性物品包裹在使用块中。它将使您的代码更清晰,更具可读性。

using (var conn = new SqlConnection("your connection"))
{
  using (var cmd = new SqlCommand(sql, conn))
  {
    conn.Open();
    using (var rdr = cmd.ExecuteReader())
    {
      ...
    }
  }
}

试试下面的方法:

 if ((UserName == (string)rdr["Id"]) && (Password == (string)rdr["MachinePin"]))
            {
                returnBool = true;
            }