ASP.net 中的字符串比较 (C#)
本文关键字:比较 字符串 net ASP | 更新日期: 2023-09-27 18:34:41
我正在编写与 ASP.net Web服务连接的Android应用程序(C#,3.5(
android应用程序将用户的"登录"信息发送到网络服务,以验证用户是否已注册。
以下是接收请求的[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"作为密码,应用程序接受了它!(不区分大小写!!(
如何解决这个问题?
将 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。同样,在这个实际案例中,它可能不是那么相关,因为几乎肯定只有一个 - 但这是一个很好的想法,值得添加,值得注意。
问题是 SQL 不会执行区分大小写的匹配,除非已配置为这样做,有关详细信息,请参阅此处。
或者,您可以在获得匹配项后通过代码进行检查:
而不是 if (Person.Any())
,请使用以下命令:
var first = Person.FirstOrDefault();
if (first != null && first.Password == SIPerson.Password)
{
Temp = first;
}