Caramba , q aula... esse cara é bom msm... rsrs
________________________________ De: José Laurindo <jlchia...@yahoo.com.br> Para: oracle_br@yahoogrupos.com.br Enviadas: Terça-feira, 1 de Novembro de 2011 14:37 Assunto: [oracle_br] Re: SQL Injection Vamos começar definindo o que é esse coiso : numa explicação bem rasteira (pesquise em http://www.petefinnigan.com/weblog/entries/ e http://asktom.oracle.com para mais detalhes ), SQL Injection ocorre quando vc tem um SQL dinâmico , aonde o usuário pode informar parte do texto do SQL E a aplicação não valida o que o usuário entra, se um usuário mal-intencionado entrar comandos SQL adequadamente formatados nessa string esse comandos são executados... Um exemplo ridiculamente simples, mas pra vc entender : digamos que eu tenha numa tabela chamada EMP uma coluna SAL, que o usuário não deveria poder acessar , tipo : SCOTT@O10GR2:SQL>desc emp Nome Nulo? Tipo ----------------------------------------- -------- ---------------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2) e o asninho do desenvolvedor queria dar pro usuário final uma consulta que mostra o código (EMPNO) e o nome do empregado (ENAME), mas com a característica de que é o próprio usuário final que informa numa string o nome do empregado a consultar : SCOTT@O10GR2:SQL>select empno, ename from emp where ename = &V_NOME parece ser inocente, né ? E realmente, se o usuário informar o nome só, funciona normalmente : SCOTT@O10GR2:SQL>/ Informe o valor para v_nome: 'MILLER' antigo 1: select empno, ename from emp where ename = &V_NOME novo 1: select empno, ename from emp where ename = 'MILLER' EMPNO ENAME ------------------ ---------- 7934 MILLER => legal... Agora suponha um usuário um pouquinho mais esperto e mal-intencionado, que coloca comandos SQLs dentro da string , ó o que acontece : SCOTT@O10GR2:SQL>/ Informe o valor para v_nome: ename UNION select sal, ename from emp antigo 1: select empno, ename from emp where ename = &V_NOME novo 1: select empno, ename from emp where ename = ename UNION select sal, ename from emp EMPNO ENAME ------------------ ---------- 800 SMITH 950 JAMES 1100 ADAMS 1250 MARTIN 1250 WARD 1300 MILLER 1500 TURNER 1600 ALLEN 2450 CLARK 2850 BLAKE 2975 JONES 3000 FORD 3000 SCOTT 5000 KING 7369 SMITH 7499 ALLEN 7521 WARD 7566 JONES 7654 MARTIN 7698 BLAKE 7782 CLARK 7788 SCOTT 7839 KING 7844 TURNER 7876 ADAMS 7900 JAMES 7902 FORD 7934 MILLER 28 linhas selecionadas. ==> taí, o comando SQL informado foi concatenado ao texto, e como estava sintaticamente correto foi executado - como resultado não-esperado pelo programador, o usuário malicioso obteve o conteúdo da coluna SAL , embora o título da coluna mostre EMPNO ... Veja que foi isso mesmo que aconteceu : SCOTT@O10GR2:SQL>select ename, sal from emp; ENAME SAL ---------- ------------------ SMITH 800 ALLEN 1600 WARD 1250 JONES 2975 MARTIN 1250 BLAKE 2850 CLARK 2450 SCOTT 3000 KING 5000 TURNER 1500 ADAMS 1100 JAMES 950 FORD 3000 MILLER 1300 14 linhas selecionadas. SCOTT@O10GR2:SQL> ===> OK ? Com isso ficou super-simples de te responder as suas perguntas : a. SQL Injection *** NÂO *** é de modo algum exclusividade de aplicações web, já que SQL dinâmico tranquilamente Pode Ser usado em client/server, também... b. como mostrado, NÂO é uma questão do database, é aplicação mal-feita, bug na aplicação, portanto NENHUM "parâmetro" ou ação no database pode impedir c. a camada de rede não tem NADA vezes NADA a ver com o assunto (como mostrado, a aplicação está fazendo a besteira que foi mandada a fazer), não tem como na camada de rede vc detectar usuário aproveitando-se de brecha na aplicação... ==> Já que Redes não tem como atuar, e no banco de dados também não há como identificar se o texto do SQL enviado é o que o programador queria ou não, se teve partes adicionais coladas ou não, fica óbvio que a única camada que pode resolver a questão é a Aplicação, e as boas práticas são : 1. SEMPRE, aonde possível, evitar código SQL dinâmico 2. Aonde for realmente, totalmente, completamente, absolutamente inevitável a porcaria do SQL dinâmico, usar BIND VARIABLES (ie, ao invés de sair colando strings, usar VARIÁVEIS reais no código. 3. No pior dos mundos possíveis, aonde o SQL dinâmico for inevitável, E (por qquer limitação absurda da ferramenta sendo usada) não seja possível usar BIND VARIABLEs, a aplicação TEM que validar os INPUTs do usuário antes de os mandar pro banco E são essas... Sobre BINDING, eis uma re-escrita do meu exemplo ridículo usando BINDs - LÓGICO, usei as sintaxes de criação de variáveis e BINDs do sqlplus, mas TODAS, absolutamente TODAS as principais linguagens de programação, sejam web ou client/server, tem SIM como fazer variáveis e BINDING ... Eis : SCOTT@O10GR2:SQL>variable V_NOME varchar2(40); SCOTT@O10GR2:SQL>exec :V_NOME := 'MILLER'; Procedimento PL/SQL concluído com sucesso. SCOTT@O10GR2:SQL>print V_NOME V_NOME ---------------------------------------------------------- MILLER SCOTT@O10GR2:SQL>select empno, ename from emp where ename = :V_NOME; EMPNO ENAME ------------------ ---------- 7934 MILLER SCOTT@O10GR2:SQL>exec :V_NOME := 'MILLER UNION SELECT SAL, ENAME FROM EMP'; Procedimento PL/SQL concluído com sucesso. SCOTT@O10GR2:SQL>print v_nome V_NOME ---------------------------------------------------------- MILLER UNION SELECT SAL, ENAME FROM EMP SCOTT@O10GR2:SQL>select empno, ename from emp where ename = :V_NOME; não há linhas selecionadas SCOTT@O10GR2:SQL> []s Chiappa --- Em oracle_br@yahoogrupos.com.br, "lfr_66" <luizfernandorocha@...> escreveu > > Senhores, > Sou totalmente leigo a respeito de SQL Injection e gostaria de uma ajuda. > Ataques via SQL Injection somente podem acontecer em bancos de dados que > rodem aplicações web? Há algum parâmetro de banco (ou boas práticas) que > cuide da segurança para esse tipo de situação ou tudo que se pode fazer pra > evitar esse tipo de ataque são tratadas nas camadas de aplicação e rede? > Obrigado! > Luiz Rocha > [As partes desta mensagem que não continham texto foram removidas]