1

我用 WCF 创建了一个“登录”窗口窗体应用程序,如何将输入的用户名和密码发送到 WCF 并检查 SQL 中的用户名?

private void loginbt_Click(object sender, EventArgs e)
{

    string username = textBox1.Text;
    string password = textBox2.Text;

    //check username and password are not empty
    if (username.Trim().Length != 0 && password.Trim().Length != 0)
    {
        checkPassword.CustomerServiceClient service= new checkPassword.CustomerServiceClient();
        var enterPassword = service.checkPassword(username, password);

        //check input value here with WCF?

    }
}

添加时出现Index was outside the bounds of the array.异常string getUsername = enterPassword[0].name;。看起来 WCF 没有从文本框中获取输入值,即 checkPassword(null, null)。

public Customer[] checkPassword(string name, string password){
        List<Customer> customers = new List<Customer>();
        SqlConnection connection = new SqlConnection(
             "Data Source = 11111; Initial Catalog = 1111;" +
         "User ID = 1111; Password = 11111");
        connection.Open();

        SqlCommand command = new SqlCommand("select customerId, customerName, address, password, phone from Customer where customerName='"+name+"'", connection);
        SqlDataReader reader = command.ExecuteReader();
        if (reader.Read()){
            Customer newCustomer = new Customer(reader.GetString(1), reader.GetString(3));
            string correctPW = reader.GetString(3);
            if (correctPW == password)
            {
                customers.Add(newCustomer);
            }
        }
        reader.Close();
        connection.Close();
        return customers.ToArray();
}

对不起,我真的很困惑这个问题,希望你能理解我的问题,谢谢你的帮助。

4

2 回答 2

0

解决了我的问题。

是因为我使用输入用户名从sql中选择数据,所以当我输入一个不存在的用户名时,会报错。

谢谢大家。

于 2013-10-22T06:41:32.190 回答
0

服务调用不可能被执行,checkPassword(null, null)因为您在执行序列中调用Trim并进一步向上username。如果两个变量都为空,password您将在服务调用之前收到一个。NullReferenceException

我看到的一个危险信号是,您在决定进行服务调用时正在测试 和 的修剪(空白截断)版本usernamepassword但是在将它们作为参数传递给服务调用时,您继续使用未掺杂的版本。会不会是因为参数中有空格,所以服务没有按照您认为的方式运行?

您真正需要做的是在调用服务之前验证其usernamepassword。问问自己,“我的服务是否使用指定的参数值正确响应?” 问题可能出在服务上,而不是调用者。您将不得不在这里进行一些老式的调试。这是我们无法为您做的事情,所以脱掉那些袜子和鞋子,把脚弄湿!

作为旁注,您似乎正在通过网络以纯文本形式传递密码。中间人拦截这些信息并不是很困难(实际上可能很容易)。同样,我可以看到您也对 SQL 注入攻击持开放态度。知道您使用的是无参数内联 SQL,我可以告诉您我的用户名是,这将导致返回表中x' or 'a'='a的所有行。Customer我不知道这是否一定会在您的案例中导致安全漏洞,但我希望您至少可以想象这可能造成的破坏。我只提到所有这些是因为您的 WCF 似乎与安全相关。

于 2013-10-22T03:11:31.897 回答