gpt4 book ai didi

c# - 当前上下文中不存在变量 C#

转载 作者:太空宇宙 更新时间:2023-11-03 19:48:27 25 4
gpt4 key购买 nike

我正在为登录页面在 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";
}
}

感谢您的帮助和反馈。

最佳答案

好的,这里有很多反馈。

  1. 使用 bool 值,而不是字符串!我给你换了。这里的主要问题是什么有范围。您可以在 if 之外声明变量并解决问题,但最好使用 bool 值并完全摆脱 if block ,因为它变得更具可读性。
  2. 始终将实现 IDisposable 的 Ado.Net 类型包装在 using block 中。这样,如果代码遇到异常,您的连接仍然关闭(好事)
  3. 不需要在你的sql语句中做count,只返回1。如果有用户,您会得到结果,否则不会。
  4. 切勿以明文形式存储密码!我没有碰这个,这取决于你。有许多合适的密码散列算法可供选择,例如 pbkdf2bcryptscrypt 等一些更普遍接受的安全算法。
  5. 您确定用户名是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com