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

duvidas lógica e segurança de banco


Eric Freitas

Pergunta

bom pessoal tento trabalhar em MVC mas não sei se estou trabalhando de maneira correta tenho um arquivo que recebe todas minhas requisições seja ela quais forem ele instancia o Receive e da o load nas bibliotecas aqui coloquei só uma biblioteca (musica: musicaView musicaModel e musicaController).

recebe um array ou um array de objetos que é transformado em json para ser trabalhado no JS

root/ajax/search.php

<?php
include('../application/view/Request.php');

include('../application/model/MusicaModel.php');
include('../application/controller/MusicaController.php');
include('../application/view/MusicaView.php');

require_once('../application/Receive.php');
include('../application/controller/DAO.php');

$r = new  Receive();
echo utf8_encode(json_encode($r->getArr()));
?>
O Receive ao ser iniciado já cria os parametros que serão utilizados nas querys com o banco esses parametros são passados por get então (?) tem como alguém fazer um injection no meu banco alterando esses parametros já que e esses serão utilizados diretamente no meu banco? root/application/Receive.php
class Receive {
    
    private $arr;
    function Receive(){
        $params = new Request();
        $params = $params->getActionsRequest();
        
        $obj = isset($params['obj']) ? $params['obj'] : null;
        $q = isset($params['q']) ? $params['q'] : null;;
        
        $condicoes = isset($params['where']) ? $params['where'] : null;
        
        $order = isset($params['order']) ? $params['order'] : null;
        $limit = isset($params['limit']) ? $params['limit'] : null;
        
        
        eval("\$view = new $obj(); "); 
        switch($q){
            case 'insert':
                $this->arr = $view->doInsert();
                break;
            case 'delete':
                $this->arr = $view->doDelete();
                break;
            
            case 'update':
                $this->arr = $view->doUpdate();
                break;
            case 'getlist':
                $this->arr = $view->doGetList($condicoes,$order,$limit);
                break;
            default:
                $this->arr['error'] = 'Ação desconhecida';
                break;
        }    
    }
    public function getArr(){
        return $this->arr;
    }
}
O arquivo Request é responsavel por receber todos os posts e gets enviados esses dados também vem do js se forem alterados os valores aqui também pode sofrer algum tipo de ataque? essa é uma classe importante ela que praticamente cria os objetos e as ações de toda a aplicação.
class Request {
    public function postObjectRequest($obj){
        $class_name = get_class($obj);
        eval("\$obj = new $class_name();");
        foreach ($_POST as $key=>$value){
            if(isset($_POST[$key])) eval("\$this->$class_name\->$key = \$value;");
        }
        return $obj;
    }
    
    public function getActionsRequest(){
        $r = null;
        foreach ($_GET as $key=>$value){
            if(isset($_GET[$key])) eval("\$r['$key'] = \$value;");
        }
        return $r;    
    }
    
}
Musica view irá ser responsavel por qualquer ação do sistema e retornará um array contendo erros ou objeto (s) root/application/views/MusicaView.php
class MusicaView {
    private $MusicaModel;
    private $MusicaController;
    public function MusicaView(){
        $this->MusicaModel = new MusicaModel();
        $Request =  new Request();
        $this->MusicaModel = $Request->postObjectRequest($this->MusicaModel);
         
        $this->MusicaController = new MusicaController();
        
    }
    
    public function doInsert(){
        return $this->MusicaController->doInsert($this->MusicaModel);
        
    }
    
    public function doDelete(){
        return $this->MusicaController->doDelete($this->MusicaModel);
        
    }
    
    public function doUpdate(){
        return $this->MusicaController->doUpdate($this->MusicaModel);
        
    }
    
    public function doGetList($condicoes = null, $order = null, $limit = null){
        return $this->MusicaController->doGetList($this->MusicaModel,$condicoes,$order,$limit);
    }

}
MusicaModel irá conter os atributos especificos de cada classe root/application/views/MusicaView.php
class MusicaModel {
    public $id;
    public $album_id;
    public $nome;
    public $embed;
}
e o MusicaController seria encarregado de qualquer interação com DB atraves de uma classe dao
class MusicaController {
    private $DAO;
    
    function MusicaController(){
        $this->DAO = new DAO();
    }
    
    public function doInsert($obj){
        return false;
    }
    
    public function doDelete($obj){    
        return false;
    }
    
    public function doUpdate($obj){
        return false;
    }
    
    public function doGetList($obj,$condicoes = null, $order = null, $limit = null){
        $arr = $this->DAO->getList($obj,$condicoes, $order, $limit);
        return $arr;
    }
    
}
essa classe dao php sim é resposavel por toda e qualquer interação com o banco. ainda não terminei todas as funções mas não falta muito e esse também não é o foco da minha discução
class DAO {
    private $conn;
    function DAO(){
        $this->conn = mysql_connect('localhost','root','');
        mysql_selectdb('DB');
        mysql_set_charset('utf8', $this->conn);
        
    }
    
    public function insert($obj){
        $class_name = get_class($obj);
        $class_vars = get_class_vars($class_name);
        
        $sql = "INSERT";
        $sql.= "    INTO ".$class_name." (";
        $i = 1;
        foreach ($class_vars as $att => $val){
            if($i < sizeof($class_vars)) $sql.= $att.", ";
            else $sql.= $att." ";
            
            $i++;
        }$sql.=") VALUES ( ";
        foreach ($class_vars as $att => $val){
            if($i < sizeof($class_vars)) $sql.= $att.", ";
            else $sql.= $att." ";
            
            $i++;
        }
        
        return false;    
    }
    public function update($obj,$arrSpecificAtt = null){
        return false;
    }
    public function delete($obj){
        $class_name = get_class($obj);
        $class_vars = get_class_vars($class_name);
        
        $sql = "DELETE FROM ".$class_name;
        $sql.= " WHERE ".$class_name.".".$obj->id." LIMIT 1;";
        
        $query = mysql_query($sql);
        if (mysql_errno()) {
              $r['error'] = mysql_errno().": ".mysql_error()."\n<br>Executando:<br>\n$sql\n<br>";
              return $r;
        }else return true;
    }
    public function getList($obj, $condicoes = null, $order = null, $limit = null){
        
        
        $class_name = get_class($obj);
        $class_vars = get_class_vars($class_name);
        
        $i = 1;
        $sql = "SELECT ";
        foreach ($class_vars as $att => $val){
            if($i < sizeof($class_vars)) $sql.= $att.", ";
            else $sql.= $att." ";
            
            $i++;
        }
        $sql.= " FROM ".$class_name;
        if($condicoes != null) $sql.= " WHERE ".$condicoes;
        if($order != null) $sql.= " ORDER BY ".$order;
        if($limit != null) $sql.= " LIMIT ".$limit;
        
        $sql.= ";";
          
        $query = mysql_query($sql);
        if (mysql_errno()) {
              $r['error'] = mysql_errno().": ".mysql_error()."\n<br>Executando:<br>\n$sql\n<br>";
              return $r;
         }
        
        $row = null;
        while($row = mysql_fetch_object($query,$class_name)) $r[] = $row;
        
        if(mysql_num_rows($query) == 0 ) return true;
        
        $this->closeConn();
        
        return $r;
    }
    
    public function getListByQuery($sql,$obj, $condicoes = null, $order = null, $limit = null){
        $class_name = get_class($obj);
        $class_vars = get_class_vars($class_name);
        
        $query = mysql_query($sql);
        if (mysql_errno()) {
              $r['error'] = mysql_errno().": ".mysql_error()."\n<br>Executando:<br>\n$sql\n<br>";
              return $r;
         }
        
        $row = null;
        while($row = mysql_fetch_object($query,$class_name)) $r[] = $row;
        
        if(mysql_num_rows($query) == 0 ) return true;
        
        $this->closeConn();
        
        return $r;
    }

    private function closeConn(){
        mysql_close($this->conn);
    }
}

desde já agradesso por terem lido tudo isso xD

E aqui vai recebendo um parametro por post/get tem como alguém lançar um injection no meu banco?

já que esses estaão diretamente ligados ao DB, oque posso fazer para me prevenir disso.

com relação a captcha já estou implementando mas isso também não tem muito haver com a questão.

agora com relação a lógica funciona mas estou trabalhando de maneira correta estava tentando utilizar o zend framework mas não obtive sucesso não consegui criar nada utilizando o framework só erros que não sei nem explicar.

bom novamente obrigado!

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

No caso de prevenir o SQL Injection tem uma função que eu encontrei na internet bem legal

ai vai a função

function anti_injection($sql)
     {
 // remove palavras que contenham sintaxe sql
 $sql = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$sql);
 $sql = trim($sql);//limpa espaços vazio
 $sql = strip_tags($sql);//tira tags html e php
 $sql = addslashes($sql);//Adiciona barras invertidas a uma string
 return $sql;
 }


 //modo de usar pegando dados vindos do formulario
 $nome = anti_injection($_POST["nome"]);
 $senha = anti_injection($_POST["senha"]);

No caso do get é so troca post por get...

Link para o comentário
Compartilhar em outros sites

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,2k
    • Posts
      652k
×
×
  • Criar Novo...