> ## Implementando a segurança

> #### Conteúdo

> - Introdução.
> - Atribuindo uma senha a seu banco de dados.

> ### Introdução

> 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 Recordset On erro GoTo trata_erro Select Case Index Case 0 'botao sair Unload Me Case 1 'botao entrar If txtusuario.Text = "" Or txtsenha.Text = "" Then MsgBox "Informe o Nome/Senha do usuário ! " Exit Sub End If Call 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.Text If 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 If End Select Exit Sub trata_erro: MsgBox Err.Description, vbOKOnly, " Erro # " & Err.Number Exit Sub End 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 Long For 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 i Codigo_Chave = ret End Function

> 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.

> 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 .

> Conteúdo

> ### Atribuindo uma senha a seu Banco de dados

> ### O Microsoft Access atualmente oferece duas maneiras de você proteger o seu banco de dados:

> 1. 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...
> 2. Segurança a nível de usuário e o sistema de contas.Entraremos em detalhes sobre este método no transcorrer deste artigo.
> 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.

> 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.

> Dim wks As workspace Dim db As Database Dim caminho As String Dim password As String Private 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 Sub Private Sub Form_Load() caminho = "C:\Meus documentos\senha.mdb" Set wks = CreateWorkspace("", "admin", "") password = "" 'senha inicial é sempre uma string vazia "" End Sub

> 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:

> Seu_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 :

> DBEngine.CompactDatabase "base_normal" , "base_compactada", dbLangGeneral, dbVersion30,";pwd=senha"

> Conteúdo

>     Continua...

>     Retorna