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;
}

SigninPersonFirst Name、Last Name、Password などのユーザー情報を保持するクラスです。

問題はパスワードの比較にあります。それはすべてのケースを受け入れました

例えば:

データベースに保存されている誰かのパスワードが「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));

これにより、SQL Server のサーバー側ではなく、.NET フレームワークを介してクライアント側で文字列比較が強制的に行われます。


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 行だけが返されること保証されます。繰り返しますが、この実際のケースでは、ほぼ確実に 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 に答える