C# 为什么在OleDB中使用参数后,我的响应总是0?

C# 为什么在OleDB中使用参数后,我的响应总是0?,c#,sql,asp.net,oledb,C#,Sql,Asp.net,Oledb,我有一个简单的.aspx登录网站,我使用OleDB进行本地验证 我的问题是:在发现SQL注入漏洞后,我决定使用参数。但是在使用参数之后,我的响应总是“0”(与“Authenticated=false”相同)。但如果我不使用参数,我的响应是“1”(与“Authenticated=true”相同) 下面是调试时的一些图片: 不带参数,其中响应=1(已验证): 代码为: string idstr = Request.QueryString["id"]; idstr.Repla

我有一个简单的.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");
            }
        }
string idstr=Request.QueryString[“id”];
idstr.替换(“”,“”);
字符串passpath=Request.QueryString[“password”];
passpath.Replace(“”,“”);
OleDbConnection connect=新的OleDbConnection();
OleDbCommand cmd=新的OleDbCommand();
connect.ConnectionString=@“Provider=Microsoft.ACE.OLEDB.12.0;数据源=C:\Users\hugow\u 000\Desktop\OSGS\u Kantine\u htm\u design\Kantine\u Data.accdb;持久安全信息=False;”;
cmd.Connection=connect;
connect.Open();
cmd.CommandText=“从用户数据中选择*,其中stamnumer=“+idstr+”和Wachtwoord=“+passpath;
OleDbDataReader read=cmd.ExecuteReader();
int代码=0;
while(read.read())
{
代码=代码+1;
}
如果(代码==1)
{
Response.Redirect(“~/AuthKeyGEN.aspx?Auth=true&id=“+idstr+”&password=“+passpath+”);
}
如果(代码>1)
{
重定向(“~/Login.aspx?Response=0”);
}
如果(代码<1)
{
重定向(“~/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");
            }
        }
string idstr=Request.QueryString[“id”];
idstr.替换(“”,“”);
字符串passpath=Request.QueryString[“password”];
passpath.Replace(“”,“”);
OleDbConnection connect=新的OleDbConnection();
OleDbCommand cmd=新的OleDbCommand();
connect.ConnectionString=@“Provider=Microsoft.ACE.OLEDB.12.0;数据源=C:\Users\hugow\u 000\Desktop\OSGS\u Kantine\u htm\u design\Kantine\u Data.accdb;持久安全信息=False;”;
cmd.Connection=connect;
connect.Open();
cmd.CommandText=“从用户_数据中选择*,其中stamnumer=@idstr和Wachtwoord=@passpath”;
cmd.Parameters.Add(“@idstr”,OleDbType.BSTR).Value=idstr;
cmd.Parameters.Add(“@passpath”,OleDbType.BSTR).Value=passpath;
OleDbDataReader read=cmd.ExecuteReader();
int代码=0;
while(read.read())
{
代码=代码+1;
}
如果(代码==1)
{
Response.Redirect(“~/AuthKeyGEN.aspx?Auth=true&id=“+idstr+”&password=“+passpath+”);
}
如果(代码>1)
{
重定向(“~/Login.aspx?Response=0”);
}
如果(代码<1)
{
重定向(“~/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()


看起来没有任何错误,但尝试使用
OleDbType.VarChar
而不是
OleDbType.BSTR
,因为这两个参数都是
字符串
类型;像

cmd.Parameters.Add("@idstr", OleDbType.VarChar).Value = idstr;
cmd.Parameters.Add("@passpath", OleDbType.VarChar).Value = passpath;
另外,作为旁注,不要使用
select*
而使用下面的
count()
查询,在这种情况下,您可以使用
ExecuteScalar()
而不是使用
ExecuteReader()


Ms Access使用什么?作为参数占位符,顺序很重要(您的顺序是正确的)。可以将参数对象命名为引擎忽略的名称,因此这实际上并不重要,但可能会使代码更具可读性。请参阅作为参考

cmd.CommandText = "select 1 from User_data where Stamnummer = ? and Wachtwoord= ?";
同时,将@Rahul指出的参数类型更改为
VarChar

一般性建议
  • 将连接包装在using块中。这样可以确保即使遇到异常,连接也始终处于关闭状态
  • 就像@Rahul所说的,使用ExecuteScalar而不是ExecuteReader。使用计数(*)或硬编码1作为结果:
    从用户数据中选择1…
  • 永远不要将密码存储为纯文本,永远不要!这是一个可怕的做法,是一个非常不安全的应用程序。我已经提交了一个完整的解决方案来创建一个可以复制/粘贴并直接使用的密码散列

  • Ms Access使用什么?作为参数占位符,顺序很重要(您的顺序是正确的)。可以将参数对象命名为引擎忽略的名称,因此这实际上并不重要,但可能会使代码更具可读性。请参阅作为参考

    cmd.CommandText = "select 1 from User_data where Stamnummer = ? and Wachtwoord= ?";
    
    同时,将@Rahul指出的参数类型更改为
    VarChar

    一般性建议
  • 将连接包装在using块中。这样可以确保即使遇到异常,连接也始终处于关闭状态
  • 就像@Rahul所说的,使用ExecuteScalar而不是ExecuteReader。使用计数(*)或硬编码1作为结果:
    从用户数据中选择1…
  • 永远不要将密码存储为纯文本,永远不要!这是一个可怕的做法,是一个非常不安全的应用程序。我已经提交了一个完整的解决方案来创建一个密码散列,您可以