asp.net - 数据库登录系统的语法错误

标签 asp.net web-services syntax-error login-script

创建了一个网站登录系统,但是当我运行它时,它不断向下面的特定编码位提出此错误。有人可以帮我解决这个特定代码上的错误消息吗:

System.Data.SqlClient.SqlException: Incorrect syntax near the keyword 'user'.



代码:
  public static User LoginUser(string login, string password)
    {
        //Check if user exists
        string query = string.Format("SELECT COUNT(*) FROM TeesDB.dbo.user WHERE name = '{0}'",
         login);
        command.CommandText = query;

        try
        {
            conn.Open();
            int amountOfUsers = (int) command.ExecuteScalar();

            if(amountOfUsers == 1)
            {
                //User exists, check if the password match
                query = string.Format("SELECT password FROM users WHERE name = '{0}", login);
                command.CommandText = query;
                string dbPassword = command.ExecuteScalar().ToString();


                if (dbPassword == password)
                {
                    //password match. Login and password data are known to us.
                    //retrieve further user data from the database
                    query = string.Format("SELECT email, user_type FROM users WHERE name =
                      '{0}'", login);
                    command.CommandText = query;

                    SqlDataReader reader = command.ExecuteReader();
                    User user = null;

                    while (reader.Read())
                    {
                        string email = reader.GetString(0);
                        string type = reader.GetString(1);

                        user = new User(login, password, email, type);
                    }
                    return user;
                }
                else
                {

                    //passwords do not match
                    return null;

                }

            }
            else
            {

                //user exists
                return null;

            }
        }
        finally
        {

            conn.Close();
         }
       }
      }
     }

最佳答案

发生这种情况是因为 USER 是保留关键字。要在查询中引用它,您需要将单词封装在方括号之间

 string query = string.Format("SELECT COUNT(*) FROM [user] WHERE name = .....

但是此时,为什么在后续查询中使用名称 users ?这只是第一个查询或下一个查询中的错字?

但是,您还应该记住,以这种方式格式化查询的字符串非常糟糕。
您面临 Sql 注入(inject)的风险,如果您的文本值中出现单引号,则整个查询将导致无效语法

作为替换查询的参数化查询示例
 string query = "SELECT COUNT(*) FROM [user] WHERE name = @name",
 command.CommandText = query;
 command.Parameters.AddWithValue("@name",login);
 int amountOfUsers = (Convert.ToInt32(command.ExecuteScalar());
 if(amountOfUsers > 0)
 {
    .....
 }

然后下一个问题是从数据库中检索密码并与用户输入进行比较。拥有这种代码意味着密码以明文形式存储在数据库中。明显的安全风险。您应该以加密形式存储密码。当您需要检查用户凭据时,您将相同的加密算法应用于用户输入并检查数据库中的密码。

您可以在一次操作中完成此操作
 string cryptPwd = EncryptPassword(password);
 string query = "SELECT COUNT(*) FROM [user] WHERE name = @name and password = @cryptpwd",
 ....

关于asp.net - 数据库登录系统的语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22735869/

相关文章:

c# - 占位符外的母版页内容

django - 是否应该捕获来自 HTTP 参数问题的不可恢复异常?

java - "JAX-RS MessageBodyWriter not found for media type=application/json"执行 jar 但 mvn :exec works

java - 如何知道 Web 服务调用中的连接是否通过 HTTPS?

python - Django haystack 语法错误

javascript - 语法错误: Unexpected Token '<' <DOCTYPE html>

typescript - 如何修复未声明的 "error: bundling failed: SyntaxError: { path }\PinCode\index.ts: Exporting local "IPinCodeParams"。"在 React-Native 中?

asp.net - "correct"多语言支持的使用方式

asp.net - global.asax 断点未命中

asp.net - 返回null时,如何检索HttpContext属性?