ESTA CLASSE ESTA BOA OU FALTA ALGO IMPORTANTE?
Prezados colegas!
Peço a ajuda dos colegas,para opinar sobre o seguinte:
1.) Eu criei a classe de acesso a Bases de dados abaixo para utilizar nos meus projetos .NET.Gostaria de saber,se ela tem algum defeito ou se falta
algo importante que não coloquei .
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Imports System.Data.OleDb
Public Class ClFontedeDados
#Region [Ô]Declaração de variáveis para manipulação da Fonte de Dados[Ô]
[ô]Declara variáveis
Dim Con As OleDbConnection
Dim StringDeConexao As String
Dim Ada As OleDbDataAdapter
Dim Ds As DataSet
Dim Dr As OleDbDataReader
Dim Dt As DataTable
Dim Cmd As OleDbCommand
#End Region
#Region [Ô]Construtor[Ô]
Public Sub New()
[ô]------------------------
[ô]Define String de conexão
[ô]------------------------
[ô]Lê String de conexão do arquivo [ô]App.Config[ô]
[ô]StringDeConexao = System.Configuration.ConfigurationSettings.AppSettings([Ô]AppConexao[Ô])
End Sub
#End Region
Public Function Conectar() As Boolean
Try
[ô]-------------------------------
[ô]Cria objeto conexão (Ms-Access)
[ô]-------------------------------
Con = New OleDbConnection(StringDeConexao)
[ô]----------------
[ô]Verifica conexão
[ô]----------------
Select Case Con.State
Case Is = ConnectionState.Closed
[ô]Abre conexão
Con.Open()
Case Else
End Select
[ô]Retorna
Return True
Catch ex As Exception
[ô]Desaloca recurso
Con.Dispose()
[ô]Retorna
Return False
End Try
End Function
Public Function Desconectar() As Boolean
Try
Select Case Con.State
Case Is = ConnectionState.Open
[ô]Fecha conexão
Con.Close()
Case Else
End Select
[ô]Retorna
Return True
Catch ex As Exception
[ô]Retorna
Return False
Finally
[ô]Descarta objeto
Con.Dispose()
End Try
End Function
Public Function PesquisarDataSet(ByVal Instrucao_Sql As String) As DataSet
Try
Select Case Conectar()
Case Is = True
[ô]Criar objeto
Ds = New DataSet
[ô]Criar DataAdapter
Ada = New OleDbDataAdapter(Instrucao_Sql, Con)
[ô]Trasfere dados para DataTable
Ada.Fill(Ds)
[ô]Desconectar
Desconectar()
[ô]Returna valor
Return Ds
Case Else
[ô]Returna valor
Return Nothing
End Select
Catch ex As Exception
[ô]Returna valor
Return Nothing
[ô]Desconectar
Desconectar()
Finally
[ô]Descarta objetos da memória
Ds.Dispose()
Ada.Dispose()
End Try
End Function
Public Function PesquisarDataReader(ByVal InstrucaoSql As String) As OleDbDataReader
Try
Select Case Conectar()
Case Is = True
[ô]Cria objeto de Comando
Cmd = New OleDbCommand(InstrucaoSql, Con)
[ô]Define tipo
Cmd.CommandType = CommandType.Text
[ô]Executa
Dr = Cmd.ExecuteReader()
[ô]Lê
Dr.Read()
[ô]Retorna
Return Dr
Case Else
[ô]Retorna valor
Return Nothing
End Select
Catch ex As Exception
[ô]Returna valor
Return Nothing
[ô]Desconectar
Desconectar()
Finally
[ô]Descarta objetos da memória
Cmd.Dispose()
End Try
End Function
Public Function PesquisarDataTable(ByVal Instrucao_Sql As String) As DataTable
Try
Select Case Conectar()
Case Is = True
[ô]Criar objeto
Dt = New DataTable
[ô]Criar DataAdapter
Ada = New OleDbDataAdapter(Instrucao_Sql, Con)
[ô]Trasfere dados para DataTable
Ada.Fill(Dt)
[ô]Returna valor
Return Dt
Case Else
[ô]Returna valor
Return Nothing
End Select
Catch ex As Exception
[ô]Returna valor
Return Nothing
[ô]Desconectar
Desconectar()
Finally
[ô]Descarta objetos da memória
Dt.Dispose()
Ada.Dispose()
End Try
End Function
Public Function Executar(ByVal InstrucaoSql As String) As Boolean
Try
Select Case Conectar()
Case Is = True
[ô]Cria objeto de Comando
Cmd = New OleDbCommand(InstrucaoSql, Con)
[ô]Executa Instrução Sql
Cmd.ExecuteNonQuery()
[ô]Retorna valor da função
Return True
Case Else
[ô]Retorna valor da função
Return False
End Select
Catch Ex As Exception
MsgBox(Ex.Message)
[ô]Retorna valor da função
Return False
Finally
[ô]Descarta objeto
Cmd.Dispose()
End Try
End Function
End Class
Peço a ajuda dos colegas,para opinar sobre o seguinte:
1.) Eu criei a classe de acesso a Bases de dados abaixo para utilizar nos meus projetos .NET.Gostaria de saber,se ela tem algum defeito ou se falta
algo importante que não coloquei .
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Imports System.Data.OleDb
Public Class ClFontedeDados
#Region [Ô]Declaração de variáveis para manipulação da Fonte de Dados[Ô]
[ô]Declara variáveis
Dim Con As OleDbConnection
Dim StringDeConexao As String
Dim Ada As OleDbDataAdapter
Dim Ds As DataSet
Dim Dr As OleDbDataReader
Dim Dt As DataTable
Dim Cmd As OleDbCommand
#End Region
#Region [Ô]Construtor[Ô]
Public Sub New()
[ô]------------------------
[ô]Define String de conexão
[ô]------------------------
[ô]Lê String de conexão do arquivo [ô]App.Config[ô]
[ô]StringDeConexao = System.Configuration.ConfigurationSettings.AppSettings([Ô]AppConexao[Ô])
End Sub
#End Region
Public Function Conectar() As Boolean
Try
[ô]-------------------------------
[ô]Cria objeto conexão (Ms-Access)
[ô]-------------------------------
Con = New OleDbConnection(StringDeConexao)
[ô]----------------
[ô]Verifica conexão
[ô]----------------
Select Case Con.State
Case Is = ConnectionState.Closed
[ô]Abre conexão
Con.Open()
Case Else
End Select
[ô]Retorna
Return True
Catch ex As Exception
[ô]Desaloca recurso
Con.Dispose()
[ô]Retorna
Return False
End Try
End Function
Public Function Desconectar() As Boolean
Try
Select Case Con.State
Case Is = ConnectionState.Open
[ô]Fecha conexão
Con.Close()
Case Else
End Select
[ô]Retorna
Return True
Catch ex As Exception
[ô]Retorna
Return False
Finally
[ô]Descarta objeto
Con.Dispose()
End Try
End Function
Public Function PesquisarDataSet(ByVal Instrucao_Sql As String) As DataSet
Try
Select Case Conectar()
Case Is = True
[ô]Criar objeto
Ds = New DataSet
[ô]Criar DataAdapter
Ada = New OleDbDataAdapter(Instrucao_Sql, Con)
[ô]Trasfere dados para DataTable
Ada.Fill(Ds)
[ô]Desconectar
Desconectar()
[ô]Returna valor
Return Ds
Case Else
[ô]Returna valor
Return Nothing
End Select
Catch ex As Exception
[ô]Returna valor
Return Nothing
[ô]Desconectar
Desconectar()
Finally
[ô]Descarta objetos da memória
Ds.Dispose()
Ada.Dispose()
End Try
End Function
Public Function PesquisarDataReader(ByVal InstrucaoSql As String) As OleDbDataReader
Try
Select Case Conectar()
Case Is = True
[ô]Cria objeto de Comando
Cmd = New OleDbCommand(InstrucaoSql, Con)
[ô]Define tipo
Cmd.CommandType = CommandType.Text
[ô]Executa
Dr = Cmd.ExecuteReader()
[ô]Lê
Dr.Read()
[ô]Retorna
Return Dr
Case Else
[ô]Retorna valor
Return Nothing
End Select
Catch ex As Exception
[ô]Returna valor
Return Nothing
[ô]Desconectar
Desconectar()
Finally
[ô]Descarta objetos da memória
Cmd.Dispose()
End Try
End Function
Public Function PesquisarDataTable(ByVal Instrucao_Sql As String) As DataTable
Try
Select Case Conectar()
Case Is = True
[ô]Criar objeto
Dt = New DataTable
[ô]Criar DataAdapter
Ada = New OleDbDataAdapter(Instrucao_Sql, Con)
[ô]Trasfere dados para DataTable
Ada.Fill(Dt)
[ô]Returna valor
Return Dt
Case Else
[ô]Returna valor
Return Nothing
End Select
Catch ex As Exception
[ô]Returna valor
Return Nothing
[ô]Desconectar
Desconectar()
Finally
[ô]Descarta objetos da memória
Dt.Dispose()
Ada.Dispose()
End Try
End Function
Public Function Executar(ByVal InstrucaoSql As String) As Boolean
Try
Select Case Conectar()
Case Is = True
[ô]Cria objeto de Comando
Cmd = New OleDbCommand(InstrucaoSql, Con)
[ô]Executa Instrução Sql
Cmd.ExecuteNonQuery()
[ô]Retorna valor da função
Return True
Case Else
[ô]Retorna valor da função
Return False
End Select
Catch Ex As Exception
MsgBox(Ex.Message)
[ô]Retorna valor da função
Return False
Finally
[ô]Descarta objeto
Cmd.Dispose()
End Try
End Function
End Class
1 - Você precisa entender os conceitos de orientação à objeto
2 - Do modo como você fez, está totalmente aberto para ataques de SQL Injection
2 - Do modo como você fez, está totalmente aberto para ataques de SQL Injection
E receber um comando como DROP TABLE não vai ser nada bom...
Procure sempre fechar a conexao no finally, pois caso contrário, você terá que fechar a conexao em cada excecao, e isso não é bom. Abaixo dei uma pequena refatorada no seu codigo para deixar o codigo mais limpo. Não mexi no tratamento da excecao, mas evite chamar o messagebox nessas camadas. Deixe isso para a camada de apresentacao.
Public Function Executar(ByVal InstrucaoSql As String) As Boolean
Try
[ô]Cria objeto de Comando
Cmd = New OleDbCommand(InstrucaoSql, Con)
[ô]Executa Instrução Sql
Cmd.ExecuteNonQuery()
[ô]Retorna valor da função
Return True
Catch Ex As Exception
MsgBox(Ex.Message)
Finally
[ô]Descarta objeto
Cmd.Dispose()
End Try
Return False
End Function
Public Function Executar(ByVal InstrucaoSql As String) As Boolean
Try
[ô]Cria objeto de Comando
Cmd = New OleDbCommand(InstrucaoSql, Con)
[ô]Executa Instrução Sql
Cmd.ExecuteNonQuery()
[ô]Retorna valor da função
Return True
Catch Ex As Exception
MsgBox(Ex.Message)
Finally
[ô]Descarta objeto
Cmd.Dispose()
End Try
Return False
End Function
Pessoal,obrigado pelas sugestões!
Mas,peço a seguinte orientação ainda....
1.) Porque motivo minha classe esta exposta,como citou o colega Kerplunk ?
2.) O que posso fazer na classe para que fique mais profissional?
Obs: Lembrando,que estou tentando criar uma classe que possa servir de camada de acesso a dados para projetos variados no futuro.
Mas,peço a seguinte orientação ainda....
1.) Porque motivo minha classe esta exposta,como citou o colega Kerplunk ?
2.) O que posso fazer na classe para que fique mais profissional?
Obs: Lembrando,que estou tentando criar uma classe que possa servir de camada de acesso a dados para projetos variados no futuro.
Citação:1.) Porque motivo minha classe esta exposta,como citou o colega Kerplunk ?
Simples: Imagine que tem um form qualquer que tem uma caixa de texto e um botão que monta um SQL concatenando o valor da caixa de texto no próprio comando SQL. Mais ou menos assim:
Dim cls As New ClFonteDedados
cls.Executar([Ô]Select * from tabela where x = [ô][Ô] & txtCaixaDeTexto.Text & [Ô][ô][Ô])
AÃ, se o cara digitar na caixa de texto algo como:
[ô]; DROP TABLE TABELAIMPORTANTE; [ô]
Nesse caso o SQL ficaria:
Select * from tabela where x = [ô][ô]; DROP TABLE TABELAIMPORTANTE; [ô][ô]
Então, o Select seria excutado normalmente, mas o DROP TABLE também.
Citação:2.) O que posso fazer na classe para que fique mais profissional?
Tenho que ser franco: Esqueça essa metodologia. Pense em Orientação à Objetos.
Olá,Kerlunk!
Entendi perfeitamente qual é a vulnerabilidade.
Mas,tem algo que eu ainda não compreendi.....
Se eu uso esta classe numa aplicação .NET (Desktop), como é que o usuário (Mal intensionado),terá acesso a meu algoritmo de acesso a classe,
fazendo a modificação que você sugeriu???
Entendi perfeitamente qual é a vulnerabilidade.
Mas,tem algo que eu ainda não compreendi.....
Se eu uso esta classe numa aplicação .NET (Desktop), como é que o usuário (Mal intensionado),terá acesso a meu algoritmo de acesso a classe,
fazendo a modificação que você sugeriu???
Ja ouviu falar em Ofuscador da um pesquisada ele ajuda com esse negocio de classes de conexoes pra ofuscar o codigo, ja criei varios topicos como o seu e ja vi varios outros, e ja tinha pesquisado sobre o que o keeplunk falou, mais pra quem ta comecando e dificil mesmo...
Se eu uso esta classe numa aplicação .NET (Desktop), como é que o usuário (Mal intensionado),terá acesso a meu algoritmo de acesso a classe,
fazendo a modificação que você sugeriu???
Resposta... Alguem pode usar como se fosse um descompactador de .exe ele pega o seu .exe e ver todo o seu codigo ate as suas conexoes...
Se eu uso esta classe numa aplicação .NET (Desktop), como é que o usuário (Mal intensionado),terá acesso a meu algoritmo de acesso a classe,
fazendo a modificação que você sugeriu???
Resposta... Alguem pode usar como se fosse um descompactador de .exe ele pega o seu .exe e ver todo o seu codigo ate as suas conexoes...
Acho que essa clase tá um tipo Classe Deus. Tá cheia de responsabilidades.
Marcos, dá uma olhada nisso aqui que você vai entender perfeitamente:
http://www.macoratti.net/sql_inj.htm
vlw
http://www.macoratti.net/sql_inj.htm
vlw
Citação:Olá,Kerlunk!
Entendi perfeitamente qual é a vulnerabilidade.
Mas,tem algo que eu ainda não compreendi.....
Se eu uso esta classe numa aplicação .NET (Desktop), como é que o usuário (Mal intensionado),terá acesso a meu algoritmo de acesso a classe,
fazendo a modificação que você sugeriu???
Ele não precisa de acesso ao código, veja que como mostrei, é formado dinamicamente um SQL nocivo...
Tópico encerrado , respostas não são mais permitidas