c#
  • mysql
  • oledb
  • 2015-10-13 70 views 0 likes 
    0

    我有一个关于添加参数到一个命令(MySQL或OleDB,我目前使用两个)的问题,以避免SQL注入。OleDB/MySQL参数添加

    这个硬编码的查询工作得很好,除了开放的注入漏洞之外;

    var queryString = string.Format("SELECT COUNT(*) FROM employs WHERE em_netname = '"+username+"' AND em_password = '"+password+"'"); 
    

    但是,在修改查询后,我添加了参数而不是让漏洞处于打开状态,但它不起作用。我是这样做的;

    var queryString = string.Format("SELECT COUNT(*) FROM employs WHERE em_netname = @username AND em_password = @password"); 
    OleDbCommand dbfQuery = new OleDbCommand(queryString, dbfCon); 
    dbfQuery.Parameters.Add("@username", OleDbType.Char).Value = username; 
    dbfQuery.Parameters.Add("@password", OleDbType.Char).Value = password; 
    

    有人请给我一个解释,为什么这是行不通的?第一个查询从count返回1,第二个返回0(它应该返回1)。

    编辑:为清楚起见由“不工作”我的意思是第一个语句返回1,即一列数有一个用户,查询不工作。第二条语句输入完全相同的用户名和密码后返回0,即虽然存在用户名和密码组合(由第一条语句证明),但查询无法正常工作。

    编辑2:发布整个班级代码;

    public static bool AuthenticateUser(string username, string password) 
        { 
         var constr = ConfigurationManager.ConnectionStrings["dbfString"].ConnectionString;   
         using (OleDbConnection dbfCon = new OleDbConnection(constr)) 
         { 
          try 
          { 
           dbfCon.Open(); 
           var queryString = string.Format("SELECT COUNT(*) FROM employs WHERE em_netname = @username AND em_password = @password"); 
           OleDbCommand dbfQuery = new OleDbCommand(queryString, dbfCon); 
           dbfQuery.Parameters.Add("@username", OleDbType.Char).Value = username; 
           dbfQuery.Parameters.Add("@password", OleDbType.Char).Value = password; 
           MessageBox.Show("Query: " + queryString); 
           int numOfColumns = Convert.ToInt32(dbfQuery.ExecuteScalar()); 
           MessageBox.Show(numOfColumns.ToString()); 
           if (numOfColumns == 1) 
           { 
            return true; 
           } 
           else 
           { 
            return false; 
           } 
          } 
          catch (OleDbException) 
          { 
           throw; 
          } 
         } 
        } 
    
    +0

    你的意思是_doesn't work_?你得到任何异常或错误信息?你如何准确地执行你的查询?顺便说一下,不要将密码存储为纯文本。阅读:http://stackoverflow.com/questions/1054022/best-way-to-store-password-in-database –

    +0

    没有上下文 - 你在你的数据库中存储密码? – Marco

    +0

    @SonerGönül为了清楚起见,我已通过答复更新。 – CBreeze

    回答

    1

    根据MSDNOleDbCommand不支持命名参数。尝试使用?来代替。

    当CommandType设置为Text时,OLE DB .NET Provider不支持将参数传递给SQL语句或由OleDbCommand调用的存储过程的命名参数。在这种情况下,必须使用问号(?)占位符。例如:

    SELECT * FROM Customers WHERE CustomerID = ?

    因此,在这种OleDbParameter对象添加到OleDbParameterCollection的顺序必须直接对应于问号占位符在命令文本的参数的位置。

    +0

    )Microsoft有修改链接的习惯,您可能需要从历史文档中复制/粘贴相关代码片段 – gigaplex

    +0

    没有我的朋友,MSDN的错误在于此提供程序**支持**支持命名参数。它只是不关心参数名称,只关心他们的命令,这意味着你**不必为这个提供者的每一个参数**使用'?' –

    +0

    @SonerGönül更改为'?'而不是'@用户名'确实在这种情况下工作 – CBreeze

    相关问题