为什么在 OleDB 中使用参数后我的响应总是 0?
Why is my response always 0 after using parameters in OleDB?
我有一个简单的 .aspx 登录网站,我使用 OleDB 进行本地验证。
这是我的问题:发现SQL注入漏洞后,我决定使用参数。但在使用参数后,我的响应始终为“0”(与 "Authenticated=false" 相同)。但是如果我不使用参数,我的响应是“1”(与"Authenticated=true"相同)。
这里是一些调试时的照片:
没有响应=1(已验证)的参数:
使用代码:
string idstr = Request.QueryString["id"];
idstr.Replace("''", "");
string passpath = Request.QueryString["password"];
passpath.Replace("''", "");
OleDbConnection connect = new OleDbConnection();
OleDbCommand cmd = new OleDbCommand();
connect.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source= C:\Users\hugow_000\Desktop\OSGS_Kantine_htm_design\Kantine_data.accdb; Persist Security Info = False;";
cmd.Connection = connect;
connect.Open();
cmd.CommandText = "select * from User_data where Stamnummer="+idstr+" and Wachtwoord="+ passpath;
OleDbDataReader read = cmd.ExecuteReader();
int code = 0;
while (read.Read())
{
code = code + 1;
}
if (code == 1)
{
Response.Redirect("~/AuthKeyGEN.aspx?Auth=true&id=" + idstr + "&password=" + passpath + "");
}
if (code > 1)
{
Response.Redirect("~/Login.aspx?response=0");
}
if (code < 1)
{
Response.Redirect("~/Login.aspx?response=0");
}
}
并使用响应为 0(未验证)的参数:
并使用代码:
string idstr = Request.QueryString["id"];
idstr.Replace("''", "");
string passpath = Request.QueryString["password"];
passpath.Replace("''", "");
OleDbConnection connect = new OleDbConnection();
OleDbCommand cmd = new OleDbCommand();
connect.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source= C:\Users\hugow_000\Desktop\OSGS_Kantine_htm_design\Kantine_data.accdb; Persist Security Info = False;";
cmd.Connection = connect;
connect.Open();
cmd.CommandText = "select * from User_data where Stamnummer=@idstr and Wachtwoord=@passpath";
cmd.Parameters.Add("@idstr", OleDbType.BSTR).Value = idstr;
cmd.Parameters.Add("@passpath", OleDbType.BSTR).Value = passpath;
OleDbDataReader read = cmd.ExecuteReader();
int code = 0;
while (read.Read())
{
code = code + 1;
}
if (code == 1)
{
Response.Redirect("~/AuthKeyGEN.aspx?Auth=true&id=" + idstr + "&password=" + passpath + "");
}
if (code > 1)
{
Response.Redirect("~/Login.aspx?response=0");
}
if (code < 1)
{
Response.Redirect("~/Login.aspx?response=0");
}
}
我在两种情况下使用相同的凭据,
那么,如果我在这里使用参数,为什么我的响应总是 0?
提前致谢!
看起来没有任何问题,但尝试使用 OleDbType.VarChar
而不是 OleDbType.BSTR
因为两个参数都是 string
类型;喜欢
cmd.Parameters.Add("@idstr", OleDbType.VarChar).Value = idstr;
cmd.Parameters.Add("@passpath", OleDbType.VarChar).Value = passpath;
另请注意,不要使用 select *
,而是使用如下所示的 count()
查询,在这种情况下,您可以使用 ExecuteScalar()
而不是使用 ExecuteReader()
"select count(*) from User_data
where Stamnummer=@idstr and Wachtwoord=@passpath";
MS Access 使用 ?作为参数占位符并且顺序很重要(您的顺序是正确的)。参数对象可以命名,因为名称会被引擎忽略,所以它真的无关紧要,但可能会使代码更具可读性。请参阅 OleDbCommand.Parameters 作为参考。
cmd.CommandText = "select 1 from User_data where Stamnummer = ? and Wachtwoord= ?";
同时更改参数类型,正如@Rahul 所指出的VarChar
。
一般建议
- 使用 using block.This 包装您的连接确保您的连接始终关闭,即使遇到异常也是如此。
- 就像@Rahul 所说的那样,使用
ExecuteScalar
而不是ExecuteReader。使用 COUNT(*) 或硬编码 1 作为结果:select 1 from User_data ...
- 永远不要将密码存储为纯文本,永远不要!这是一种可怕的做法,会导致应用程序非常不安全。我已经提交了创建密码散列的完整解决方案,您可以 copy/paste 并直接使用。
我有一个简单的 .aspx 登录网站,我使用 OleDB 进行本地验证。
这是我的问题:发现SQL注入漏洞后,我决定使用参数。但在使用参数后,我的响应始终为“0”(与 "Authenticated=false" 相同)。但是如果我不使用参数,我的响应是“1”(与"Authenticated=true"相同)。
这里是一些调试时的照片:
没有响应=1(已验证)的参数:
使用代码:
string idstr = Request.QueryString["id"];
idstr.Replace("''", "");
string passpath = Request.QueryString["password"];
passpath.Replace("''", "");
OleDbConnection connect = new OleDbConnection();
OleDbCommand cmd = new OleDbCommand();
connect.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source= C:\Users\hugow_000\Desktop\OSGS_Kantine_htm_design\Kantine_data.accdb; Persist Security Info = False;";
cmd.Connection = connect;
connect.Open();
cmd.CommandText = "select * from User_data where Stamnummer="+idstr+" and Wachtwoord="+ passpath;
OleDbDataReader read = cmd.ExecuteReader();
int code = 0;
while (read.Read())
{
code = code + 1;
}
if (code == 1)
{
Response.Redirect("~/AuthKeyGEN.aspx?Auth=true&id=" + idstr + "&password=" + passpath + "");
}
if (code > 1)
{
Response.Redirect("~/Login.aspx?response=0");
}
if (code < 1)
{
Response.Redirect("~/Login.aspx?response=0");
}
}
并使用响应为 0(未验证)的参数:
并使用代码:
string idstr = Request.QueryString["id"];
idstr.Replace("''", "");
string passpath = Request.QueryString["password"];
passpath.Replace("''", "");
OleDbConnection connect = new OleDbConnection();
OleDbCommand cmd = new OleDbCommand();
connect.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source= C:\Users\hugow_000\Desktop\OSGS_Kantine_htm_design\Kantine_data.accdb; Persist Security Info = False;";
cmd.Connection = connect;
connect.Open();
cmd.CommandText = "select * from User_data where Stamnummer=@idstr and Wachtwoord=@passpath";
cmd.Parameters.Add("@idstr", OleDbType.BSTR).Value = idstr;
cmd.Parameters.Add("@passpath", OleDbType.BSTR).Value = passpath;
OleDbDataReader read = cmd.ExecuteReader();
int code = 0;
while (read.Read())
{
code = code + 1;
}
if (code == 1)
{
Response.Redirect("~/AuthKeyGEN.aspx?Auth=true&id=" + idstr + "&password=" + passpath + "");
}
if (code > 1)
{
Response.Redirect("~/Login.aspx?response=0");
}
if (code < 1)
{
Response.Redirect("~/Login.aspx?response=0");
}
}
我在两种情况下使用相同的凭据, 那么,如果我在这里使用参数,为什么我的响应总是 0?
提前致谢!
看起来没有任何问题,但尝试使用 OleDbType.VarChar
而不是 OleDbType.BSTR
因为两个参数都是 string
类型;喜欢
cmd.Parameters.Add("@idstr", OleDbType.VarChar).Value = idstr;
cmd.Parameters.Add("@passpath", OleDbType.VarChar).Value = passpath;
另请注意,不要使用 select *
,而是使用如下所示的 count()
查询,在这种情况下,您可以使用 ExecuteScalar()
而不是使用 ExecuteReader()
"select count(*) from User_data
where Stamnummer=@idstr and Wachtwoord=@passpath";
MS Access 使用 ?作为参数占位符并且顺序很重要(您的顺序是正确的)。参数对象可以命名,因为名称会被引擎忽略,所以它真的无关紧要,但可能会使代码更具可读性。请参阅 OleDbCommand.Parameters 作为参考。
cmd.CommandText = "select 1 from User_data where Stamnummer = ? and Wachtwoord= ?";
同时更改参数类型,正如@Rahul 所指出的VarChar
。
一般建议
- 使用 using block.This 包装您的连接确保您的连接始终关闭,即使遇到异常也是如此。
- 就像@Rahul 所说的那样,使用
ExecuteScalar
而不是ExecuteReader。使用 COUNT(*) 或硬编码 1 作为结果:select 1 from User_data ...
- 永远不要将密码存储为纯文本,永远不要!这是一种可怕的做法,会导致应用程序非常不安全。我已经提交了创建密码散列的完整解决方案,您可以 copy/paste 并直接使用。