Помогите с asp логином SQL - PullRequest
1 голос
/ 16 июля 2010

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

<%
    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?

Ответы [ 2 ]

4 голосов
/ 16 июля 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 

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

1 голос
/ 16 июля 2010

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

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

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