ESTA CLASSE ESTA BOA OU FALTA ALGO IMPORTANTE?

MARCOS 17/09/2012 15:58:26
#409835
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
KERPLUNK 17/09/2012 18:56:19
#409843
Resposta escolhida
1 - Você precisa entender os conceitos de orientação à objeto
2 - Do modo como você fez, está totalmente aberto para ataques de SQL Injection
JONATHANSTECKER 18/09/2012 08:19:48
#409862
E receber um comando como DROP TABLE não vai ser nada bom...
JABA 18/09/2012 14:55:17
#409896
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
MARCOS 20/09/2012 16:12:11
#410090
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.
KERPLUNK 20/09/2012 16:33:41
#410093
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.
MARCOS 20/09/2012 17:31:36
#410101
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???





KURTGU 20/09/2012 18:25:09
#410110
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...
LLAIA 20/09/2012 19:02:20
#410113
Acho que essa clase tá um tipo Classe Deus. Tá cheia de responsabilidades.
JABA 20/09/2012 20:15:14
#410117
Marcos, dá uma olhada nisso aqui que você vai entender perfeitamente:

http://www.macoratti.net/sql_inj.htm

vlw
KERPLUNK 20/09/2012 20:37:48
#410119
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...
Página 1 de 2 [16 registro(s)]
Tópico encerrado , respostas não são mais permitidas