Problem creating SQL INJECTION security

-1
  

I have a PHP function where I pass the data to it and the same as an UPDATE in the data. but I'm doing security against SQL INJECTION, but it's not working what would be the problem? Here is the code for the function:

function alterar($upd_tabela, $upd_condicao, $upd_dados){
# Armazenas os dados do array
$upd_campos = array_keys($upd_dados);
# contagem dos campos existentes
$upd_n_campos = count($upd_dados);
//Armazena as condicoes existentes que serão inseridas no WHERE 
$upd_campos_condicao = array_keys($upd_condicao);
//conta quantas condições são existentes
$upd_n_condicao = count($upd_condicao);
// Inicia a sintaxe 
$upd_sintaxe = "UPDATE ".$upd_tabela." SET "; 
//monta o resto da estrutura 
for($upd_aux=0; $upd_aux<$upd_n_campos; $upd_aux++){
    $upd_sintaxe.= $upd_campos[$upd_aux]."=".$upd_campos[$upd_aux].", "; 
}
//retira a ultima virgula 
$upd_sintaxe = substr($upd_sintaxe, 0, -2);
//abre o WHERE 
$upd_sintaxe.= " WHERE ";
//adiciona as condições  
for($upd_aux=0; $upd_aux<$upd_n_condicao; $upd_aux++){
    $upd_sintaxe.= $upd_campos_condicao[$upd_aux]."=".$upd_campos_condicao[$upd_aux]." ";
}
//chama a função global para fazer conexão com o Banco de dados
global $conexaobd;
//prepara a sintaxe 
$upd_preparado = $conexaobd->prepare($upd_sintaxe);
//sera os valores de cada campo 
for($upd_aux=0; $upd_aux<$upd_n_campos; $upd_aux++){
    if(!$upd_dados[$upd_campos[$upd_aux]]){
        echo $upd_dados[$upd_campos[$upd_aux]] = NULL;
    }
    $upd_preparado -> bindParam(":".$upd_campos[$upd_aux], $upd_dados[$upd_campos[$upd_aux]]);
}
//seta os valores de cada condição
for($upd_aux=0; $upd_aux<$upd_n_condicao; $upd_aux++){
    if(!$upd_condicao[$upd_campos_condicao[$upd_aux]]){
        echo $upd_condicao[$upd_campos_condicao[$upd_aux]] = NULL;
    }
    $upd_preparado -> bindParam(":".$upd_campos_condicao[$upd_aux], $upd_condicao[$upd_campos_condicao[$upd_aux]]);
}
//executa e retorna o UPDATE
return $upd_preparado->execute();
//Para debugar o código
$upd_preparado->debugDumpParams();

}

  

NOTE: When giving an echo in the syntax, the following appears: SQL: [44] UPDATE Categories SET Name = Name WHERE id = id

Params: 2 Key: Name: [5] :nome paramno=-1 name=[5] ":nome" is_param=1 param_type=2 Key: Name: [3] :id paramno=-1 name=[3] ":id" is_param=1 param_type=2'
    
asked by anonymous 27.07.2017 / 15:12

1 answer

0

I suggest you read more about PDO

Try changing this

$upd_sintaxe.= $upd_campos[$upd_aux].":".$upd_campos[$upd_aux].", "; 

for

$upd_sintaxe.= $upd_campos[$upd_aux]."= :".$upd_campos[$upd_aux].", "; 

So that would be the complete code:

function alterar($upd_tabela, $upd_condicao, $upd_dados){
# Armazenas os dados do array
$upd_campos = array_keys($upd_dados);
# contagem dos campos existentes
$upd_n_campos = count($upd_dados);
//Armazena as condicoes existentes que serão inseridas no WHERE 
$upd_campos_condicao = array_keys($upd_condicao);
//conta quantas condições são existentes
$upd_n_condicao = count($upd_condicao);
// Inicia a sintaxe 
$upd_sintaxe = "UPDATE ".$upd_tabela." SET "; 
//monta o resto da estrutura 
for($upd_aux=0; $upd_aux<$upd_n_campos; $upd_aux++){
    $upd_sintaxe.= $upd_campos[$upd_aux]."= :".$upd_campos[$upd_aux].", "; 
}
//retira a ultima virgula 
$upd_sintaxe = substr($upd_sintaxe, 0, -2);

//abre o WHERE 
$upd_sintaxe.= " WHERE ";
//adiciona as condições  
for($upd_aux=0; $upd_aux<$upd_n_condicao; $upd_aux++){
    $upd_sintaxe.= $upd_campos_condicao[$upd_aux]."= :".$upd_campos_condicao[$upd_aux]." ";
}
//chama a função global para fazer conexão com o Banco de dados
global $conexaobd;
//prepara a sintaxe 
$upd_preparado = $conexaobd->prepare($upd_sintaxe);
//sera os valores de cada campo 
for($upd_aux=0; $upd_aux<$upd_n_campos; $upd_aux++){
    if(!$upd_dados[$upd_campos[$upd_aux]]){
        echo $upd_dados[$upd_campos[$upd_aux]] = NULL;
    }
    $upd_preparado -> bindParam(":".$upd_campos[$upd_aux], $upd_dados[$upd_campos[$upd_aux]]);
}
//seta os valores de cada condição
for($upd_aux=0; $upd_aux<$upd_n_condicao; $upd_aux++){
    if(!$upd_condicao[$upd_campos_condicao[$upd_aux]]){
        echo $upd_condicao[$upd_campos_condicao[$upd_aux]] = NULL;
    }
    $upd_preparado -> bindParam(":".$upd_campos_condicao[$upd_aux], $upd_condicao[$upd_campos_condicao[$upd_aux]]);
}
//executa e retorna o UPDATE
 return $upd_preparado->execute();
//Para debugar o código
 //$upd_preparado->debugDumpParams();

}

Here is a syntax link SET MYSQL

    
27.07.2017 / 15:33