为什么在使用OleDB中的参数后我的响应始终为0?

时间:2016-08-14 10:14:00

标签: c# sql asp.net oledb

我有一个简单的.aspx登录网站,我使用OleDB进行本地验证。

这是我的问题:找到SQL Injection漏洞后,我决定使用参数。但在使用参数后,我的响应始终为“0”(与“Authenticated = false”相同)。但是如果我不使用参数,我的响应是“1”(与“Authenticated = true”相同)。

这里有一些调试时的照片:

没有参数,其中response = 1(Authenticated): Without parameters

使用代码:

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(未经过身份验证): With parameters

并使用代码:

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?

提前致谢!

2 个答案:

答案 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";

答案 1 :(得分:0)

Access女士使用?作为参数占位符和订单很重要(您的订单是正确的)。可以将参数对象命名为引擎忽略的名称,因此它无关紧要,但可能会使代码更易读。请参阅OleDbCommand.Parameters作为参考。

cmd.CommandText = "select 1 from User_data where Stamnummer = ? and Wachtwoord= ?";

同样更改@Rahul指出VarChar的参数类型。

一般建议

  1. 在使用区块中包裹您的连接。这可确保即使遇到异常,您的连接也始终处于关闭状态。
  2. 与@Rahul一样,使用ExecuteScalar代替ExecuteReader。使用COUNT(*)或hardcode 1作为结果:select 1 from User_data ...
  3. 永远不要将密码存储为纯文本!这是一个可怕的做法,使得一个非常不安全的应用程序。我已经提交了一个完整的解决方案来创建一个可以复制/粘贴并直接使用的密码哈希。