比较 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 等,那么您遇到了以下问题之一:
- 连接字符串从未打开连接
- 错误Database/Table
- 字段名称不正确
- 安全失败。
您应该检查每个步骤的状态代码,如果您没有看到任何东西,那么这很可能是一个安全问题,因为银行不会宣传哪里出了问题(有道理,不要告诉黑客任何事情)。
安全问题
如果是安全问题,您必须降低到线路级别。跟踪并查看 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;
}
我的代码中的 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 等,那么您遇到了以下问题之一:
- 连接字符串从未打开连接
- 错误Database/Table
- 字段名称不正确
- 安全失败。
您应该检查每个步骤的状态代码,如果您没有看到任何东西,那么这很可能是一个安全问题,因为银行不会宣传哪里出了问题(有道理,不要告诉黑客任何事情)。
安全问题
如果是安全问题,您必须降低到线路级别。跟踪并查看 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;
}