登錄驗證問題(頂就有分)


初學者
自己寫的登錄驗證 代碼如下,這樣有什么不好,為什么我看別人驗證代碼都寫很復雜呢?
你有最好最實用的驗證,也別忘記告訴我。送你高分哦
 
  string username = txt_username.Text;
        string password = txt_password.Text;
        SqlConnection conn = view.createCon();
        conn.Open();
        string sql = "select  count(*) from Admin where Admin='" + username + "'and AdminPwd='" + password + "'";
        SqlCommand cmd = new SqlCommand(sql, conn);
        int count = Convert.ToInt32(cmd.ExecuteScalar());
        if (count == 0)
        {
            Response.Write("用戶名密碼不對");
        }
        else
        {
           Response.Redirect("Admin_Main.aspx");
           Session["login"] = "ok";
        }
        conn.Close();
 

50 个解决方案

#1


sql 注入,如果輸入      1' or 1=1啥的..

還有就是直接這樣寫代碼,比較亂.如果在其它地方用到登陸驗證咋辦??

可以看一下三層框架.看下petshop源代碼..

#2


登陸一般用datareder給你發段

protected void ButtonLogin_Click(object sender, EventArgs e)
    {
        SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["DBConnectionString"]); //創建連接對象
        SqlCommand cmd = new SqlCommand("select * from Users where userId='" + txtUserName.Text + "'", conn); //創建查詢用戶名是否存在數據對象
        try
        {
            conn.Open();  //打開連接
            SqlDataReader sdr = cmd.ExecuteReader();
            if (sdr.Read())  //如果用戶名輸入正確
            {
                if (sdr["userPwd"].ToString() == txtPassword.Text)//密碼正確
                {
                    conn.Close();
                    Session["userID"] = txtUserName.Text.Trim();//存儲用戶名
                    Response.Redirect("AddressList.aspx");  //進入系統
                }
                else
                {
                    Response.Write("<script language=javascript>alert('您輸入的密碼錯誤!')</script>");
                }
            }
            else
            {
                Response.Write("<script language=javascript>alert('您輸入的用戶名錯誤或該用戶名不存在!')</script>");
            }
        }
        catch (System.Exception ee)
        {
            Response.Write("<script language=javascript>alert('" + ee.Message.ToString() + "')</script>");
        }
        finally
        {
            conn.Close();
        }
    }

#3


 SqlConnection conn = new SqlConnection("");
 SqlCommand cmd = new SqlCommand("select * from Admin where Admin='" + UserName.Text.Replace("'","") + "'", conn);  
 try
        {
            conn.Open();            
             SqlDataReader dr = cmd.ExecuteReader();
            if (dr.Read())  
            {
                if (dr["AdminPwd"].ToString() == txtPassword.Text)
                {
                  
                    Response.Redirect("Admin_Main.aspx");
           Session["login"] = "ok";

                }
                else
                {
                    Response.Write("<script language=javascript>alert('您輸入的密碼錯誤!')</script>");
                }
            }
            else
            {
                Response.Write("<script language=javascript>alert('您輸入的用戶名錯誤或該用戶名不存在!')</script>");
            }
           conn.Close();
        }
        catch (System.Exception ex)
        {
            Response.Write("<script language=javascript>alert('" + ex.Message+ "')</script>");
        }
        finally
        {
            conn.Close();
        }

#4


這么多高手提供了方法  偶就頂頂接點分吧

#5


我想樓主應該是個初學者,這樣寫也是我在初學時候的寫法,慢慢的隨着你的你了解的多了,你就明白是怎么回事
也就會在資源消耗.防注入.密碼加密方面有更多的了解了

#6


實際上登錄的操作都差不多了,除了要注意安全,還需要初始化自己用戶的鑒權信息

#7


其實大概的思路是先根據用戶Id查找,如果Id存在則比較密碼

#8


樓主的方法 大致也差不多了。
1、安全方面要加一些,比如:防SQL注入,可利用參數;還有驗證碼之類的。
2、你的 信息不僅要存入數據庫,還可以保存到Session、cookie中,方便調用驗證。
3、要想結構好一點,調用數據庫可單獨建一個類來操作數據庫,避免其他地方重復編寫代碼。

#9


小問題 大積累

#10


#11


頂頂~

#12


引用 1 樓 lonely7345 的回復:
sql 注入,如果輸入      1' or 1=1啥的.. 

還有就是直接這樣寫代碼,比較亂.如果在其它地方用到登陸驗證咋辦?? 

可以看一下三層框架.看下petshop源代碼..


LZ還是剛入門,你就讓他看petshop,三層架構,也太狠了點吧!呵呵!

#13


string sql = "select  count(*) from Admin where Admin='" + username + "'and AdminPwd='" + password + "'";
首先你這樣寫.我不輸入密碼即可入你的系:)

#14


引用 5 樓 mjjzg 的回復:
我想樓主應該是個初學者,這樣寫也是我在初學時候的寫法,慢慢的隨着你的你了解的多了,你就明白是怎么回事 
也就會在資源消耗.防注入.密碼加密方面有更多的了解了



說得有道理極了。

#15


頂頂``這是我用MD5加密后的登陸代碼,MD5在VS2005里面有自帶的,用起來挺方便的,而且有加密的話``也不用擔心被人看到數據庫后知道密碼```


public partial class admin_login : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void button1_Click(object sender, EventArgs e)
    {
        if (username.Text.Trim() == "")
        {
            Response.Write("<script language='javascript'>alert('用戶名不能為空!')</");
            Response.Write("script>");
        }
        else if (password.Text.Trim() == "")
        {
            Response.Write("<script language='javascript'>alert('密碼不能為空!')</");
            Response.Write("script>");
        }

        password.Text = FormsAuthentication.HashPasswordForStoringInConfigFile(this.password.Text.Trim(), "MD5");


        if ((username.Text.Trim() != "") && (password.Text.Trim() != ""))
        {
            OleDbConnection conn1 = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;" + "Data Source=" + Server.MapPath("../App_Data/com_c.mdb"));
            OleDbCommand cmdr1 = new OleDbCommand("select *  from  s where sno='" + ttt(username.Text.Trim()) + "' and mm='" + ttt(password.Text.Trim()) + "'", conn1);
            conn1.Open();
            OleDbDataReader dr1 = cmdr1.ExecuteReader();

            if (dr1.Read() && (dr1["jb"].ToString() == "B"))
            {
                Session["user1"] = username.Text.Trim();
                conn1.Close();
                Response.Redirect("kuangjia.aspx");
            }
            else
            {
                Response.Write("<script language='javascript'>alert('用戶名和密碼不對,請重新輸入!')</");
                Response.Write("script>");
                conn1.Close();
            }
        }
    }
    private string ttt(string inputSQL)
    {
        string s = inputSQL;
        s = inputSQL.Replace("'", "''");
        s = s.Replace("[", "[[]");
        s = s.Replace("%", "[%]");
        s = s.Replace("_", "[_]");
        return s;
    }
}

#16


總結一下
1、安全問題
  a)防止注入問題
    如果用戶名用 abc' --   假如abc剛好是用戶名,那么密碼就不用驗證了,因為被--給注釋掉了。
    或者用 '+Admin -- 這更狠,隨便輸入都能進了
  b)密碼明文傳輸,存儲
    口令不能以明文的方式存儲,而應該散列后存儲,驗證的時候,散列用戶密碼,如果散列值一致表示口令相符。
2、結構和習慣問題
  a)沒有采用分層結構,別的地方使用需要重新copy一次,或者重新寫一次,修改起來也麻煩。
  b)數據庫使用完畢應立即關閉,而不應該左顧右盼,浪費時間。
  c)Redirect語句按照習慣應寫在處理所有事情之后,雖然這樣也沒什么問題,但是習慣總是好的。

還有沒有別的?
    

#17


up

#18


    建議用參數吧,學習一下petshop 3.0 或者petshop 4.0,或者傳入兩個參數用儲存過程驗證:

    string username = txt_username.Text;
        string password = txt_password.Text;

        SqlConnection conn = view.createCon();
        conn.Open();
        string sql = "select  count(*) from Admin where Admin=@user and AdminPwd=@psw";
        SqlCommand cmd = new SqlCommand(sql, conn);
        SqlParameter para1=new SqlParameter("@user",username );
        cmd.Parameters.Add(para1);
        SqlParameter para2=new SqlParameter("@psw",password );
        cmd.Parameters.Add(para2);

        int count = Convert.ToInt32(cmd.ExecuteScalar());
        if (count == 0)
        {
            Response.Write("用戶名密碼不對");
        }
        else
        {
           Response.Redirect("Admin_Main.aspx");
           Session["login"] = "ok";
        }
        conn.Close();

#19


引用 9 樓 firein 的回復:
小問題 大積累

經典

#20


這東西是要慢慢積累的,寫得多了,自然就知道要注意些什么了.
我以前也是這第寫的,不過現在一般都是把它專門寫在一個類中,方便調用.

#21


你這個我感覺除了最好不要拼SQL語句以外都沒有什么問題,看你怎么寫了,根據項目的要求,
三層架構你這樣寫就沒有意義了..

#22


UP

#23


一般情況下我不會允許直接存儲密碼入數據庫,加密后在存儲,還有登錄不要拼接,會被注入的

#24


同樣是菜鳥的我,看了帖子收益

#25


樓上已經提供很多方法了
我就頂頂吧
為什么不用存儲過程驗證登陸呢.....
安全性更高喔

#26


引用 6 樓 dingjian2008 的回復:
實際上登錄的操作都差不多了,除了要注意安全,還需要初始化自己用戶的鑒權信息


健壯性差,安全更不用說了!

#27


  /// <summary>
        /// 獲取MD5加密字符串
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        static string getMd5Hash(string input)
        {
            // Create a new instance of the MD5CryptoServiceProvider object.
            MD5 md5Hasher = MD5.Create();

            // Convert the input string to a byte array and compute the hash.
            byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));

            // Create a new Stringbuilder to collect the bytes
            // and create a string.
            StringBuilder sBuilder = new StringBuilder();

            // Loop through each byte of the hashed data 
            // and format each one as a hexadecimal string.
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }

            // Return the hexadecimal string.
            return sBuilder.ToString();
        }

        protected void submit_Click(object sender, System.EventArgs e)
        {
            //Response.Write(Session["ValidateCode"].ToString());
            //Response.End();
            if (indentity.Text.Trim() == Session["ValidateCode"].ToString())
            {
                string text = username.Text.Trim().Replace("'", "''");
                text = text.Replace(">","&gt;");
                text = text.Replace("<","&lt;");
                string strSql = "select count(uid) from  Dz_Admin where [userName]='" + text + "' and [Password]='" + getMd5Hash(password.Text.Trim()) + "'";
                string Sqldb = System.Configuration.ConfigurationSettings.AppSettings["DZW2008ConnectionString2"];
                SqlCommand Mycommand = new SqlCommand();
                Mycommand.Connection = new SqlConnection(Sqldb);
                try
                {
                    Mycommand.Connection.Open();
                    Mycommand.CommandText = strSql;
                    Mycommand.ExecuteScalar();
                    if ((int)Mycommand.ExecuteScalar() == 1)
                    {
                        Session["username"] = username.Text.Trim();
                        Response.Redirect("admin_index.aspx");
                        
                        //Session["power"] = 
                        // Response.Write(username.Text.Trim());
                    }
                    else
                    {
                        Session["username"] = null;
                        ShowErr.Visible = true;
                        ShowErr.Style["color"] = "red";
                        //Response.Write(username.Text.Trim());
                        //Response.Write(password.Text);
                    }
                }
                catch (Exception ex)
                {
                   // throw (Response.Write(ex.ToString()));
                    Response.Write(ex.ToString());
                }
                finally
                {
                    Mycommand.Connection.Close();
                }

            }
            else
            {
                 ShowErr.Visible = true;
                 ShowErr.Style["color"] = "red";
                 ShowErr.Text = "驗證碼不正確!";
            }
        }

#28


引用 16 樓 hornbills 的回復:
總結一下 
1、安全問題 
  a)防止注入問題 
    如果用戶名用 abc' --  假如abc剛好是用戶名,那么密碼就不用驗證了,因為被--給注釋掉了。 
    或者用 '+Admin -- 這更狠,隨便輸入都能進了 
  b)密碼明文傳輸,存儲 
    口令不能以明文的方式存儲,而應該散列后存儲,驗證的時候,散列用戶密碼,如果散列值一致表示口令相符。 
2、結構和習慣問題 
  a)沒有采用分層結構,別的地方使用需要重新copy一次,或者重新寫一…

有學到。3q

#29


up

#30


超頂

#31


up

#32


頂一下

#33


沒安全性,
 1. 沒防注入功能(你該考慮到用戶提交的信息是否有非法字段)
 2. 沒密碼保護機制(你該考慮到對用戶的信息保密)
 3. 沒CAPTCHA測試(你該區分是人類還是電腦在對此頁面登錄)
 4. 沒惡意猜測屏蔽(你該對那些惡心猜密碼的東西進行屏蔽)

沒性能
 1. 沒防刷新功能(你該考慮到用戶在等得不耐煩的時候連續的提交)
 2. SQL語句性能低下(你該使用諸如 "select top 1 id from Admin where Admin='" + username + "'and AdminPwd='" + password + "'";  而不是去COUNT() 進行運算)
 3. 執行語句性能低下(你該使用ExecuteReader() 而不是 ExecuteScalar(),ExecuteScalar()性能其實比ExecuteReader()差, )
 4. 判斷有問題(你該通過SqlDataReader.HasRows判斷存在,而不是去讀出數據結果來判斷)
 5. 保證不用的對象立即釋放資源(你可以同過using()也可以手動銷毀)
 6. 不要使用Session(Session相當耗性能,你可以使用COOKIE,viewstats之類的)

沒穩定性
 1.不要使用Session(Session相當不穩定,而且難以管理,你可以使用COOKIE,viewstats之類的)
 

#34


學習學習。天天都有進步。哈哈

#35


主要是安全與代碼封裝

#36


           Response.Redirect("Admin_Main.aspx");
           Session["login"] = "ok";

執行不到 Session["login"] = "ok";

#37



學些

#38


請使用存儲過程 如果一定要用SQL語句 那就用參數集傳參數 不要使用COUNT(*)

#39


搜索一個存儲過程做為登陸比較好的

#40


..樓上都說干凈了,...幫頂吧

#41


學習了..

#42


登錄都差不多,注意安全就可以了

#43


可以結貼了

#44


用存儲過程,SQL用exist吧。

#45


頂! 回帖是一種美德!傳說每天回帖即可獲得 10 分可用分![color=#FF0000][/color]

#46


幫頂一下,順便學習了

#47


學習

#48


利用sql的prameters[] 來減少驗證的方面 增加安全的問題

#49


新建web群 63242231 期待高手來臨

#50


新建web群 63242231 期待高手來臨

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com