WebRodrigo Postado Fevereiro 21, 2012 Compartilhar Postado Fevereiro 21, 2012 Abaixo segue um Código que parace seguro até que o conheça e faça valer o contrário. <?php include("conexao.php"); $login = "admin"; $senha = "********"; $busca = "SELECT * FROM tabelaLogin WHERE login = '$login' OR 1 and senha = '$senha'"; $busca = "SELECT * FROM tabelaLogin WHERE login = 'admin' OR 1 and senha = '********'"; // ateh aqui pode se observar que esta tudo ok // o autenticacao vai acontecer normalmente pois foi fornecido o login e a senha de forma correta //------------------------------------------------------------------------------------------------------------------------- // mais digamos que eu nao tenha a senha e use o login = "admin" entao eu ja tenho 50 porcento de chance e // agora soh falta advinhar a senha certo ? // R: ERRADO se o site esta vuneravel a Injecao SQL eu praticamente ja tenho 100 porcento. $login = "admin"; $senha = "' or '1=1"; $busca = "SELECT * FROM tabelaLogin WHERE login = '$login' OR 1 and senha = '$senha'"; $busca = "SELECT * FROM tabelaLogin WHERE login = 'admin' OR 1 and senha = '' or '1=1'"; // por Logica o que se pode observar eh admin E nada OU 1 = true // V E F OU V = V // a busca vai retorna verdadeiro o seja Logado como ADMIN // isso para facil porque ja tem o login = admin, na verdade login nem eh necessario $login = "' or '1=1"; $senha = "' or '1=1"; $busca = "SELECT * FROM tabelaLogin WHERE login = '$login' OR 1 and senha = '$senha'"; $busca = "SELECT * FROM tabelaLogin WHERE login = '' or '1=1' OR 1 and senha = '' or '1=1'"; // por logica denovo nada OU 1 E nada OU 1 = true // F OU V E F OU V = V // denovo Logado sem a necessidade de nenhum dado de acesso //------------------------------------------------------------------------------------------------------------------------- Uma forma bastante que ajuda eh limitar no formulario o tamanho dos campos Login e Senha Outra maneira que realmente funciona eh filtrar todos dados retirando aspas simples, duplas, espacos em branco barras e tudo que nao seja digito e numero antes de inseri-los em uma busca sql. // retira os codigos html do login e retira as aspa simples $login = str_replace("'","",strip_tags($login)); // retira os codigos html da senha, retira as aspa simplese criptografa antes de compara-la no banco de dandos $senha = crypt(str_replace("'","",strip_tags($senha))); //Agora sim pode se dizer que o codigo esta um pouco seguro Feito pela PhpBrasil Link para o comentário Compartilhar em outros sites More sharing options...
Carlo Schneider Postado Fevereiro 21, 2012 Compartilhar Postado Fevereiro 21, 2012 Eu uso assim: foreach($_POST as $key => $value){ $_POST[$key] = strip_tags(addslashes($value)); } Com POST e GET. Link para o comentário Compartilhar em outros sites More sharing options...
ESerra Postado Fevereiro 21, 2012 Compartilhar Postado Fevereiro 21, 2012 Pra que toda esta gambiarra? Use prepared statements (PDO, mysqli) e pronto. 1 Link para o comentário Compartilhar em outros sites More sharing options...
Jarbas - Blaster Web Postado Fevereiro 21, 2012 Compartilhar Postado Fevereiro 21, 2012 Bacana tuas dicas Rodrigo, Injection é um problema muito sério que está ocorrendo hoje, como XSS também que é um técnica de injeção de cros-site-scripting. Criar um sistema que seja resistente a essas técnicas não é uma tarefa fácil, não é somente usando strip_tags() mysql_real_escape_string() ... . Eu quando prestando consultoria em desenvolvimento utilizo ou aconcelho a utilização de um Framework, seja PHP, Python, Ruby e mais, os frameworks já vem praparados pra essas situações, precisando apenas ligar/desligar. Como a maioria aqui desenvolve PHP segue uma dica de framework http://codeigniter.com/ tem uma curva de aprendizado muito curta e oferece recursos fantásticos. Fica a dica..... Link para o comentário Compartilhar em outros sites More sharing options...
Tsudaka Postado Abril 9, 2012 Compartilhar Postado Abril 9, 2012 Todas essas funções acabam modificando o que é inserido, francamente, usar str_replace ou strip_tags é um absurdo. O código abaixo preserva totalmente o que é inserido. function anti_sql_injection($str) { if (!is_numeric($str)) { $str = get_magic_quotes_gpc() ? stripslashes($str) : $str; $str = function_exists('mysql_real_escape_string') ? mysql_real_escape_string($str) : mysql_escape_string($str); } return $str; } ai é só chamar a função, exemplo $form_nome = anti_sql_injection($_POST['nome']); E se o valor for em números $form_cpf = (INT)$_POST['cpf']; Link para o comentário Compartilhar em outros sites More sharing options...
Jesmarcelo Postado Abril 9, 2012 Compartilhar Postado Abril 9, 2012 O magic_quotes está deprecado, ou seja, não recomendo utilizar essa função. Link para o comentário Compartilhar em outros sites More sharing options...
Visitante Postado Abril 9, 2012 Compartilhar Postado Abril 9, 2012 É uma ótima dica, más o mod_security faz este serviço para mim :-) Link para o comentário Compartilhar em outros sites More sharing options...
redirect Postado Abril 9, 2012 Compartilhar Postado Abril 9, 2012 O magic_quotes está deprecado, ou seja, não recomendo utilizar essa função. recomenda alguma em para substituir ela? Link para o comentário Compartilhar em outros sites More sharing options...
Jesmarcelo Postado Abril 9, 2012 Compartilhar Postado Abril 9, 2012 Apenas mysql_real_escape_string() Link para o comentário Compartilhar em outros sites More sharing options...
redirect Postado Abril 9, 2012 Compartilhar Postado Abril 9, 2012 Apenas mysql_real_escape_string() então eh soh fazer isso: $senha = mysql_real_scape_string($senha); $usuario = mysql_real_scape_string($usuario); ? Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados