Página 1 de 1

PROTEGER DBF

Enviado: 11 Set 2004 07:41
por ANTONIOM
Caros Colegas,

Alguem poderia me sugerir como proteger meus dbfs contra leitura externa (pelo dbu por exemplo) da uma forma mais simples possivel ???? Teria algum jeito de protege-los sem modificar (ou fazer poucas alteracoes) nos fontes do sistema ????

Agradeco a todos desde ja

Proteger DBF's...

Enviado: 11 Set 2004 10:56
por gransoft
ARAGUARI-MG, 11 de setembro de 2004.

Prezado Antônio,

Verifique:

Código: Selecionar todos

FUNCTION Protege(xcArquivo,cCond)
LOCAL nBytesL, nBytesG, nHandle, cBuffer := SPACE(01)
IF (VALTYPE(xcArquivo) <> "C") .OR. (xcArquivo == NIL)
   RETURN(.F.)
END
IF (VALTYPE(cCond) <> "C") .OR. (cCond == NIL)
   RETURN(.F.)
END
nHandle := FOPEN(xcArquivo,2)  && ABRE ARQUIVO PARA LEITURA/GRAVACAO
*
IF (nHandle == -1)
   Beep(1)
   SETCOLOR(cCor5)
   DO CASE
      CASE FERROR() ==  0
         Mensagem("*** SUCESSO ***")
      CASE FERROR() ==  1
         Mensagem("*** NUMERO DE FUNCAO INVALIDO ***")
      CASE FERROR() ==  2
         Mensagem("*** ARQUIVO NAO ENCONTRADO ***")
      CASE FERROR() ==  3
         Mensagem("*** PATH NAO ENCONTRADO ***")
      CASE FERROR() ==  4
         Mensagem("*** MUITOS ARQUIVOS ABERTOS ***")
      CASE FERROR() ==  5
         Mensagem("*** ACESSO NEGADO ***")
      CASE FERROR() ==  6
         Mensagem("*** HANDLE INVALIDO ***")
      CASE FERROR() ==  7
         Mensagem("*** BLOCOS DE CONTROLE DE MEMORIA DESTRUIDOS ***")
      CASE FERROR() ==  8
         Mensagem("*** MEMORIA INSUFICIENTE ***")
      CASE FERROR() == 15
         Mensagem("*** ESPECIFICADO UM DRIVE INVALIDO ***")
      CASE FERROR() == 19
         Mensagem("*** TENTATIVA DE GRAVAR EM DISCO PROTEGIDO ***")
      CASE FERROR() == 21
         Mensagem("*** DISCO NAO PRONTO ***")
      CASE FERROR() == 23
         Mensagem("*** ERRO DE CRC ***")
      CASE FERROR() == 29
         Mensagem("*** ERRO DE GRAVACAO ***")
      CASE FERROR() == 30
         Mensagem("*** ERRO DE LEITURA ***")
      CASE FERROR() == 32
         Mensagem("*** VIOLACAO DE COMPARTILHAMENTO ***")
      CASE FERROR() == 33
         Mensagem("*** VIOLACAO DE TRAVAMENTO ***")
   ENDCASE
   SETCOLOR(cCor0)
   RETURN(.F.)                          && NAO ABRIU O ARQUIVO - PROBLEMAS ...
END
nBytesL := FREAD(nHandle,@cBuffer,1)
IF (nBytesL != 1)                       && NAO LEU O 1. BYTE - PROBLEMAS ...
   RETURN(.F.)
END
*
DO CASE 
   CASE (cCond == "P")
      cBuffer := IF( ASC(cBuffer)==  3,   CHR(4), cBuffer)
      cBuffer := IF( ASC(cBuffer)==131, CHR(132), cBuffer)
   CASE (cCond == "D")
      cBuffer := IF( ASC(cBuffer)==  4,   CHR(3), cBuffer)
      cBuffer := IF( ASC(cBuffer)==132, CHR(131), cBuffer)
   OTHERWISE
      RETURN(.F.)
ENDCASE
*
FSEEK(nHandle,0,0)                     && POSICIONA O PONTEIRO ...
nBytesG := FWRITE(nHandle,cBuffer,1)
IF (nBytesG != 1)                      && NAO GRAVOU O 1. BYTE - PROBLEMAS ...
   RETURN(.F.)
END
FCLOSE(nHandle)
RETURN(.T.)
***
Atenciosamente,
Janis Peters Grants.

http://www.gransoft.com.br
gransoft@zipmail.com.br

E REDE?!

Enviado: 16 Set 2004 20:55
por Clash
Amigo, achei bastante interessante sua rotina para bloquear, e como ela se comportaria em rede?

Me ajudaria bastante.

[ ]s
Clash

Enviado: 16 Set 2004 21:19
por Augusto
Eu uso uma outra (um pouco parecida) que a cada vez que vc invoca a FUNÇÃO ele protege ou desprotege o arquivo

Código: Selecionar todos

PROT('arq1.dbf')
PROT('arq2.dbf')
  .
  .
  .
PROT('arqx.dbf')

FUNCTION PROT
PARAMETERS FILE
PRIVATE READ_BYTES, WRITE_BYTES, HANDLE, BUFFER
HANDLE = FOPEN(FILE,2)
IF HANDLE = -1
   RETURN(.F.)
ENDIF
BUFFER = SPACE(01)
READ_BYTES=FREAD(HANDLE,@BUFFER,1)
IF READ_BYTES !=1
   RETURN(.F.)
ENDIF
BUFFER=IIF(ASC(BUFFER)=3,CHR(4),IIF(ASC(BUFFER)=4,CHR(3),BUFFER))
BUFFER=IIF(ASC(BUFFER)=131,CHR(132),IIF(ASC(BUFFER)=131,CHR(132),BUFFER))
FSEEK(HANDLE,0,0)
WRITE_BYTES = FWRITE(HANDLE,BUFFER,1)
IF WRITE_BYTES !=1
   RETURN(.F.)
ENDIF
FCLOSE(HANDLE)
RETURN(.T.)
Para usá-la em rede eu crio um arquivo de controle dos usuários logados e somente bloquei os arquivos depois que o último usuário sai do sistema além é claro de um controle para os casos de o sistema ser finalizado de forma errada... (falta de luz etc...)

Detalhe... essa função não permite que o arquivo seja aberto nem no FoxBase, DBU ou Excel...
Espero que ajude...

Enviado: 16 Set 2004 22:00
por Dudu_XBase
Eu uso a rdd Six para proteger meus dbfs...
tem uma função chama sx_dbfencrypt() e sx_setpass()..
primeiro eu criptografo o dbf assim...

// criptografando...
use dudu via "SIXNSX"
// senha para abrir o banco a criptografia eh gerada a partir da senha...
sx_setpass("dudu_xbase")
sx_dbfencrypt()


// para abrir o banco depois ....
use dudu via "SIXNSX"
sx_setpass("dudu_base")

Faço isso nos bancos q contém informações de Faturamento (receber) e Pagamento (pagar), e claro no de senhas de usuários tb.

Mas e a REDE?

Enviado: 17 Set 2004 09:53
por Clash
E aí pessoal?!

DuDu, achei interessante a forma que vc utilizou com o RDD SIX, com a RDD CDX será que tem?! E novamente pergunto, num sistema em rede com 4 usuários master, funcionaria beleza?!

[ ]s
Clash

Enviado: 17 Set 2004 11:16
por rochinha
Amiguinho

A dica do Dudu é realmente mais sensata, pois ela criptografa os dados e não o .DBF inteiro, sendo que desta forma mesmo aberto o arquivo continua com seus dados protegidos mesmo que o arquivo seja aberto em outro terminal.

Já use uma técnica identica a do nosso amigo Augusto, mas o problema reside no fato de que o primeiro usuario a abrir o arquivo, sem perceber, deixa o arquivo aberto para outros usuario, que podem acessar os dados até pelo dBase.

O unico problema é a senha que voce irá estipular, pois se esquece-la, ai...

bau, bau.

@braços :?)