Como evitar SQL inject no delphi

Delphi

07/08/2012

Gostaria de saber se existe alguma funçao para evitar outro usuario de inserir um codigo malicioso no sistema..

Por exemplo SQL inject, ou até mesmo aqueles programas que injetao uma dll de terceito no processo do seu sistema que esta
sendo executado...


Alguem poderia ajudar?
Douglas Michelino

Douglas Michelino

Curtidas 0

Respostas

Douglas Michelino

Douglas Michelino

07/08/2012

Pessoal, ja resolve estou passando por parametros, e rodando numa rotina as informacoes do usuario

porem fiquei entrigado, o usuario conseguiu pegar a senha de um nome de usuario que falei pra ele tentar pra me provar
e o mesmo pegou a senha, e nao possui nenhum grid que gere informacao onde ele pudesse modificar os comandos, e gerar a listagem....


Existe algum meio de dar algum inject que ele retorno alguma msg com o conteudo do campo solicitado pelo inject?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

07/08/2012

Opa, primeiramente, como você está fazendo esta rotina de login?

Outra, o que este usuário tinha à disposição para tentar ´´invadir´´ seu sistema?
GOSTEI 0
Bruno Leandro

Bruno Leandro

07/08/2012

como voce se conecta ao banco de dados arquivo ini ou algo do genero, essas informações são criptografadas ?
ou voce utiliza os valores ja setados no componente de conexão,
os dados dos usuarios, tipo senha estao criptografadas no banco de dados, pode ser algumas formas de capturar essas informações
GOSTEI 0
Douglas Michelino

Douglas Michelino

07/08/2012

utilizo o Adoconnection, e a connectioString é passado no momento da da conexao, ou toda vez que preciso utilizar a conexao
executo uma funcao onde ela enche o connectionstring, e depois abre a conexao , executa a operacao e fecha a conexao novamente.

Estou fazendo desta forma, fixa dentro do sistema, porem so passada para o componente no momento da conexao, e execucao.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

07/08/2012

Só por garantia, o usuário não tem acesso direto ao banco, tem?
GOSTEI 0
Douglas Michelino

Douglas Michelino

07/08/2012

Tem nada....

Pra voce ter uma ideia, coloquei um anti debug como parte do projeto, criei uma funcao anti inject que pega o conteudo digitado pelos edits e verifica se tem comandos SQL...E por fim estou passando as informaçoes por parametros, exemplo



query.sql.add(select *from usuario where usuario = :usuario and senha = :senha);
query.Parameters.ParamByName(usuario).value:=editwusuario.text;
query.Parameters.ParamByName(senha).value:=editwsenha.text;

isso depois deu ter passado ele na funcao do anti inject..........

Acabei de mudar a senha do SQL remoto... Pois é remoto o sistema... E mudei a senha o login, e mesmo assim
ele acabou de pegar a senha nova que acabei de alterar...

Sinceramente eu nao sei mais como resolver isso.
GOSTEI 0
Deivison Melo

Deivison Melo

07/08/2012

Qual a forma que montou a query?

Utilizou a atribuição diretamente dos objetos da vcl do delphi ou está utilizando a consulta através de parâmetros, passando os valores dos parâmetros através desses objetos?
GOSTEI 0
Douglas Michelino

Douglas Michelino

07/08/2012

Outro detalhe, coloquei uma funcao anti inject de DLL tamen, e estou dando pack no executavel com molebox.
GOSTEI 0
Douglas Michelino

Douglas Michelino

07/08/2012

A conexao esta sendo feita assim


dm.ADOAUX.ConnectionString:=Provider=SQLOLEDB.1;Password=senha;Persist Security Info=True;Encrypt=yes;User ID=sa;Initial Catalog=BANCO;Data Source=IP;

e as consultas sao passadas por parametros como demonstrado acima.
GOSTEI 0
Douglas Michelino

Douglas Michelino

07/08/2012

Mais um detalhe eu liguei o SQLProvider para pegar de onde vinha o comando e fechei o acesso esperando o mesmo tentar pegar
os dados, quando ele me mandou fui procurar ver o Sqlprovider para verificar, e o mesmo havia fechado, sem ninguem mexer.
GOSTEI 0
Douglas Michelino

Douglas Michelino

07/08/2012

Isso foi o que ele me disse:

Cara... Não sei se ja falaram aqui no tópico.
Mais existe uma falha de segurança SUPER grave nesse sistema...
Você estabelece um canal diretamente com o SQL do servidor...
Consegui executar comandos pelo editor sem problema algum...

Da uma olhada nisso ai...

Abraços!

Ele diz que estabeleceu uma conexao direta com o sql.... E acredito que esteja conseguindo pegar meu dados, que fazem a conexao pelo ado..

Alguem poderia ajudar ou dar uma luz, pois to num tunel e escuro kkk
GOSTEI 0
Anderson

Anderson

07/08/2012


query.sql.add(select *from usuario where usuario = :usuario and senha = :senha);
query.Parameters.ParamByName(usuario).value:=editwusuario.text;
query.Parameters.ParamByName(senha).value:=editwsenha.text;



Certifique-se de:

- Gravar a senha criptografada no banco de dados, usando um hash (SHA-1, SHA-256, etc.)
- Não permitir o cadastro de senhas fracas (inferiores a 6 dígitos)
- Colocar no código limitadores de tamanho para os parâmetros
- Colocar no código validadores de instruções SQL (não executa a query que tem comandos não previstos)
- Orientar os usuários que divulgar a senha pode resultar em penalidades (demissão por justa causa)
- Bloquear login do usuário se errar senha mais de 3 vezes (previne contra ataque por força bruta)
- Bloquear IP que tentar ataque por força bruta (previne utilização de ferramentas de força bruta)
- Inspecionar máquinas a procura de keyloggers
- Limitar acessos para não ocorrer vazamento de informações (do ambiente de desenvolvimento ao de produção)
- Não permitir utilização de senha fraca pelo DBA
- Todos os patches de segurança disponíveis estão aplicados no sistema operacional, no sgbd, antivírus, firewall
- Ter um log (registro) de acessos ao sistema identificando IP, data, hora, usuário, terminal, etc.
- Analisar periodicamente os logs de acesso (log não monitorado/analisado é inútil)
- Criar chave criptografada de identificação do terminal (somente terminais autorizados terão acesso ao sistema)
- Disponibilizar cartilha com informações sobre vírus, worms, trojans e engenharia social para orientar usuários
- Manter backups em local seguro e de acesso restrito para evitar o vazamento de informações
- Bloquear/limitar acessos físicos ao servidor
- Bloquear/limitar a utilização de mídias no local de trabalho (pendrive, dvd, ...)
- Inspecionar máquinas e limitar/bloquear acesso remoto (TeamView, TightVnc, UltraVnc, ...)
- Fazer logoff na aplicação se inativa por mais de XX minutos
- Controlar a lista de usuários cadastrados no banco de dados (usuários desligados da empresa devem ser bloqueados)

Em se tratando de segurança da informação, vai muito mais da conduta do usuário do que da tecnologia. Boa parte das invasões são resultados da cooperação (voluntária ou não) do usuário que forneceu alguma chave de acesso.

Abraços,

Anderson:.
GOSTEI 0
Bruno Leandro

Bruno Leandro

07/08/2012

ele pode estar capturando com um sniffer, ou seja, ele pode estar ouvindo tudo que esta comunicando entre a rede e o sistema, uma solução seria utilizar ssl
GOSTEI 0
Douglas Michelino

Douglas Michelino

07/08/2012

Voce diz que por SSL a pessoa nao consegue pegar os pacotes por Sniffer?
GOSTEI 0
Douglas Michelino

Douglas Michelino

07/08/2012

Outro detalhe: Voce poderia mostrar um exemplo de conexao ado, utilizando SSL.

Obrigado.
GOSTEI 0
Romulo Contro

Romulo Contro

07/08/2012

vc usa qual banco de dados?

eu lembro que quando eu trabalhava com conversão de dados, eu usava tipo de um sniffer, que capturava tudo que era mandado pro mysql, pra conseguir descobrir onde ficavam salvas as informações, senhas pra teste e td mais...

se nao me engano, chamava SQLMonitor

ele funcionava pra oracle e mysql, mas provavelmente deve ter pra outros bancos também.

pode ser isso que o cara tá fazendo...
GOSTEI 0
Romulo Contro

Romulo Contro

07/08/2012

e outra coisa, se for mysql em versão muito antiga (versão 4 por exemplo) a senha do banco fica salvo no my.ini... ele pode pegar a senha do banco por lá.
GOSTEI 0
Douglas Michelino

Douglas Michelino

07/08/2012

utilizo banco de dados SqlServer.... conexao ADO, Mssql...

Atualmente alterei os parametros de conexao para esta forma:

ConnString :=
Provider=SQLOLEDB.1;Persist Security Info=False; +
User ID=%s;Password=%s;Data Source=%s;Use Procedure for Prepare=1; +
Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Initial Catalog=%s; +
Tag with column collation when possible=False ;

ADOCONEXAO.Connected:=false;
ADOCONEXAO.ConnectionString:=Format( ConnString ,[ wlicensa_usuario , wlicensa_senha , wlicensa_ip , wlicensa_banco ] ) ;
ADOCONEXAO.LoginPrompt:=false;
try
ADOCONEXAO.Connected:=true;
except
Showmessage(problema na conexao!);
exit;
end;


Porem agora mesmo assim a pessoa ainda consegue descobrir usuario, senha e ip do SQL server.
GOSTEI 0
Deivison Melo

Deivison Melo

07/08/2012

Recomendo que faça a criptografia de sua senha!

Veja se o post abaixo atenderá sua solicitação.


http://www.webmaster.pt/senhas-criptografadas-7141.html

Os exemplos utilizados estão no post:

http://www.webmaster.pt/wp-content/uploads/2010/07/ficheiros.zip


Outros tópicos que irão ajudá-lo.

http://social.msdn.microsoft.com/Forums/pt-br/vscsharppt/thread/d17ee0a8-ad4f-4173-bc23-e9c1818b46c0

http://javafree.uol.com.br/topic-884840-RESOLVIDO-Criptografar-senha-no-banco-de-dados-MYSQl.html?page=1

GOSTEI 0
Deivison Melo

Deivison Melo

07/08/2012

- Verifique também esses tópicos!

http://www.codigopronto.com.br/codigo-ler/63/sql-injection-aprenda-evitar

http://stackoverflow.com/questions/1984784/protecting-strings-within-a-delphi-application

https://newsgroups.embarcadero.com/thread.jspa?threadID=57139


- Recomendo ainda o uso do componente ZeosLib, pois através dele existe a forma de usarmos a conexão SSL (camada segura)

http://en.sourceforge.jp/frs/g_redir.php?m=jaist&f=%2Fdirectsql%2FDirect+Mysql+Objects%2FZeos+Patch%2FZeos-SSL.ZIP

Qualquer dúvida poste que teremos o maior prazer em ajudá-lo.

GOSTEI 0
Douglas Michelino

Douglas Michelino

07/08/2012

Pelo que vi a maioria das resolucoes sao para mysql e web, no meu caso é um aplicação desktop, que utiliva o sqlserver em modo remoto....


No caso o ZeosLib, com a funcao do ssl, serviria para MsSql, e se servir acredito ainda que preciso ativar uma tal licensa
no SqlServer para que a criptografia que eu enviar seja interpretada pelo proprio MsSql...

Achei outro componente para criptografia, mais ainda nao testei.. Se chama SecureBridget....

Alguem ja usou ele?
GOSTEI 0
Douglas Michelino

Douglas Michelino

07/08/2012

Pessoal a pergunta é a seguinte,

Como eu utilizo o Ado para conectar no SQL remoto, de uma forma segura, onde a pessoa nao consiga pegar meus dados
por Sniffer, porem acredito que nao posso utilizar o SSL, por precisar ativar um parametro no SQL, pois o mesmo possui
uma web, que passa as informações de conexao sem criptografia.

Existe algum meio?
GOSTEI 0
POSTAR