Jump to content
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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.