0

次のメソッドを持つ WebService があります。

    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    [WebMethod]
    public string Login(string passwort, string email, string firma)
    {
        return LoginHelper.Login(passwort, email, firma);
    }

私の LoginHelper コード:

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;

namespace WebService1
{
    public class LoginHelper
    {
        public static string Login(string passwort, string email, string firma)
        {
            string userName = "";

            SqlConnection con = new SqlConnection(@"Data Source=Yeah-PC\SQLEXPRESS;Initial Catalog=works;Integrated Security=true;");

        SqlCommand cmd = new SqlCommand(@"SELECT firma FROM TestData 
                                  WHERE email = @email", con);
        cmd.Parameters.AddWithValue("@email", email);

        con.Open();

        SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
      {
   //userName += dr["email"].ToString();
   //userName += dr["passwort"].ToString();
   userName += dr["firma"].ToString();
     }
    dr.Close();
    con.Close();
    return userName;
        }



    }
}

助けてくれてありがとう

質問を編集しました。そのソリューションは現在安全ですか? つまり、SQL インジェクションに反対します。私がより良くできることはもっとありますか?

4

5 に答える 5

6

あなたが呼んでいる LoginHelper.Login(passwort, email, firma);

しかし、あなたの方法では

public static string Login(string email, string passwort, string firma)

email は最初のパラメーターです。

実際にはメールパラメーターにパスワードがあるため、結果が返されません

以下のようにloginメソッドを変更しますLoginHelper

public static string Login(string passwort, string email, string firma)
{
    string userName = "";

    using (SqlConnection con = new SqlConnection(@"Data Source=Yeah-PC\SQLEXPRESS;Initial Catalog=works;Integrated Security=true;"))
    using(SqlCommand cmd = new SqlCommand(@"SELECT firma FROM TestData WHERE email = @email", con))
    {
        cmd.Parameters.AddWithValue("@email", email);
        con.Open();
        using (SqlDataReader rdr = cmd.ExecuteReader())
        {
            while (rdr.Read())
            {
                if (rdr["firma"]  != DBNull.Value)
                {
                    userName += rdr["firma"].ToString();
                }

            }
        }
    }

    return userName;
}
于 2012-05-30T15:07:15.343 に答える
3

メール アドレスに @ 文字が含まれている場合、それが問題である可能性があります。@ は、SQLCommand のパラメーター マーカーです。あなたの電子メール アドレスの後半部分が sql パラメーターであると考えられます。パラメータを使用して電子メール アドレスを渡す必要があります。これにより、SQL インジェクションからも保護されます。Akatakritos's answer には、メールをパラメーターとして渡す方法の例があります。

于 2012-05-30T15:12:19.653 に答える
1

また、セキュリティとパフォーマンス上の理由から、SqlParameters を使用する必要があります。SQL インジェクション攻撃について調べてください。

string userName = "";

SqlConnection con = new SqlConnection(@"Data Source=Yeah-PC\SQLEXPRESS;Initial Catalog=works;Integrated Security=true;");

SqlCommand cmd = new SqlCommand(@"SELECT firma FROM TestData 
                                  WHERE email = @email" con);
cmd.Parameters.AddWithValue("@email", email);

con.Open();

SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
   //userName += dr["email"].ToString();
   //userName += dr["passwort"].ToString();
   userName += dr["firma"].ToString();
}
dr.Close();
con.Close();
return userName;
于 2012-05-30T15:11:18.223 に答える
0

他の回答とコメントごと。

セキュリティ上の問題があります。ORM (Entity Framework/NHibernate/etc...) を使用しない場合は、パラメーター化されたクエリを使用してください。

問題の解決:

  • データベースにデータはありますか?
  • 正しいデータベースを指していますか?
  • あなたのSQLは正しいですか?
  • SQL は実行されていますか?
  • SQL Profiler を実行し、どの SQL が実行されているかを確認してから、SQL Management Studio でテストします
于 2012-05-30T15:09:05.173 に答える
0

コードでパラメーターを渡す代わりに、Sqlparameter を使用してパラメーターを追加してみてください。パラメータを追加するには、SQL パラメータを使用することをお勧めします。 また、デバッグによってメールの値を確認することもできます....正しい情報を渡しているかどうか。

        SqlConnection conn = new SqlConnection(connectionString);
        conn.Open();
        SqlCommand cmd = new SqlCommand(@"SELECT firma FROM TestData 
                              WHERE email = @email" conn);
        cmd.Parameters.AddWithValue("@email", email);                     
        cmd.Prepare();
        cmd.ExecuteNonQuery();
        SqlDataReader dr = cmd.ExecuteReader();
        while (dr.Read())
            {                  
               userName += dr["firma"].ToString();

            }
        dr.Close();
        conn.Close();
于 2012-05-30T15:11:51.373 に答える