ユーザにテキストボックス等で入力させた値を、SQLに使用する際には、SQLインジェクション対策が必要になります。
クエリ文字列に関してもユーザが手入力する可能性があるので、対策が必要です。
①SqlParameterを使用する
SqlParameterを使用することで、SQLインジェクション攻撃を防ぐことができます。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim cn As New SqlConnection()
cn.Open()
Dim sql As String = "SELECT * FROM TABLENAME WHERE UserID=@id"
Dim cmd As New SqlCommand(sql, cn)
cmd.Parameters.Add("@id", SqlDbType.VarChar).Value = Me.TextBox1.Text
Dim adapter As New SqlDataAdapter(cmd)
Dim ds As New DataSet
adapter.Fill(ds)
MessageBox.Show(ds.Tables(0).Rows(0)(0))
End Sub
②サニタイジングする
入力値の'(シングルクォーテーション)を''(シングルクォーテーション2つ)にします。
入力値の(セミコロン)を削除します。
''' <summary>
''' SQLをサニタイジングする。
''' </summary>
''' <param name="value"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function SanitizeSQL(ByVal value As String) As String
Dim ret As String = value.Replace("'", "''")
ret = ret.Replace("", "")
Return ret
End Function
入力値をSQLに組み込む際にサニタイジングします。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim cn As New SqlConnection()
cn.Open()
Dim sql As String = "SELECT * FROM TABLENAME WHERE UserID='" & SanitizeSQL(Me.TextBox1.Text) & "'"
Dim adapter As New SqlDataAdapter(sql, cn)
Dim ds As New DataSet
adapter.Fill(ds)
MessageBox.Show(ds.Tables(0).Rows(0)(0))
End Sub