Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Gabriel Moraes

Segurança PHP

Recommended Posts

entao tenho uma rotina de segurança em meus sistemas php

e gostaria que voces a acompanhassem e me dissessem se e realmente segura

e o que mais posso incrementar para melhorar ainda mais esse sistema

bom comecemos do inicio rsrs

 

bom minha funçao que tenta tirar os codigos de injection e

function sqlinj($s) {

$s = addslashes($s);

$s = htmlspecialchars($s);

$s = str_replace("SELECT","",$s);

$s = str_replace("FROM","",$s);

$s = str_replace("WHERE","",$s);

$s = str_replace("INSERT","",$s);

$s = str_replace("UPDATE","",$s);

$s = str_replace("DELETE","",$s);

$s = str_replace("DROP","",$s);

$s = str_replace("DATABASE","",$s);

$s = str_replace("USE","",$s);

return $s;

}

 

acho que nao prescisa de muita explicaçao.

 

bom pra guardar uma senha e simples

eu anexo uma frase minha juntamente com a senha

encripto em md5, e depois encripto em sha1 tentando evitar que as mesmas sejam decriptadas

 

no sistema de login eu encripto a senha de novo

tenho uma tabela chamada log

nela armazeno um hash randomico, vinculado a um id, e uma data

e quando o usuario loga coloco esse hash randomico em um cookie,

e sempre que ele acessa uma pagina restrita eu faço a verificaçao do hash

se o resultado for maior que um, o cookie pode estar incorreto, ja que isso nao seria possivel, entaoe excluo o cookie

se for igual zero ele nao existe no banco entao excluo o cookie e peço login novamente,

se for igual um verifico a data contida no bd e comparo com a data real

se tiver sido feita em uma data diferente (mais de 4horas atras), excluo o cookie, pos o login ja esta vencido e por algum motivo o cookie nao foi excluido

se for igual um e a data for valida, ai sim o codigo exibe a pagina.

 

Gostaria de saber se existem dicas pra mim conseguir melhorar esse sistema,

tenho que prezar muito pela seguranca em meu sistema por conter alguns dados confidencias,

sou pessimo para tentar burlar algo, entao nao sei se e realmente seguro

 

Grato desde ja...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Talvez auxiliando, duas dicas, que talvez já utilize ou ainda melhor hehe:

 

 

1ª Para o que o usuário utiliza, crie um usuário do banco de dados (mysql,psql, sei lá) com apenas as permissões necessárias, como num site muitas vezes seria apenas SELECT, em sistemas SELECT, INSERT, UPDATE, DELETE. Verifique.

 

2ª Uma verificação simples em parametros numéricos que você recebe, seja por get, ajax.. Pode fazer uma ternária ou if, com is_numeric(), já ajuda a filtrar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Talvez auxiliando, duas dicas, que talvez já utilize ou ainda melhor hehe:

 

 

1ª Para o que o usuário utiliza, crie um usuário do banco de dados (mysql,psql, sei lá) com apenas as permissões necessárias, como num site muitas vezes seria apenas SELECT, em sistemas SELECT, INSERT, UPDATE, DELETE. Verifique.

 

2ª Uma verificação simples em parametros numéricos que você recebe, seja por get, ajax.. Pode fazer uma ternária ou if, com is_numeric(), já ajuda a filtrar.

boa dica, valew

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consertando o que eu postei:

 

$n = '1234.5';

var_dump(is_numeric($n)); // returns bool(true)

var_dump(ctype_digit($n)); // returns bool(false)

 

 

Eu utilizava is_int, mas li que não é recomendavel.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, eu acho totalmente ínutil, você dar replace nessas palavras

a Minoria dos injections são baseados em aspas, e você pode dar replace

mais se o cara mandar um injection codificado, você vai fazer papel de bobo aí .

Compartilhar este post


Link para o post
Compartilhar em outros sites

e como você me recomenda evitar este tipo de injection?

como ja disse sou um pessimo hacker, nao conheço nenhum dos metodos de injection apenas conheco os baseados em aspas, exatamente por este motivo que estou postando nesse topico

:D

Compartilhar este post


Link para o post
Compartilhar em outros sites

$s = addslashes($s);

$s = htmlspecialchars($s);

$s = str_replace("SELECT","",$s);

$s = str_replace("FROM","",$s);

$s = str_replace("WHERE","",$s);

$s = str_replace("INSERT","",$s);

$s = str_replace("UPDATE","",$s);

$s = str_replace("DELETE","",$s);

$s = str_replace("DROP","",$s);

$s = str_replace("DATABASE","",$s);

$s = str_replace("USE","",$s);

return $s;

 

o que acontece se alguem quiser escrever alguma das frases abaixo?

1. a minha database mental é gigante

2. quero que você use uma blusa verde

3. vou dar um update no meu sistema

4. ja comi todo meu drops

5. quero que você delete isso da memoria

6. esse é um fato inserto*

7. li uma materia na revista select

 

*

sim, inserto com S, afinal, você não pode impedir que pessoas burras postem comentários

 

 

segurança não é ignorar, ou transformar a 'suposta ação errada' em certa!

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim, mas algo mais complexo

você precisa avaliar, saber se em uma frase ha codigos que representem risco num contexto

se você checar palavra por palavra sempre ira encontrar alguma que se encaixe como injection

 

 

a minha database mental é gigante

contem uma palavra que se encaixa como uma tentativa de injection - mas apenas verificando de forma isolada, dentro do contexto, a palavra 'database' é irrelevante

 

você pode fazer flags - marcações do tipo

. identifique as palavras criticas

. uma determinada frase contem 3 palavras marcadas como criticas

. essa frase contem 2 palavras criticas juntas

. essa frase contem um plic (') antes de uma palavra critica

. um plic sempre é critico e normalmente ele precede as tentativas -> 'or''='

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

assim você faz uma analise de contexto e não individual

você terá uma frase marcada com as flags para verificar

 

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

excelente dica, tbm havia pensado nessa possibilidade

vou incrementar isso ao codigo,

voltando um pouco ao assunto, gostaria de saber um pouco mais sobre o injection codificado que o Andrey Knupp disse, algum artigo explicando um pouco mais sobre o que e e como evitar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara,addslashases,type casting e serviços recentes (impedindo por exemplo que burlem o addslashes por injeção no mysql através de charsets multi-byte como o BIG5).

Fora isso fazer filtragens per-request ao invés de filtragens globais,essas sendo mais restritivas (filtrar XSS,etc...).

Type-casting vai ainda te salvar uma vida no caso de NoSQL-Injection (array passing como parametro).

Vale lembrar que o addslashes e type-casting para algumas APIs high-leveis não se faz necessário,sendo o type-casting de qualquer modo interessante.

Para uma idéia de per-request validation,veja os validators da zend e seu uso em controladores como exemplo.

 

encripto em md5, e depois encripto em sha1 tentando evitar que as mesmas sejam decriptadas

Eu usaria sha1/sha256 em cima de uma substring da senha e talvez até um base64 em cima disso (dificulta timed blind SQL injections (veja a defcon 16 para mais informações) por aumentar a range de caracteres).

Seu sistema de cookie permite roubo de sessão.Coloque mais dados na hash do cookie para mais segurança,como ip e browser.Pela descrição,seria indicado usar sessões com essas mesmas propriedades que evitam o roubo da mesma (que no caso ainda é mais vulneravel que um cookie,já que pode ocorrer em server-side (ls /tmp) ou em client-side (document.write(document.cookie);, método trace para HTTP-Only cookies)..

Fora isso seu approach inicial poderia ser burlado variando o case da string ou ainda adicionando comentários multi-line no meio dela,o que em muitos DBs é aceitavel,inclusive em algumas versões do mysql.

Exemplo:

unIoN sEleCt 1

uni/**/on sele/**/ct 1

Para que a injeção codificada aconteça é necessario acesso a funções de query como a exec,e isso não se faz possivel em vários ambientes.O usuario passaria uma string codificada ao exec,como por exemplo exec(0x756e696f6e2073656c6563742031) que é union select 1 codificado em hex que sofre decodificação automatica em vários dbs.

A,e mesmo tendo essas funções filtradas,caso uma injeção fosse possivel,isso seria desinteressante para você.Eu poderia por exemplo descobrir os usuarios /etc/passwd através de um -1 or (SUBSTRING(load_file(nome do arquivo codificado), n, n)=x and sleep(30)=0) e escrever um script para variar n,x e em base do timeout da resposta me indicar se a letra equivale ou não a que eu coloquei.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.