Ir para conteúdo
Omar~

[Resolvido] sql-inject quando não dar para impedir!

Recommended Posts

8 horas atrás, Omar~ disse:

Mesmo porque nada que a pessoa faça garante 100% de segurança. O que ele pode fazer e enfiar segurança por cima de segurança, que vai deixar a aplicação lenta e ainda não é totalmente confiável.

Pior que isso tem um fundo de verdade... mesmo que sua aplicação esteja "blindada", às vezes o ambiente em que ela está inserida, o sistema, a versão do PHP/mysql, a rede ou alguma dependência está vulnerável.

Bons exemplos de coisas que fogem do nosso controle são o Heartbleed e os últimos Spectre e Meltdown.

O fato é: mesmo assim quase todos dessa lista podem ser estudados, melhorados e gerenciados até um certo nível. Por isso nunca devemos ser negligentes com a segurança do nosso app.

 

8 horas atrás, Omar~ disse:

Como sugestão que é como uso uma classe Exeption personalizada que ofusca os erros

Sim, você falou uma boa verdade aqui. Apenas silenciar os erros, como eu sugeri, não é a melhor solução, mas é mais fácil nesse assunto de PDO x segurança.

O caminho correto é sempre tratar os erros e não silenciá-los, exatamente como você disse.

 

Apenas para complementar caso alguém caia de paraquedas aqui: capture os erros a partir de exceções (PDO::ERRMODE_EXCEPTION) e não através de warnings (PDO::ERRMODE_WARNING).

Esse cuidado com o ERRMODE de qualquer forma precisa existir. O error_reporting() também é uma definição importante nesse assunto.

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Omar~ como que você ta ofuscando os erros em produção? Dei uma lida no seu código, mas não consegui compreender como você ta tratando isso, que no caso é disparar um erro personalizado pro usuário e em seguida fazer um log original do erro em um arquivo oculto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@BrunoBit, citando o código do Omar, em relação à conexão:

try {
    if (self::$isConnect == null) {
        $dsn = 'mysql:host=' . self::$host . '; dbname=' . self::$data;
        $options = [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8'];
        self::$isConnect = new PDO($dsn, self::$user, self::$pass, $options);
    }
} catch (PDOException $error) {
    die("<br>Não foi possível conectar com o banco de dados!<br Descrição: {$error->getMessage()}<br>");
}

 

Programa, tente (try) conectar com o PDO. Em caso de erros, capture (catch) o resultado, imprima-o e encerre (die) a execução.

Procure por Exceptions e try/catch.

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fugiu do contexto.... Mas dúvida é dúvida.

 

Exemplo da classe:

Spoiler

<?php
class ConstException extends Exception {
    const MISC_RETURN = 0;
    const INVALID_ACESS = 1;
    const INVALID_POST = 2;
    const INVALID_PAGE = 3;
    const SYSTEM_ERROR = 4;

}

 

 

Exemplo de execução

Spoiler

<?php
try {
    if ($session->user != 'admin') {
        throw new ConstException('X-X-X', ConstException::INVALID_ACESS);
    }
} catch (ConstException $e) {
    switch ($e->getCode()) {
        case ConstException::INVALID_ACESS:
            /* Isso é para mostrar para o usuário alguma coisa sem revelar a ele 
             * o que meu sistema está gerando
             */
            echo "Você não tem altorização de acessar isso!";

            /* Coloco aqui os métodos que vai fazer o resgistro de LOG
             * Assim sendo posso informar para o log o que de fato aconteceu e
             * só mostrar o texto acima para o usuário
             * Por exemplo o $e->getMessage() vai imprimir 'X-X-X' o mesmo que
             * foi definido anteriormente
             */
            break;
    }
}

 

 

Mas não sei se tem jeito melhor de fazer. Só sei que inventei esse jeito na gabiarra e funciona muito bem para tratar de erros.

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

×

Informação importante

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