WebRodrigo Posted February 21, 2012 Share Posted February 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 to comment Share on other sites More sharing options...
Carlo Schneider Posted February 21, 2012 Share Posted February 21, 2012 Eu uso assim: foreach($_POST as $key => $value){ $_POST[$key] = strip_tags(addslashes($value)); } Com POST e GET. Link to comment Share on other sites More sharing options...
ESerra Posted February 21, 2012 Share Posted February 21, 2012 Pra que toda esta gambiarra? Use prepared statements (PDO, mysqli) e pronto. 1 Link to comment Share on other sites More sharing options...
Jarbas - Blaster Web Posted February 21, 2012 Share Posted February 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 to comment Share on other sites More sharing options...
Tsudaka Posted April 9, 2012 Share Posted April 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 to comment Share on other sites More sharing options...
Jesmarcelo Posted April 9, 2012 Share Posted April 9, 2012 O magic_quotes está deprecado, ou seja, não recomendo utilizar essa função. Link to comment Share on other sites More sharing options...
Guest Posted April 9, 2012 Share Posted April 9, 2012 É uma ótima dica, más o mod_security faz este serviço para mim :-) Link to comment Share on other sites More sharing options...
redirect Posted April 9, 2012 Share Posted April 9, 2012 O magic_quotes está deprecado, ou seja, não recomendo utilizar essa função. recomenda alguma em para substituir ela? Link to comment Share on other sites More sharing options...
Jesmarcelo Posted April 9, 2012 Share Posted April 9, 2012 Apenas mysql_real_escape_string() Link to comment Share on other sites More sharing options...
redirect Posted April 9, 2012 Share Posted April 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 to comment Share on other sites More sharing options...
Recommended Posts