如何从查询中获取值并将其与字符串进行比较?

时间:2014-12-28 15:45:38

标签: c# mysql asp.net

这是我的社会表的架构:

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();
            }    
        }
}

问题是if语句永远不会执行,并且它总是打印无效用户。

PS:我是网络开发的新手:D

2 个答案:

答案 0 :(得分:1)

将QueryString2设置为此值

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

它永远不会是您检查的值之一。

答案 1 :(得分: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. 您的比较失败的原因是您没有执行第二个查询。现在代码只执行一个查询并返回用户的状态。
  4. 总结一下:

    记住SQL注入和其他恶意操作。例如,看一下这篇文章:http://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx

    并且从不将密码存储为数据库中的明文。这是你应该关心的下一件事。编辑数据库以将密码存储为salted密码哈希值,然后只比较哈希值。首先,请看一下这篇文章: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=@Email AND Psswd=@Password;";
                    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";
            }
        }
    }