我正在 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 函数中遇到了一些奇怪的错误..它没有正常工作..
但是在重定向到页面时仍然有问题..我注意到了这一点
所以,被这个错误弄糊涂了,我决定检查 SQL Server 中的数据,结果是这样的:
角色后面有5个空格..我试着删掉了。但是保存数据后,空格再次出现。我注意到名称和密码也是一样
但现在有 9 个空格.. 看起来 SQL Server Management Studio 正在尝试填充最多 10 个字母...
Username
、password
和 role
是 nchar(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/