奇怪的是SQL Server Management Studio中的数据

ber*_*g96 2 c# sql-server asp.net

我在ASP.NET中创建一个简单的项目,并使用此代码继续登录,检测角色并打开确切的页面.

string cmdText = "SELECT Username,Role FROM Login WHERE Username = '" + TextBox1.Text + "' AND Password = '" + TextBox2.Text + "'";

string username = "";
string role = "";

using (SqlCommand SelectCommand = new SqlCommand(cmdText, connectionstring))
{
    SqlDataReader myReader;
    connectionstring.Open();

    myReader = SelectCommand.ExecuteReader();

    while (myReader.Read())
    {
        username = myReader["Username"].ToString();
        role = myReader["Role"].ToString();
    }

    myReader.Close();

    Response.Redirect(role + ".aspx");
}
Run Code Online (Sandbox Code Playgroud)

我设置它role+".aspx"是因为我在if函数中遇到了一些奇怪的错误..它无法正常工作..

但仍然有问题重定向到页面..我注意到了这一点

此搜索

因此,我对这个错误感到困惑,于是我决定检查SQL Server中的数据,并且有:

图像2

角色之后有5个空格.我试图删除它们.但是在保存数据后再次出现空间...我注意到同样的事情是名称和密码

图像3

但现在有9个空格..看起来像SQL Server Management Studio试图填写最多10个字母......

Username,password并且rolenchar(10)类型..是问题吗?

我应该改变以解决这个问题吗?或者可以通过其他方式完成

Ste*_*eve 6

nchar列中的固定长度的空间中存储其值.如果声明一个列是类型的,nchar(10)那么你的值都用空格填充,以达到10个字符的长度.
如果您可以更改架构,则将列更改为nvarchar(10)类型并且(不确定)可能需要重新编写已存在的所有值.

请参阅SQL Server中char,nchar,varchar和nvarchar之间的区别是什么?

如果您无法更改架构,则可以在代码中修剪结果

 Response.Redirect(role.Trim() + ".aspx");
Run Code Online (Sandbox Code Playgroud)

但是,看看你的代码,我发现了一个非常大的问题.您正在使用famigerate字符串连接来构建查询.这是一个众所周知的代码弱点,导致Sql Injection攻击和解析错误.
您应该使用参数修复ASAP查询

string cmdText = "SELECT Role FROM Login WHERE Username = @name AND Password = @pass";
// You already know the username
string username = textBox1.Text;
string role = "";
using (SqlCommand SelectCommand = new SqlCommand(cmdText, connectionstring))
{
    connectionstring.Open();
    SelectCommand.Parameters.Add("@name", SqlDbType.NVarChar).Value = textBox1.Text;
    SelectCommand.Parameters.Add("@pass", SqlDbType.NVarChar).Value = textBox2.Text;

    using(SqlDataReader myReader = SelectCommand.ExecuteReader())
    {
        while (myReader.Read())
        {
            role = myReader["Role"].ToString();
        }
    }
    Response.Redirect(role.Trim() + ".aspx");
}
Run Code Online (Sandbox Code Playgroud)

最后要注意的是,考虑将密码以明文形式存储在数据库中是另一个需要避免的安全漏洞.众所周知,良好的做法是在将密码存储到数据库之前对其进行哈希和加密