用大写和小写验证密码

时间:2014-11-19 04:47:17

标签: c# asp.net

这是我的密码文本框aspx元素:

<label for="password">Password</label>
<asp:Text Box ID="User Password" runat ="server"  Text Mode ="Password" ></asp:Text Box>

这是我背后的代码

protected void LoginSubmit_Click(object sender, EventArgs e)
{
    BOL ObjectBOL = new BOL();
    BAL ObjectBAL = new BAL();
    ObjectBOL.UserName_value = UserText.Text;
    ObjectBOL.UserPassword_value = UserPassword.Text;

    try
    {

        String Login = ObjectBAL.LoginBAL(ObjectBOL);
        int i = int.Parse(Login);
        if (i > 0)
        {
            Response.Redirect("dashboard.aspx", false);
        }
        else
        {
            //UserText.Text = "";
            //UserPassword.Text = "";
            lblMsg.Text = (" Login Failed.... Try Again...");
        }
    }
    catch (Exception LoginException)
    {
        throw LoginException;
    }
    finally
    {
        ObjectBAL = null;
    }
}

当用户输入大写或小写字母的密码时,它接受该值并重定向到下一页。

 SqlCommand cmd = new SqlCommand ("select  count (*) from UserTable where User_Name='" + Login.UserName_value +
                    "'and User_Password='" + Login.UserPassword_value + "'", con);
                string str = cmd.ExecuteScalar().ToString();
                return str;

6 个答案:

答案 0 :(得分:2)

此问题有两种解决方法

  1. 更改数据库表的性质。默认SQL服务器执行更改db表所需的不区分大小写的比较。

    ALTER TABLE UserTable ALTER COLUMN User_Password VARCHAR(20) 收集Latin1_General_CS_AS

  2. 或者您可以在不更改表格的情况下,最后将 COLLATE Latin1_General_CS_AS 附加到每个查询。

      

    Latin1_General_CS_AS用于区分大小写,Latin1_General_CI_AS用于不区分大小写的比较

    how to make case sensitive comparison in SQL Server

    1. 或者您可以将您的密码转换为二进制,然后存储在db中,并比较db和用户输入的密码中的二进制内容。
    2. <强> 建议

      1. 您可以使用第一个解决方案,这将花费更少的时间。但第二种解决方案比第一种更安全。请在谷歌上阅读此内容。你会发现以明文形式直接存储密码的缺点。

      2. 如评论中所述,您的代码容易受到SQL注入攻击。请改用参数化查询

答案 1 :(得分:1)

使用COLLATE Latin1_General_CS_AS更新SQL命令查询,如下所述,将字符串与区分大小写进行比较:

SqlCommand cmd = new SqlCommand ("select  count (*) from UserTable where User_Name='" + Login.UserName_value +
                    "' and User_Password='" + Login.UserPassword_value + "' COLLATE Latin1_General_CS_AS", con);
string str = cmd.ExecuteScalar().ToString();
return str;

答案 2 :(得分:1)

所以我在这里看到一些你应该真正关注的问题,让我解决这些问题,然后我会帮你解答你提出的问题。

首先,正如@Erik Philips的评论中所提到的,您应该使用参数化查询而不是字符串连接。

其次,您确实应该使用强哈希算法对密码进行哈希处理,因此,如果/当您的数据库遭到入侵时,您不会将所有用户密码泄露给攻击者。

好的,至于手头的实际问题,你有两个选择。我见过的更常见的解决方案是根据用户名进行选择,然后比较C#代码中的散列密码,以确定用户是否应该登录。

另一种选择是在SQL中使用区分大小写的查询,在SQL Server中要求您通过COLLATE命令(查询或列)分配排序规则,或许将其分配给您想要的任何相关字符集:http://msdn.microsoft.com/en-us/library/ms144250(v=sql.105).aspx

答案 3 :(得分:1)

您只需要更改library(tidyverse) map(lst1 ~ .x %>% mutate_if(is.numeric, outlier)) 查询。无需更改表的性质以及其他任何内容。

sql

答案 4 :(得分:0)

请参考以下链接,我认为如上所述,整理是一种方法。

http://www.mytecbits.com/microsoft/sql-server/case-sensitive-search-fetching-lowercase-or-uppercase-string

答案 5 :(得分:0)

SqlCommand cmd = new SqlCommand ("select COUNT(*) from UserTable where (CAST(User_Name as varbinary(50))=cast('"+ Login.UserName_value+"' as varbinary))  and (CAST(User_Password as varbinary(50))=cast('"+Login.UserPassword_value+"' as varbinary)),con);
con.Open();
string str = cmd.ExecuteScalar().ToString();
con.Close();
return str;

试试这个会起作用