c# - 奇怪的是 SQL Server Management Studio 中的数据

标签 c# asp.net sql-server

我正在 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");
}

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

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

image1

所以,被这个错误弄糊涂了,我决定检查 SQL Server 中的数据,结果是这样的:

image2

角色后面有5个空格..我试着删掉了。但是保存数据后,空格再次出现。我注意到名称和密码也是一样

image3

但现在有 9 个空格.. 看起来 SQL Server Management Studio 正在尝试填充最多 10 个字母...

Usernamepasswordrolenchar(10) 类型。这是问题所在吗?

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

最佳答案

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

参见 What is the difference between char, nchar, varchar, and nvarchar in SQL Server?

如果您不能更改模式,那么您可以在代码中修剪结果

 Response.Redirect(role.Trim() + ".aspx");

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

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

最后要注意的是,将密码以明文形式存储在数据库中是另一个需要避免的安全漏洞。一个众所周知的好做法是 hash and salt a password在将其存储到数据库之前

关于c# - 奇怪的是 SQL Server Management Studio 中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39934034/

相关文章:

c# - Thread.Sleep 还是 Thread.Timer 挂系统?

C# XML 读取 foreach 总是第一个值

c# - 通过 C# silverlight 将动画重复行为设置为永远

asp.net - 将 ASP.NET 身份存储移动到 EF Sql 数据库

asp.net - 通过 Web 界面查看事件日志

sql-server - 将单个列连接到逗号分隔的列表中

c# - 图数据结构 C# 的问题

c# - 防止没有协议(protocol)的URL变成相对URL

sql - 如何从连接表 SQL 的列中排除另一个值

sql-server - 有没有一种方法可以从一个到另一个使用 FK 批量插入到两个表中?