Como evitar SQL inject no delphi
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?
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
Curtidas 0
Respostas
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?
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
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?
Outra, o que este usuário tinha à disposição para tentar ´´invadir´´ seu sistema?
GOSTEI 0
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
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
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.
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
07/08/2012
Só por garantia, o usuário não tem acesso direto ao banco, tem?
GOSTEI 0
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.
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
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?
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
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
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.
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
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.
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
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
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
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
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
07/08/2012
Voce diz que por SSL a pessoa nao consegue pegar os pacotes por Sniffer?
GOSTEI 0
Douglas Michelino
07/08/2012
Outro detalhe: Voce poderia mostrar um exemplo de conexao ado, utilizando SSL.
Obrigado.
Obrigado.
GOSTEI 0
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...
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
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
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.
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
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
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
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.
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
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?
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
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?
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