2014-12-28 65 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 + "'"; 

它永遠是你檢查的值之一。

相關問題