Problem creating SQL INJECTION security

Asked

Viewed 82 times

-1

I have a PHP function where I pass the data to it and the same gives an UPDATE in the data. however I am doing security against SQL INJECTION, only that it is not working what would be the problem? Follow the code of 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();

}

OBS.: 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'
  • With prepare the update normally looks like the following : update tabela set campo1=?, campo2=?...

  • When do you apply the validation of SQL INJECTION? The code snippet that posted only mounts the query.

  • @Djalmamanfrin I am first redoing my functions, then I will work with validations

1 answer

0


I suggest you read more about PDO

Try to change this

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

for

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

That would make the code complete:

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 the syntax link SET MYSQL

  • Um, it’s just that in Insert I do with : and it looks like this: $adc_sintaxe.= ":".$adc_campos[$adc_aux].", ";

  • and work perfectly, it’s normal?

  • 1

    You should organize your code more, use standards, it’s a mess, review the links I mentioned

  • Okay I gave a read, I made your change but it does not occur the UPDATE, I think there is some error in the part to set the value, I updated the code

  • Dude actually ":" is in the code along with "=", thanks for your help! now it’s working.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.