我正在 asp.net 中为登录页面编写一些服务器端验证。
现在,我从“从头开始编写”PHP 的角度出发,正在学习并努力解决其中一些我不知道的 ASP.NET 概念。
如果输入有效,我尝试将用户名和密码变量设置为“有效”,并且我尝试使用这些变量继续登录。
我也不确定这是否是正确的做法。
protected void loginbutton_Click(object sender, EventArgs e)
{
string UsernameRegex = "[a-zA-Z]+";
string PasswordRegex = "[a-zA-Z0-9]+";
if (!Regex.IsMatch(usernametextbox.Text, UsernameRegex))
{
string UsernameCheck = "valid";
}
else
{
string UsernameCheck = "invalid";
}
if (!Regex.IsMatch(passwordtextbox.Text, PasswordRegex))
{
string PasswordCheck = "valid";
}
else
{
string PasswordCheck = "invalid";
}
if(UsernameCheck = "valid") //i will include password here after i solved the problem
{
//do something
}
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
conn.Open();
string checkuser = "select count(*) from Users where Username = @username and Password = @password";
SqlCommand com = new SqlCommand(checkuser, conn);
com.Parameters.Add("@username", SqlDbType.NVarChar).Value = usernametextbox.Text;
com.Parameters.Add("@password", SqlDbType.NVarChar).Value = passwordtextbox.Text;
int temp = Convert.ToInt32(com.ExecuteScalar().ToString());
if (temp > 0)
{
Response.Redirect("Cars.aspx");
}
else
{
loginfaillabel.Text = "Your Username or Password doesn't match our records";
}
}
感谢帮助和反馈。
最佳答案
好的,这里有很多反馈。
- 使用 bool 值,而不是字符串!我为你替换了它们。这里的主要问题是范围。您可以在 if 之外声明变量并解决问题,但最好使用 bool 值并一起删除 if block ,因为它变得更具可读性。
- 始终将实现
IDisposable
的 Ado.Net 类型包装在using
block 中。这样,如果代码遇到异常,您的连接仍然会关闭(这是一件好事) - 无需在 sql 语句中执行
count
,只需返回1
。如果有用户,您就会得到结果,否则不会。 - 切勿以明文形式存储密码!我没碰过这个,那是你的事。有许多合适的密码哈希算法可供选择,例如
pbkdf2
、bcrypt
和scrypt
等,仅举一些更普遍接受的安全算法。 - 您确定用户名是 Unicode 吗?如果没有,请将
SqlParameter
类型中的参数类型更改为VarChar
。
修改后的代码
protected void loginbutton_Click(object sender, EventArgs e)
{
string UsernameRegex = "[a-zA-Z]+";
string PasswordRegex = "[a-zA-Z0-9]+";
boolean isUsernameValid = Regex.IsMatch(usernametextbox.Text, UsernameRegex)
boolean isPasswordValid = Regex.IsMatch(passwordtextbox.Text, PasswordRegex);
if(!isUsernameValid || !isPasswordValid) //i will include password here after i solved the problem
{
//do something
}
else
{
const string checkuser = "SELECT 1 FROM Users WHERE Username = @username and Password = @password";
using(SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString))
using(SqlCommand com = new SqlCommand(checkuser, conn))
{
conn.Open();
com.Parameters.Add("@username", SqlDbType.NVarChar).Value = usernametextbox.Text;
com.Parameters.Add("@password", SqlDbType.NVarChar).Value = passwordtextbox.Text;
object temp = com.ExecuteScalar();
// I do not remember if it is null or System.DbNull.Value that is returned if nothing is returned
// you will have to test it
var didUserMatch = temp == null || temp == System.DbNull.Value ? false : true;
if (didUserMatch)
{
Response.Redirect("Cars.aspx");
}
else
{
loginfaillabel.Text = "Your Username or Password doesn't match our records";
}
}
}
}
关于c# - 当前上下文中不存在变量 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42584650/