Помогите с asp логином SQL

У меня есть форма, которая переходит к следующему сценарию входа при отправке.

<%
    Dim myConnection As System.Data.SqlClient.SqlConnection
    Dim myCommand As System.Data.SqlClient.SqlCommand
    Dim requestName As String
    Dim requestPass As String
    requestName = Request.Form("userName")
    requestPass = Request.Form("userPass")
    Dim queryString As String = "SELECT COUNT(*) AS Num_Of_User FROM tblusers WHERE username='" & requestName & "' AND password='" & requestPass & "'"
    myConnection = New System.Data.SqlClient.SqlConnection("Data Source=(local);InitialCatalog=dbtest;Integrated Security=True")
    myCommand = New System.Data.SqlClient.SqlCommand(queryString, myConnection)
    myConnection.Open()
    Dim reader As System.Data.SqlClient.SqlDataReader = myCommand.ExecuteReader()
%>

Теоретически я должен получить этот Num_Of_User из SQL-запроса, и если он равен 1, то вход в систему прошел успешно. Это правильный путь? И как я могу получить значение, которое возвращает SQL?


person Liam    schedule 16.07.2010    source источник
comment
Похоже, вы используете ASP.NET, а не ASP. Это правильно?   -  person John Saunders    schedule 16.07.2010
comment
Да, это все страницы .aspx   -  person Liam    schedule 16.07.2010


Ответы (2)


Попробуйте myCommand.ExecuteScalar(), который возвращает значение из первого столбца в первой строке набора результатов — именно то значение, которое вам нужно здесь.

Кроме того, проверьте «встроенные» методы аутентификации ASP.Net — это может сэкономить вам некоторые усилия.

person Will A    schedule 16.07.2010
comment
Итак, может ли это быть правильным для получения значения: Dim rows rows = myCommand.ExecuteScalar() - person Liam; 16.07.2010
comment
Dim UserCount As Integer = DirectCast(myCommand.ExecuteScalar(), Integer) будет способ использовать это. - person Will A; 16.07.2010

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

Смотрите, произойдет, если вы введете имя пользователя как ' OR 2>1--

Вам нужно изменить, чтобы использовать параметризованный запрос.

Dim queryString As String = "SELECT COUNT(*) AS Num_Of_User FROM tblusers WHERE username=@username AND password=@password"
myConnection = New System.Data.SqlClient.SqlConnection("Data Source=(local);InitialCatalog=dbtest;Integrated Security=True")
myCommand = New System.Data.SqlClient.SqlCommand(queryString, myConnection)
myCommand.Parameters.AddWithValue("@username", requestName)
myCommand.Parameters.AddWithValue("@password", requestPass) 

Кроме того, вы не обрабатываете какие-либо исключения, которые могут быть вызваны, и не удаляете свои объекты.

Ваш код должен выглядеть примерно так.

Dim numUsers as Integer
Using myConnection as New System.Data.SqlClient.SqlConnection("Data Source=(local);InitialCatalog=dbtest;Integrated Security=True")
   Dim queryString As String = "SELECT COUNT(*) AS Num_Of_User FROM tblusers WHERE username=@username AND password=@password"
   Using myCommand as New System.Data.SqlClient.SqlCommand(queryString, myConnection)
      myConnection.Open
      myCommand.Parameters.AddWithValue("@username", requestName)
      myCommand.Parameters.AddWithValue("@password", requestPass) 
      numUsers = myCommand.ExecuteScalar()
   End Using
End Using 

Приведенный выше код гарантирует, что ваши объекты будут удалены, но не будет обрабатывать какие-либо исключения, которые могут быть вызваны.

person Chris Diver    schedule 16.07.2010
comment
Я получаю сообщение об ошибке в первой строке Using. В нем говорится: BC3016: переменная «myConnection скрывает переменную в охватывающем блоке». - person Liam; 17.07.2010
comment
Вам не нужен оператор Dim myConnection as SqlConnection. Оператор Using объявляет переменную и удаляет ее, когда она выходит за рамки, то есть после End Using. - person Chris Diver; 17.07.2010