2014-12-28 63 views
0

这是我学会表的模式:如何从查询中获取值并将其与字符串进行比较?

Society(SocietyName, Email, Password, Status) 

所以基本上我创建在用户输入电子邮件和密码登录页面。如果存在与数据库中的电子邮件相匹配的电子邮件,则检查其状态是否与总统或教职人员或学生事务办公室相同。基于此,它重定向到不同的页面。 以下是我的代码:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace WebApplication3 { 
    public partial class WebForm1 : System.Web.UI.Page { 
     MySql.Data.MySqlClient.MySqlConnection conn; 
     MySql.Data.MySqlClient.MySqlCommand cmd; 
     MySql.Data.MySqlClient.MySqlDataReader reader; 
     String QueryStr; 
     String name; 

     protected void Page_Load(object sender, EventArgs e) { } 
     protected void clicked(object sender, EventArgs e) { 
      String ConnString = System.Configuration.ConfigurationManager.ConnectionStrings["Webappconstring"].ToString(); 
      conn = new MySql.Data.MySqlClient.MySqlConnection(ConnString); 
      conn.Open(); 
      String QueryStr2 = ""; 
      QueryStr = ""; 
      QueryStr = "Select * from the_society_circle.society WHERE Email= '" + Emailtxt.Text + "' And Psswd=' " + passwordtxt.Text + "'"; 
      cmd = new MySql.Data.MySqlClient.MySqlCommand(QueryStr, conn); 
      reader = cmd.ExecuteReader(); 

      QueryStr2 = "Select Status from the_society_circle.society where Email = '" + QueryStr + "'"; 
      name = ""; 
      while (reader.HasRows && reader.Read()) { 
       name = reader["Email"].ToString(); 
      } 


      if ((QueryStr2== "president" || QueryStr2 == "faculty member") && reader.HasRows) { 
        Session["Email"] = name; 
        Response.BufferOutput = true; 
        Response.Redirect("WebForm2.aspx", true); 
      } else { 
       Emailtxt.Text = "invalid user"; 
      } 
      conn.Close(); 
      }  
     } 
} 

的问题是,如果永远不会执行并声明它总是打印无效用户。

PS:进出口新的Web开发:d

+0

是否“点击”运行的方法呢?请用调试器检查它,如果它根本没有运行,那么你有解决这个问题的方法 - 你需要把它设置为事件处理程序。如果该方法运行,那么你会得到什么样的错误/异常?您可以使用调试器浏览代码并逐步调查它的工作原理。 – msporek

+0

是的,肯定事件处理程序正在工作。如果它没有工作,那么它不应该打印“无效用户”。 – puffles

+0

这段代码揭示了一些严重的问题!这很容易sql注入。你把你的密码存储为明文?! – khlr

回答

0

由于codemonkey已经写入,您的条件将永远不会实现。

您执行以下操作:if ((QueryStr2== "president" || Quer...其计算结果为if (("Select Status from the_society_circle.society where Email = '" + QueryStr + "'"== "president" || Quer...。所以你要比较两个不同的字符串,永远不会成功。


我试图重构你的代码,并与本想出了(未测试,从头写):

  1. 首先把你的数据库相关的代码放到一个单独的类(MySqlAccess)和处置数据库对象(将它们放入using - 在离开块时调用Dispose()的块)。
  2. 不要直接在sql查询中使用用户输入。请记住“所有输入都是邪恶的”。所以最好使用参数化查询。
  3. 比较失败的原因是您没有执行第二个查询。现在代码只执行一个查询并返回用户的状态。

所以总结起来:

有无SQL注入,并考虑其他恶意行为。例如看看这篇文章:http://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx

从来没有作为明文存储在您的数据库中的密码。这是你应该关心的下一件事。编辑您的数据库以将密码存储为盐渍密码哈希值并仅对比哈希值。有关起点,都看一下这篇文章:http://www.codeproject.com/Articles/704865/Salted-Password-Hashing-Doing-it-Right


using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using MySql; 

namespace WebApplication1 
{ 
    public partial class WebForm1 : System.Web.UI.Page 
    { 
     private string _connectionString; 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      _connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["Webappconstring"].ToString(); 
     } 

     protected void Clicked(object sender, EventArgs e) 
     { 
      string email = Emailtxt.Text; 
      string password = passwordtxt.Text; 

      var mysqlAccess = new MySqlAccess(_connectionString); 
      string status = mysqlAccess.GetStatus(email, password); 

      if (status == Constants.Status.PRESIDENT || status == Constants.Status.FACULTY_MEMBER) 
      { 
       Session["Email"] = email; 
       Response.Redirect("WebForm2.aspx", true); 
      } 
      else 
      { 
       Emailtxt.Text = "invalid user"; 
      } 
     } 
    } 

    internal class MySqlAccess 
    { 
     private readonly string _connectionString; 

     public MySqlAccess(string connectionString) 
     { 
      _connectionString = connectionString; 
     } 

     public string GetStatus(string email, string password) 
     { 
      using (var conn = new MySqlConnection(_connectionString)) 
      { 
       conn.Open(); 

       string query = "SELECT Status FROM the_society_circle.society WHERE [email protected] AND [email protected];"; 
       using (var cmd = new MySqlCommand(query, conn)) 
       { 
        cmd.Parameters.AddWithValue("@Email", email); 
        cmd.Parameters.AddWithValue("@Password", password); 

        using (var reader = cmd.ExecuteReader()) 
        { 
         if (reader.HasRows && reader.Read()) 
         { 
          return reader["Status"].ToString(); 
         } 
        } 
       } 
      } 
      return string.Empty; 
     } 
    } 

    internal class Constants 
    { 
     internal class Status 
     { 
      public const string PRESIDENT = "president"; 
      public const string FACULTY_MEMBER = "faculty member"; 
     } 
    } 
} 
+0

omg .. !!感谢吨....它只是工作:) – puffles

+0

不客气。不要忘记盐+散列你的密码! – khlr

1

您设置QueryString2这个值

QueryStr2 = "Select Status from the_society_circle.society where Email = '" + QueryStr + "'"; 

它永远是你检查的值之一。

相关问题