Что не так в этом запросе TSQL? - PullRequest
0 голосов
/ 08 февраля 2011
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Literal1.Text = Request.QueryString("Pno")
    On Error Resume Next
    Dim SQLData As New System.Data.SqlClient.SqlConnection("workstation id=ws.example.com;packet size=4096;user id=some-user;pwd=some-password;data source=mssql.example.com;persist security info=False;initial catalog=some-db")
    Dim cmdSelect As New System.Data.SqlClient.SqlCommand("SELECT * FROM a1_ticket WHERE PNR_no ='" & Literal1.Text & "'", SQLData)
    SQLData.Open()
    Dim dtrReader As System.Data.SqlClient.SqlDataReader = cmdSelect.ExecuteReader()
    If dtrReader.HasRows Then
        While dtrReader.Read()
            Literal2.Text = dtrReader("bus_type")
            Literal3.Text = dtrReader("dep_time")
            Literal4.Text = dtrReader("PRN")
            Literal5.Text = dtrReader("fro_m")
            Literal6.Text = dtrReader("seat_opt")
            Literal7.Text = dtrReader("Ticket_no")
            Literal8.Text = dtrReader("t_o")
            Literal9.Text = dtrReader("taxes")
            Literal10.Text = dtrReader("Travels")
            Literal11.Text = dtrReader("journey_date")
            Literal12.Text = dtrReader("net_pay")
            Literal13.Text = dtrReader("name")
            Literal14.Text = dtrReader("seat_opt")
            Literal15.Text = dtrReader("sel_seat")
            Literal16.Text = dtrReader("bd_point")
        End While
    Else
    End If
    Dim cmd As New System.Data.SqlClient.SqlCommand("SELECT * FROM a1_vendors WHERE UserId ='" & Request.QueryString("tid") & "'", SQLData)
    cmd.ExecuteScalar()
    Literal17.Text = dtrReader("travels")
    Literal18.Text = dtrReader("Contactno")
    SQLData.Close()
    dtrReader.Close()
    SQLData.Close()
End Sub

Ответы [ 2 ]

6 голосов
/ 08 февраля 2011

Что не так с этим запросом?Он просит атаку SQL-инъекцией.

См .:

Dim cmd As New SqlCommand(
   "SELECT * FROM a1_vendors WHERE UserId ='" & 
   Request.QueryString("tid") & "'", SQLData)

Что если Request.QueryString("tid") содержит значение "'' GO DROP TABLE a1_vendors GO SELEC ''"

Внезапно ваша команда становится "SELECT * FROM a1_vendors WHERE UserId = '' GO DROP TABLE a1_vendors GO SELECT '' "

3 голосов
/ 08 февраля 2011

I ожидаю вы имеете в виду второе, где вы SELECT * но ExecuteScalar;ExecuteScalar возвращает только одно значение (как результат) - и оно не обновляет читателя, поэтому Literal17 / Literal18 получают свои значения из ниоткуда.

Следуя существующему шаблону, он долженбыть что-то вроде:

' caveat: this is **not** intended as a perfect example; this intentionally
' uses the same pattern as the question; see below for notes
dtrReader = cmd.ExecuteReader()
If dtrReader.Read()
    Literal17.Text = dtrReader("travels")
    Literal18.Text = dtrReader("Contactno")
End If

что более важно, хотя

  • без разделения;все от управления строкой соединения, учетных данных (спасибо за это, кстати), доступа к данным и пользовательскому интерфейсу обрабатывается прямо в Page_Load событии, сам причина сильного скрежета зубов
  • подвержен SQL-инъекции
  • нет using (или эквивалент VB), чтобы гарантировать детерминированную очистку, а не ожидание при сборке мусора (в неизбежном событии исключений)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...