Ir para conteúdo
Fórum Script Brasil
  • 0

Projeto semiLaravel, dia bem difícil


Frank K Hosaka

Pergunta

O meu código PHP usa um query builder bem simples (PDO->query()), mas na semana passada o Copilot viu o meu código e ele comentou que ele é vulnerável a um ataque do tipo "injeção de SQL", ele sugeriu eu separar a consulta dos parâmetros da consulta. Já que preciso mudar a minha query builder, então que seja mais ou menos no formato do Eloquent, mas hoje o dia foi terrível, eu e o Copilot ficamos o dia todo preso nesse código:

if ($lcto) {
            $btnMenu = "Acrescenta Lançamento";
        } else {
            $lcto = tbdiario::orderBy('lcto', 'DESC')->select('lcto')[0]->lcto+1;
        }
        $dia = isset($_SESSION['dia']) ? $_SESSION['dia'] : date('Y-m-d');
        $ativo = tbconta::select('*', [['conta', '<', 201]]);

O Copilot trabalhou duro, e várias vezes ele reclamou que a minha codificação é uma porcaria; tentei fazer do jeito dele, e não deu certo.

Exausto, o Copilot me sugeriu executar uma consulta de cada vez, e para a minha perplexidade, eles funcionam de maneira separada. Eu inverti a ordem da consulta, e o código andou.

O Copilot pensou, pensou e pensou e concluiu que o problema era a função orderBy( ). Ele inventou um comando do tipo reset para a função orderBy( ), e agora consigo executar o meu programa do jeito que eu listei. A seguir eu mostro o query builder que eu chamei de semiLaravel. O Laravel coloca todas as classes na pasta Model, no PHP eu não trabalho com nenhuma pasta. No caso do banco de dados, eu joguei tudo dentro do arquivo config.php, assim:
 

listagem parcial do arquivo config.php
class bd {
    private static $pdo;
    private static $initialized = false;
    private static $orderBy = '';

    static function initialize() {
        if (!self::$initialized) {
            $dsn = 'mysql:host=' . HOST . ';dbname=' . DBNAME;
            self::$pdo = new PDO($dsn, USER, PASSWORD);
            self::$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            self::$initialized = true;
        }
    }

    protected static function getPdo() {
        self::initialize();
        return self::$pdo;
    }

    protected static function getTableName() {
        return ''; // Será implementado na classe filha
    }

    public static function orderBy($column, $direction = 'ASC') {
        self::$orderBy = "ORDER BY $column $direction";
        return new static;
    }

    public static function select($columns = '*', $conditions = []) {
        self::initialize();
        $table = static::getTableName();
        if (is_array($columns)) {
            $columns = implode(', ', $columns);
        }
        $whereClause = '';
        if (!empty($conditions)) {
            foreach ($conditions as $condition) {
                $field = $condition[0];
                $operator = $condition[1];
                $value = $condition[2];
                $whereClause .= "$field $operator :$field AND ";
            }
            $whereClause = 'WHERE ' . rtrim($whereClause, ' AND ');
        }
        $sql = "SELECT $columns FROM $table $whereClause";
        if (self::$orderBy) {
            $sql .= ' ' . self::$orderBy;
            self::$orderBy = ''; // Reset orderBy after use
        }
        $stmt = self::getPdo()->prepare($sql);
        if (!empty($conditions)) {
            foreach ($conditions as $condition) {
                $field = $condition[0];
                $value = $condition[2];
                $stmt->bindValue(":$field", $value);
            }
        }
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_OBJ);
    }
}

class tbdiario extends bd {
    protected static function getTableName() {
        return 'tbdiario';
    }
}

class tbconta extends bd {
    protected static function getTableName() {
        return 'tbconta';
    }
}

class tbusuarios extends bd {
    protected static function getTableName() {
        return 'tbusuarios';}}

?>

 

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,1k
×
×
  • Criar Novo...