Postagens populares

Oh vida "vea" boa

quarta-feira, 23 de junho de 2010

Injeção de SQL

Injeção de SQL é um tipo de ameaça de segurança que se aproveita de falhas em sistemas que interagem com base de dados via SQL. O ataque ocorre quando se consegue inserir uma série de instruções SQL dentro de uma consulta através da manipulação das entradas de dados de uma aplicação.
Para entender o funcionamento consideremos a instrução SQL sequinte:

SELECT ID, LOGIN, SENHA, EMAIL
FROM USUARIOS;


Esta instrução retorna todos os registros da tabela usuários de um sistema. A partir desta mesma instrução os registros a serem retornados podem ser restritos através da inclusão da clausula WHERE, por exemplo:

SELECT ID, LOGIN, SENHA, EMAIL
FROM USUARIOS
WHERE LOGIN = “ADMIN” AND SENHA = “12345”;


Se a aplicação não tratar apropriadamente o conteúdo inserido pelo usuário ela poderá gerar uma entrada indesejada e retornar informações que não deveriam ser expostas. É comum aplicações criadas com PHP que com frequencia tem suas instruções SQL criadas através das variáveis que compõem os parametros recebidos por um script-server-side oferecerem maior vulnerabilidade para este tipo de ataque. O código, em PHP, a seguir ilustra uma possibilidade de ataque:

1. 2. $usuario = $_POST['usuario'];
3. $senha = $_POST['senha'];
4.
5. $query_string = “SELECT ID, LOGIN, SENHA, EMAIL
FROM USUARIOS
WHERE LOGIN = '{$usuario}'
AND SENHA = '{$senha}';
6. ?>


Com a entrada de dados abaixo é possivél ter como retorno todos os registro da tabela.




Essa entrada faz com que a aplicação gere o sequinte código:

SELECT ID, LOGIN, SENHA, EMAIL
FROM USUARIOS
WHERE LOGIN = “” AND SENHA = “” or 1 = 1;


Através desse tipo de falha os estragos podem ser muito maiores pois basta inserir no campo senha do formulário de login ; DROP TABLE USUARIOS --, essa instrução irá gerar código a seguir:

SELECT ID, LOGIN, SENHA, EMAIL
FROM USUARIOS
WHERE LOGIN = “” AND SENHA = “”; DROP TABLE USUARIOS --;


Neste caso as intruções seram executada pelo banco de dados sem nenhum problema pois não possuem erros de sintaxe. O primeiro “;” encerra a primeira instrução e possibilitará a execução da instrução que apaga a tabela de usuários.

Em Java ou qualquer linguagem de programação, ao acessar a base de dados, se as instruções SQL forem concatenadas como a consulta em PHP acima o resultado será o mesmo. Por exemplo:

{
...
conn = pool.getConnection( );
String sql = “SELECT ID, LOGIN, SENHA, EMAIL
FROM USUARIOS
WHERE LOGIN = '” + usuario + “'
AND SENHA = '” +senha + ”'”;
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
...
}


Como estratégia de defeza, para se prevenir de injeção de SQL, recomenda-se que todas as consultas sejam parametrizadas, nunca deve-se concaternar strings para criar instruções SQL.

{
...
String nome_usuario = request.getParameter("usuario");
String senha_usuario = request.getParameter("senha");
conn = pool.getConnection( );
String sql = “SELECT ID, LOGIN, SENHA, EMAIL
FROM USUARIOS
WHERE LOGIN = ?
AND SENHA = ?”;
PreparedStatement pstmt = connection.prepareStatement( sql );
pstmt.setString( 1, nome_usuario);
pstmt.setString( 2, senha_usuario);
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
...
}


Essa é uma das estratégias para nos previnirmos deste tipo de ataque, como enunciado no conceito de injeção de sql ela se utiliza de falhas nos sistemas que acessam base da dados. Visto isso o que pode ser feito é criar aplicativos seguindo as especificações de segurança necessárias para evitar esse tipo de ataque.


BIBLIOGRAFIA

http://pt.wikipedia.org/wiki/Inje%C3%A7%C3%A3o_de_SQL
[11h01 23/06/2010]

http://www.totalsecurity.com.br/article.php?sid=732
[00h23 23/06/2010]

http://www.owasp.org/index.php/Preventing_SQL_Injection_in_Java
[01h56 24/06/2010]

quinta-feira, 25 de março de 2010

Como recuperar a senha do root do MySQL

Esse aqui eu já usei e funcionou no Linux Mandriva

http://www.vivaolinux.com.br/dica/Recuperar-senha-de-root-do-MySQL

terça-feira, 9 de março de 2010

Como descompactar arquivos no LINUX

Para descompactar estes formatos de arquivos os comandos são simples:

zip:

gunzip nomedoarquivo.zip

rar:

unrar x nomedoarquivo.rar

tar:

tar -xvf nomedoarquivo.tar

tar.gz:

tar -vzxf nomedoarquivo.tar.gz

bz2:

bunzip nomedoarquivo.bz2

tar.bz2:

tar -jxvf nomedoarquivo.tar.bz2

quinta-feira, 24 de setembro de 2009

Verificar o tamanho do DB

Esta consulta tras o tamnho do DB, esparço usado e livre.

select round(sum(used.bytes) / 1024 / 1024 / 1024) || ' GB' "Database Size",
round(sum(used.bytes) / 1024 / 1024 / 1024) -
round(free.p / 1024 / 1024 / 1024) || ' GB' "Used space",
round(free.p / 1024 / 1024 / 1024) || ' GB' "Free space"
from (select bytes
from v$datafile
union all
select bytes
from v$tempfile
union all
select bytes from v$log) used,
(select sum(bytes) as p from dba_free_space) free
group by free.p

segunda-feira, 17 de agosto de 2009

Como usar o Crystal Reports XI como o Delphi 2009

Primeiro instale o componente Crystal ActiveX Report View Library 11.0 através da opção Import Component do menu Component







Será acrescentada a paleta Crystal na barra de componentes como segue.


Executando um relatório .crp a partir de uma aplicação.
Em uma nova aplicação acrescente um botão a um formulário e no seu evento de clique adicione o seguinte código:

Uses OleCtrls, CrystalActiveXReportViewerLib11_TLB;

procedure TForm1.Button2Click(Sender: TObject);
var
cry: TCrystalActiveXReportViewer;
oRpt, oApp: variant;
i: integer;
frm: TForm;
begin
// criação do objeto e identificação do arquivo .rpt a ser executado
cry := TCrystalActiveXReportViewer.Create(Self);
oApp := CreateOleObject('CrystalRuntime.Application');
oRpt := oApp.OpenReport('K:\Copia\rel\comissao.rpt', 1);
// passando o usuario e a senha do bando de dados para o relatório
for i := 1 to oRpt.Database.Tables.Count do begin
oRpt.Database.Tables[i].ConnectionProperties.Item['User ID'] := 'usuarioDoBancoDeDados';
oRpt.Database.Tables[i].ConnectionProperties.Item['Password'] := 'senhaDoBancoDeDados';
end;
// exemplo de passagem de parâmetros do tipo data e texto
oRpt.ParameterFields.GetItemByName('data1', '').AddCurrentValue(StrToDateTime( '01/04/2006 15:15:22' ));
oRpt.ParameterFields.GetItemByName('data2', '').AddCurrentValue(StrToDateTime( '05/04/2006 15:15:22' ));
oRpt.ParameterFields.GetItemByName('usuario', '').AddCurrentValue('Francisco Soares');

// criando o formulario que exibirá o relatório
frm := TForm.Create(Self);
try
cry.Parent := frm;
cry.Align := alClient;
cry.ReportSource := oRpt;
cry.ViewReport;
frm.Position := poOwnerFormCenter;
frm.ShowModal;
finally
FreeAndNil(frm);
end;
end;


Espero ter colaborado com esse exemplo. Qualquer dúvida sobre o assunto pode enviá-las que se eu souber eu as repoderei.

quinta-feira, 30 de julho de 2009

Strings de conexão com banco de dados

Deivid Roger Oliveira Santos escreveu vários exemplos de Strings de Conecxões com os banco de dados mais usados atualmente. Sugiro como consulta.

http://www.linhadecodigo.com.br/ArtigoImpressao.aspx?id=1640

segunda-feira, 27 de julho de 2009

Manipulação de datas

Delphi
1. Verifica se o ano é bissexto

function IsThisLeapYear: Boolean;
begin
Result := IsLeapYear(YearOf(Date));
end;


Oracle


  • SYSDATE - retorna a data e a hora atual do banco de dados


    SELECT SYSDATE FROM dual;

    SYSDATE

    ---------------------

    30/07/2009 12:00:00


  • ADD_MONTHS - somando meses ou subtraindo meses


    SELECT ADD_MONTHS(SYSDATE,1) FROM DUAL;


    ADD_MONTHS(SYSDATE,1)

    --------------------

    30/08/2009 12:00:00


  • LAST_DAY - último dia do mês da data passada como parâmetro


    SELECT LAST_DAY(sysdate) FROM dual;


    LAST_DAY(SYSDATE)

    -----------------

    30/04/2009 10:17:00


  • NEXT_DAY - próximo dia da semana


    SELECT SYSDATE, NEXT_DAY(SYSDATE,7) FROM dual;


    SYSDATE     NEXT_DAY(SYSDATE,7)

    ----------- -------------------

    06/04/2009  11/04/2009


  • MONTHS_BETWEEN - número de meses que existem entre duas datas


    SELECT MONTHS_BETWEEN(ADD_MONTHS(SYSDATE,5),SYSDATE) FROM DUAL;


    MONTHS_BETWEEN(ADD_MONTHS(SYSDATE)

    ------------------------------

    5