Создание формы входа в систему с помощью Visual Studio - PullRequest
0 голосов
/ 23 июня 2011

Я новичок в Visual Studio 2010 и пытаюсь создать форму для входа.

У меня есть этот код.

        OdbcConnection con = new OdbcConnection("host=localhost;usr=root;password=admin;db=timekeeping;");
        OdbcCommand cmd = new OdbcCommand("SELECT * FROM receptionist WHERE username = '" + username_login.ToString() + "' AND password = '" + password_login.ToString() + "';");
        cmd.Connection = con;
        con.Open();
        OdbcDataReader reader = cmd.ExecuteReader();
        while (reader.Read())
        {
            if (reader.GetString(0) != 1)
            { return false; }
            else
            { return true; }
        }
        cmd.Connection.Close();
        reader.Dispose();
        cmd.Dispose();

Есть ошибки, но я не знаю, в чем проблема с этим. Вот скриншот:

enter image description here

Надеясь, что кто-то может мне помочь ..

Спасибо

Ответы [ 5 ]

3 голосов
/ 23 июня 2011

Ваш код уязвим для SQL-инъекций . Никогда не используйте конкатенации строк при построении ваших запросов SQL. Вместо этого используйте параметризованные запросы:

public bool IsValid(string username, string password)
{
    using (var conn = new OdbcConnection("host=localhost;usr=root;password=admin;db=timekeeping;"))
    using (var cmd = conn.CreateCommand())
    {
        conn.Open();
        cmd.CommandText = "SELECT count(*) FROM receptionist WHERE username = @username AND password = @password;";
        cmd.Parameters.AddWithValue("@username", username);
        cmd.Parameters.AddWithValue("@password", password);
        var count = (long)cmd.ExecuteScalar();
        return count > 0;
    }
}

, а затем позвоните так:

bool isValid = IsValid(username_login.ToString(), password_login.ToString());

Также, если вы используете SQL Server, вам лучше использовать SqlConenction вместо драйвера ODBC.

2 голосов
/ 23 июня 2011

Вы не можете сравнить строку с int, который вы пытаетесь здесь: if (reader.GetString(0) != 1)

Вы можете использовать GetInt32:
http://msdn.microsoft.com/en-us/library/system.data.odbc.odbcdatareader.getint32.aspx

И вы не должнысоздайте свой SQL, как это, но используйте параметры вместо простого построения строки.При таком способе построения кода SQL вы уязвимы для внедрения SQL.

0 голосов
/ 23 июня 2011
if (reader.GetString(0) != "1")            
    { return false; }            
else            
    { return true; }

Попытка сравнить int и string не сработает.Вы также можете сделать

if (Convert.ToInt32(reader.GetString(0)) != 1)            
    { return false; }            
else            
    { return true; }

Однако в некоторых случаях это может не сработать.Кроме того, я бы предпочел использовать GetSqlString и преобразовать его вместо GetString, потому что у меня было слишком много проблем с null s, когда я кодировал.

0 голосов
/ 23 июня 2011

Замените в своем коде эту строку

if (reader.GetString(0) != 1)

на

if (int.Parse(reader.GetString(0)) != 1)

Second,

В вашем методе userLogin () вы пытаетесь вернуть значениетогда как тип повторного обращения недействителен.Измените тип возврата.

0 голосов
/ 23 июня 2011

Ну, сообщение об ошибке довольно OdbcDataReader.GetString возвращает строку, а не int. Поэтому вы не можете сравнить это. См. MSDN

Вы, вероятно, хотите проверить его длину? if (reader.GetString(0).Length != 1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...