簡體   English   中英

ASP.net(C#)中的字符串比較

[英]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。同樣,在這種實際情況下,它可能並不重要,因為幾乎肯定只有一個-但這是一個不錯的想法,值得一提。

問題是,除非配置了SQL,否則SQL不會執行區分大小寫的匹配, 有關更多信息請參見此處

另外,您也可以在匹配后通過代碼進行檢查:

代替if (Person.Any()) ,請使用以下命令:

var first = Person.FirstOrDefault();
if (first != null && first.Password == SIPerson.Password)
{
    Temp = first;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM