1

ユーザー行から列データを抽出するにはどうすればよいですか? 例: これは、クライアントがログインしたときに WCF サーバーで呼び出されます。 var xx = ds.Tables[0].Rows[1]; クライアント側でエラーをスローする場所。基本的に、データベースでユーザー/パスを検証しようとしています。次に、サブスクリプションの有効期限が切れる DateTime をクライアントに返します。

public bool Authenticate(string userId, string password, out string token)
    {
        token = "";

        string MyConnectionString = "Server=localhost;Database=testdb;Uid=root;Pwd=admin;";
        MySqlConnection sqlCon = new MySqlConnection(MyConnectionString);
        sqlCon.Open();

        MySqlCommand cmd = sqlCon.CreateCommand();
        cmd.CommandText = "SELECT * FROM table1 WHERE username = '"+userId+"' AND password = '"+password+"'";
        MySqlDataAdapter adap = new MySqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        adap.Fill(ds);


        if (ds.Tables[0].Rows.Count > 0)
        {
            token = Guid.NewGuid().ToString();
            var xx = ds.Tables[0].Rows[0];


            CustomDataSource.AddUserData(token, userId);

            return true;
        }

        return false;
    }
4

3 に答える 3

2

クエリは1行だけを返すと思います(正しいパスワードを持つユーザーが見つかった場合)

その場合、返された最初の行から日付を取得します(インデックスゼロ)。
また、日付は5番目の列(インデックス4)に格納されていると思いますが、そうでない場合は、正しい列を指すように2番目のインデックスを調整する必要があります。(基本配列インデックスは常にゼロです)

if (ds.Tables[0].Rows.Count > 0)
{
    token = Guid.NewGuid().ToString();
    var xx = ds.Tables[0].Rows[0][4];
    CustomDataSource.AddUserData(token, userId);
    return true;
}

そうは言っても、このコードの大きな問題を指摘させてください。
このコードは、おそらくユーザーが入力した文字列を連結して、データベースエンジンに渡されるSQLテキストを形成するため、 SQLインジェクション攻撃に簡単に使用できます。代わりに、SQLインジェクションの問題とユーザーテキストの引用(アポストロフィ付きのパスワード?)を回避するためにパラメーターを使用する必要があります。

    using(MySqlConnection sqlCon = new MySqlConnection(MyConnectionString))
    {
        sqlCon.Open();
        MySqlCommand cmd = sqlCon.CreateCommand();
        cmd.CommandText = "SELECT * FROM table1 WHERE username = ?user AND password = ?pwd";
        cmd.Parameters.AddWithValue("?user", userId);
        cmd.Parameters.AddWithValue("?pwd", password);
        using(MySqlDataAdapter adap = new MySqlDataAdapter(cmd))
        {
            DataSet ds = new DataSet();
            adap.Fill(ds);
        }
    }
于 2012-11-08T23:46:40.700 に答える
0

var xx = ds.Tables [0] .Rows [0] .ItemArray [5];

方法です。

于 2012-11-08T23:46:29.073 に答える
0

foreachループを使ってみる

foreach (DataRow row in ds.Tables[0].Rows) 
{
    var xx = row[1];
    var x = row[5];

    // other codes

    return true;
}

もう1つ、回避するためにクエリをパラメーター化しましたSQL injection

using(MySqlConnection sqlCon = new MySqlConnection(MyConnectionString))
{
    using (MySqlCommand cmd = new MySqlCommand())
    {
        cmd.Connection = sqlCon;
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "SELECT * FROM table1 WHERE username = @user AND password = @pass";
        cmd.Parameters.AddWithValue("@user", userId);
        cmd.Parameters.AddWithValue("@pass", password);
        using (MySqlDataAdapter adap = new MySqlDataAdapter(cmd))
        {
            try
            {
                DataSet ds = new DataSet();
                adap.Fill(ds);
            }
            catch (MySqlException e)
            {
                // do something with the exception
                // don't hide it!
            }
        }
    }
}
于 2012-11-08T23:51:14.137 に答える