2014-09-14 2 views
1

у меня была путаница с моим кодом:Проверка учетных данных из базы данных

Dim sqladapter As SqlDataAdapter = New SqlDataAdapter() 
Dim sqlcmd As SqlCommand = New SqlCommand() 
sqlcmd = New SqlCommand("SELECT login, pass from Table1 where login=" & login.Text & "and pass='" & password.Text.ToString() & "';", connect) 
Dim dr As SqlDataReader = sqlcmd.ExecuteReader() 
Dim dt As DataTable = New DataTable() 
dt.Load(dr) 
If (dt.Rows.Count = 1) Then 
'Display welcome page or do some action here. 

Теперь мой вопрос, есть ли другой способ сделать Rows.Count == 1. Я чувствую, что это очень неправильно и не имеет смысла.

Как вы проверяете из базы данных, что пользователь имеет только одну действительную запись в таблице, отличную от подсчета строк.

Заранее спасибо :)

(Пожалуйста, спросите меня, прежде чем сообщать вопрос)

+0

http://stackoverflow.com/questions/332365/how-does-the-sql- инъекции из-bobby-tables-xkcd-comic-work – Plutonix

+0

Ваш код уязвим для инъекций, вы должны использовать [параметризованные запросы] (http://stackoverflow.com/questions/542510/how-do-i- Create-A-параметризированный-SQL-запрос-почему-РЕКОМЕНДУЕМЫМ-I). –

+2

Я думаю, что инъекция - это не единственная проблема, если вы храните незашифрованные пароли ... –

ответ

2

У вас есть две проблемы: одна называется Sql Injection, и у вас уже есть многочисленные ссылки, которые объясняют, почему это действительно плохо. Еще один - это пароль обычного текста, хранящийся в вашей базе данных. Это серьезная проблема безопасности, потому что каждый, у кого есть возможность посмотреть вашу базу данных, может видеть пароли ваших пользователей. (Гравитация этого, конечно, связана с природой вашего приложения, но не может быть преуменьшена) See this link для ответа на вопрос о том, как хэш-строку (пароль) и получить ее зашифрованную версию для хранения в базе данных вместо простой текст.

Наконец, код, который вы используете, можно изменить, чтобы избежать как SqlDataAdapter, так и DataTable.
Просто используйте ExecuteScalar против IF EXIST запроса, возвращать только 1, если пользователь/пароль существует или равен нулю, если не

Dim cmdText = "IF EXISTS(SELECT 1 FROM Table1 WHERE login = @log AND pass = @pwd) " & _ 
       "SELECT 1 ELSE SELECT 0" 
using connect = new SqlConnection(connectionstring) 
using sqlcmd = New SqlCommand(cmdText, connect) 
    connect.Open() 
    sqlcmd.Parameters.AddWithValue("@log", login.Text) 
    sqlcmd.Parameters.AddWithValue("@pwd", password.Text) ' <- Subst with a call to an hash function 
    Dim exists = Convert.ToInt32(sqlcmd.ExecuteScalar()) 
    if exists = 1 Then 
     'Display welcome page or do some action 
    else 

    end if 
End Using 
End Using 
+0

Спасибо @steve. Я очень ценю вашу помощь. Бог благослови тебя! –

0

Существует только один способ ответить на этот вопрос, и его считать строки. Другим решением было бы подсчет их в базе данных. Например, вы можете написать хранимую процедуру, которая принимает имя пользователя и пароль и возвращает логическое значение таким образом, что вы перетаскиваете меньше данных.

В качестве побочного примечания в вашем коде имеется потенциальная инъекция sql. Вы не должны хранить четкий пароль в базе данных. Вы должны вернуть всю строку и сопоставить хэш пароля из базы данных с хэшем паза, который вы получаете из пользовательского интерфейса.