5

我正在编写与 ASP.net Web 服务 (C#,3.5) 连接的 Android 应用程序

android 应用程序将用户的“登录”信息发送到 Web 服务以验证用户是否已注册。

这是[WebMethod]接收请求的:

[WebMethod]
public SigninPerson signin(SigninPerson SIPerson)
{
    SigninPerson Temp = new SigninPerson(0, "", "", "", "");
    LinqToSQLDataContext DataBase = new LinqToSQLDataContext();
    var Person = (from a in DataBase.Persons
                  where a.Email == SIPerson.E_Mail &&
                      a.Password.Equals(SIPerson.Password,StringComparison.Ordinal)
                  select new SigninPerson
                  {
                      Person_Id = a.Person_Id,
                      F_Name = a.First_Name,
                      L_Name = a.Last_Name,
                      E_Mail = a.Email,
                      Password = a.Password
                  });
    if (Person.Any() == true)
    {
        Temp = Person.FirstOrDefault();
    }
    return Temp;
}

SigninPerson是一个保存用户信息的类,如名字、姓氏、密码......

问题在于密码比较。它接受了所有案件

例如:

如果存储在数据库中的某人的密码是“ABD”,并且用户输入“abd”作为密码,则应用程序接受它!(不区分大小写 !!!)

如何解决这个问题呢?

4

2 回答 2

4

将您的 LINQ 更改为:

var Person = (from a in DataBase.Persons
              where a.Email == SIPerson.E_Mail
              select new SigninPerson
              {
                  Person_Id = a.Person_Id,
                  F_Name = a.First_Name,
                  L_Name = a.Last_Name,
                  E_Mail = a.Email,
                  Password = a.Password
              })
              .ToList()
              .Where(sp => sp.Password.Equals(SIPerson.Password));

这将强制字符串比较发生在客户端,通过 .NET 框架,而不是 SQL Server 上的服务器端。


正如 andleer 所说,还有另一种可能更有效的方法。现在,在实践中你不太可能看到这一点,但这是一个养成的好习惯。你实际上可以这样做:

var Person = (from a in DataBase.Persons
              where a.Email == SIPerson.E_Mail
              select new SigninPerson
              {
                  Person_Id = a.Person_Id,
                  F_Name = a.First_Name,
                  L_Name = a.Last_Name,
                  E_Mail = a.Email,
                  Password = a.Password
              })
              .Take(1)
              .AsEnumerable()
              .Where(sp => sp.Password.Equals(SIPerson.Password));

应该确保它永远不会返回所有行,而只会返回 1 行。同样,在这种实际情况下,它可能并不那么相关,因为几乎可以肯定只有一个行 - 但这是一个很好的想法,值得一提。

于 2013-10-10T13:03:12.570 回答
1

问题是 SQL 不会执行区分大小写的匹配,除非它已被配置为这样做,请参阅此处了解更多信息

或者,您可以在匹配后通过代码进行检查:

而不是if (Person.Any()),使用这个:

var first = Person.FirstOrDefault();
if (first != null && first.Password == SIPerson.Password)
{
    Temp = first;
}
于 2013-10-10T13:04:49.293 回答