[英]String Comparsion in ASP.net (C#)
我正在編寫連接ASP.net Web服務(C#,3.5)的Android應用程序
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。同樣,在這種實際情況下,它可能並不重要,因為幾乎肯定只有一個-但這是一個不錯的想法,值得一提。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.