Implementando a segurança
Conteúdo
Introdução
Voce deve criar um tabela no seu banco de dados para guardar o nome do usuario e a senha, o nome deve ser uma chave primária e a senha um número do tipo inteiro longo.
São tantos as referências e os textos abordando a segurança para a base de dados relacionais que certamente parecerei redundante ao tratar aqui deste assunto, tentarei então fazer uma abordagem mais prática com exemplos práticos. Inicialmente não havia tanta preocupação com a segurança , era mais importante como os sistemas trabalhavam que sua interação com o ambiente e o usuário. Este panorama veio se alterando, e com o explosão da Internet e a quantidade de informação que esta disponível espalhada pelos servidores pelo mundo, hoje não pode mais ser negligenciada.
Naturalmente você deve pensar em proteger seus dados , seu código e suas informações quando realmente isto for necessário e haverá ocasiões em que isto não fará sentido, por isto o bom senso na análise de cada situação deve nortear em como você deve agir e em qual nível de segurança você deve implementar.
Inicialmente iremos falar dos níveis de segurança, se é que assim podem ser chamados, mais simples e que fornecem apenas uma maneira de controlar quem está acessando o sistema.
Antes de iniciar vamos deixar bem claro que estaremos tratando principalmente da base de dados padrão MS Access e usaremos para isto , quando possível a linguagem Visual Basic versão 5.0.
Uma simples janela de Logon
A forma mais simples de segurança que você pode usar é uma janela de logon que peça o nome e senha para o usuário que queira acessar o seu sistema, pode parecer brincadeira mas para certos casos isto é o suficiente; na verdade você pode utilizá-la apenas como mais uma barreira , entre outras , de acesso ao sistema . Vemos abaixo a janela de logon do sistema , ela foi construida usando o Visual Basic 5.0.
Esta deverá ser a primeira janela de sua aplicação de forma que somente os usuários autorizados poderão acessar o sistema. Nela temos os seguintes controles: 1 Form , 2 TextBox , 2 labels e 2 botões de comandos : command1(0) e command1(1).
O usuário irá fornecer o nome e a senha e a seguir deverá clicar no botão Entrar , o sistema irá então checar se o usuário e a senha informada tem permissão de acessar o sistema.
Vejamos a seguir o código associado ao botão Entrar.
Private Sub Command1_Click(Index As Integer) Dim db As Database
Dim rs As RecordsetOn erro GoTo trata_erro
Select Case Index
Case 0 'botao sair
Unload MeCase 1 'botao entrar
If txtusuario.Text = "" Or txtsenha.Text = "" Then
MsgBox "Informe o Nome/Senha do usuário ! "
Exit Sub
End IfCall Codigo_Chave(txtsenha.Text)
Set db = DBEngine.Workspaces(0).OpenDatabase(App.Path & "\Secur.mdb")
Set rs = db.OpenRecordset("senhas", dbOpenTable)
rs.Index = "Primarykey"
rs.Seek "=", txtusuario.TextIf rs.NoMatch Then
MsgBox "Usuário não cadastrado !!!! ", , "Login"
Exit Sub
Else
If Not (rs![senha] = Codigo_Chave((txtsenha.Text))) Then
MsgBox " Senha Inválida !!! , tente novamente ", vbOKOnly, "Senha Incorreta"
txtsenha.SetFocus
txtsenha.SelStart = 0
txtsenha.SelLength = Len(txtsenha.Text)
Exit Sub
Else
MsgBox "Sucesso no Logon !!! ", , "Login"
Me.Hide
End If
End IfEnd Select
Exit Subtrata_erro:
MsgBox Err.Description, vbOKOnly, " Erro # " & Err.Number
Exit SubEnd Sub
E a função que codifica a senha. Public Function Codigo_Chave(senha As String) As Long Dim i As Integer
Dim ret As LongFor i = 1 To Len(senha)
Select Case (Asc(Left(senha, 1)) * i) Mod 4
Case 0
ret = ret + (Asc(Mid(senha, i, 1)) * i)
Case 1
ret = ret - (Asc(Mid(senha, i, 1)) * i)
Case 2
ret = ret + (Asc(Mid(senha, i, 1)) * i) * (i - Asc(Mid(senha, i, 1)))
Case 3
ret = Abs(ret - (Asc(Mid(senha, i, 1)) * i) * (i + Len(senha)))
End Select
Next iCodigo_Chave = ret
End Function
A função Código_chave descodifica a senha e verifica se a mesma é válida ; se alguém tiver acesso ao seu banco de dados e abrir a tabela de senhas verá as senhas todas codificadas.
Embora simples , esta solução mostra que alguma coisa é possivel ser feita a nível de código para tentar proteger seus sistema . Mas não se engane, ela poderá ser facilmente burlada por um superusuário .
Atribuindo uma senha a seu Banco de dados
O Microsoft Access atualmente oferece duas maneiras de você proteger o seu banco de dados:
Vamos ver então como atribuir uma senha a sua base de dados e é claro como fazer para abrir a base de dados e alterar esta senha.
- Você pode atribuir uma senha a sua base de dados . Dessa forma para acessar os dados de sua base sempre será pedida a senha atribuida. Esse método é simples e pode ser utilizado para um usuário ou um pequeno grupo de usuários. Para trabalhar com segurança em ambiente multiusuário os caminhos serão outros...
- Segurança a nível de usuário e o sistema de contas.Entraremos em detalhes sobre este método no transcorrer deste artigo.
Podemos fazer isto usando o Access . Neste caso é só abrir sua base de dados e selecionar as opções :
Ferramentas-> Segurança -> Definir senha do banco de dados (Ver na figura abaixo)
Podemos também fazer a atribuição via código no Visual Basic usando o método NewPassword do DAO.
O método NewPassword têm a seguinte sintaxe:
Objeto.NewPassword senha_antiga, senha_nova
Onde :
Senha_antiga é a senha que desejamos alterar . No nosso caso como estamos atribuindo uma senha nova ao banco de dados a senha inicial é a senha antiga e é definida como uma stringa vazia ("").
Senha_nova é a senha que atribuimos a nossa base de dados.
Vejamos um pequeno trecho de código que realiza a tarefa - Atribui e serve para alterar a senha de uma base de dados :
Formulário para atribuir senha a uma base de dados Controles usados:
Duas caixas de texto - Text1.text e Text2.text
Dois botões de comandos - Command1(0) e command1(1)
Um frame . Muito simples.
Obs: Se for utilizar o Controle de dados para acessar uma base de dados com senha você precisa informa a seguinte linha de código:
Dim wks As workspace
Dim db As Database
Dim caminho As String
Dim password As StringPrivate Sub Command1_Click(Index As Integer) 'Botão OK - efetiva a alteraçao de senha do banco de dados
Select Case Index
Case 0
If Text1.Text <> Text2.Text Then
MsgBox "A senha nao confere !!! ", vbExclamation
Exit Sub
End If
If Text1.Text = "" Or Text2.Text = "" Then
MsgBox "Informe a senha !!! "
Exit Sub
End If
Set db = wks.OpenDatabase(caminho, True, False, ";PWD=" & password)
db.NewPassword password, Text1.Text 'atribui nova senha
password = Text1.Text
Set db = wks.OpenDatabase(caminho, False, False, ";PWD=" & password)
MsgBox "Senha Alterada com sucesso !!! "
Text1.Text = ""
Text2.Text = ""
Case 1
End
End Select
End SubPrivate Sub Form_Load()
caminho = "C:\Meus documentos\senha.mdb"
Set wks = CreateWorkspace("", "admin", "")
password = "" 'senha inicial é sempre uma string vazia ""
End SubSeu_Data_Control.Connect = ";pwd=senha"
Onde senha é a senha da base de dados.
Se for compactar uma base de dados com senha tenha o cuidado de informa a senha :
Conteúdo
DBEngine.CompactDatabase "base_normal" , "base_compactada", dbLangGeneral, dbVersion30,";pwd=senha" Continua...
Retorna