Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá. gostaria de saber se alguma das formas que eu uso para fazer uma verificação no banco de dados pode ser vulneravel a SQL injection
dados do sistema PHP OO 7.0.9 PDO
dizem que o PDO em si é uma ferramenta poderosa contra a injeção, mas como novato acabei de me formar, estou desenvolvendo um sistema próprio para uso meu para ir treinando, então vamos la,
eu fazia consultas da seguinte forma.
public function dados_user($usuario){
try {
$this->Select = $this->Conn->prepare("SELECT * FROM users WHERE username = '{$usuario->get_username()}'");
$this->Select->execute();
if($this->Select->rowCount() == 1){
$dados = $this->Select->fetchAll(PDO::FETCH_ASSOC);
return $dados;
}
} catch (PDOException $exc) {
exibeMensagens("Erro ao consultar. {$exc->getMessage()}", WS_ERROR);
}
}
agora estava lendo no manual do php e conheci a seguinte função => bindParam
então estou agora fazendo a função de pesquisa desta forma
public function fazer_login($usuario){
try{
$nome = $usuario->get_username();
$senha = $usuario->get_password();
$query = "SELECT * FROM users WHERE username = :nome AND password = :senha";
$this->Select = $this->Conn->prepare($query);
$this->Select->bindParam(':nome', $nome, PDO::PARAM_STR);
$this->Select->bindParam(':senha', $senha, PDO::PARAM_STR);
$this->Select->execute();
if($this->Select->rowCount() == 1){
$dados = $this->Select->fetch(PDO::FETCH_ASSOC);
return $dados;
}
} catch (PDOException $ex) {
exibeMensagens($Msg, $ErrNo);
}
}
existe alguma diferença entre a proteção das duas? já que no primeiro caso eu insiro o get do objeto direto na query, e no segundo passa pelo bind, é mais eficaz o segundo metodo? se não
qual a melhor forma de me proteger de SQL Injection??
só para lembrar vou deixar uma função aqui, costumo sempre seguir esta syntax
IF(ISSET($_POST['logar'])){
$nome = filter_input(INPUT_POST, 'nome' ,FILTER_SANITIZE_STRING ,FILTER_FLAG_ENCODE_AMP);
$senha = filter_input(INPUT_POST, 'senha',FILTER_SANITIZE_STRING ,FILTER_FLAG_ENCODE_AMP);
$nome = limpar_stringl($nome);
$nome = addslashes($nome);
IF ($nome == "" || $senha == ""){
$errors .= "✖ Campos vasios!<br>";
}ELSE IF($nome != "" && $senha != ""){
$userPDo = new UsuarioPdo();
$dados = $userPDo->estou_banido($nome);
if($dados == TRUE){
$sessao = new Sessao();
$sessao->banSessao();
}else{
$_username = $nome;
$header = new HeaderPdo();
$_password = $header->criptografia_Hash_MD5($senha);
$usuario = new Usuario($_username, $_password);
$tentativa = new UsuarioPdo();
$logou = $tentativa->fazer_login($usuario, $_password);
IF($logou == TRUE){
$sessao = new Sessao();
$sessao->carregaSessao($logou);
}else{
$errors .="✖ Dados invalidos!";
}
}
}
}
note que uso apenas o filter_input, limpar_stringl(um metodo que criei com replace para tirar alguns caracteres), e addslashes;Carregando comentários...