mendofh 0 Denunciar post Postado Fevereiro 3, 2010 Bom dia pessoal, estou com um problema. Sou iniciante em php e criei um site para cadastro de curriculos, porem estou com medo que o site sofra algum ataque. Dei uma lida de como bloquear o site contra sql injection e nao entendi muita coisa. Vou postar um dos meus codigos e se alguem poder me mostrar como ficaria meu codigo protegido eu agradeceria. Muito Obrigado. <html> <head> <title>Cadastro de Curriculum</title> <script language='JavaScript'> function SomenteNumero(e){ var tecla=(window.event)?event.keyCode:e.which; if((tecla > 47 && tecla < 58 || tecla == 9)) return true; else{ if (tecla != 8) return false; else return true; } </script> <style type="text/css"> <!-- .titulo { font-size: 18px; color: #FFF; } .Sub-titulo { color: #FFF; font-weight: bold; font-size: 16px; } .Ds-Dados { font-size: 12px; } --> </style> </head> <body> <?php function ConverteData($Data){ if (strstr($Data, "/"))//verifica se tem a barra / { $d = explode ("/", $Data);//tira a barra $rstData = "$d[2]-$d[1]-$d[0]";//separa as datas $d[2] = ano $d[1] = mes etc... return $rstData; } elseif(strstr($Data, "-")){ $d = explode ("-", $Data); $rstData = "$d[2]/$d[1]/$d[0]"; return $rstData; }else{ return "Data invalida"; } } if ($submit) { if (!$cpf || !$pass || !$email || !$email2 || !$confirma_senha) { $error = "Favor preencher todos os campos!"; } else { if($pass == $confirma_senha && $email == $email2) { include"conecta.php"; $resultado = mssql_query("select * from Candidato where CodCandidato = '$cpf'"); //$conferir = mssql_result($resultado, 0, 'CodCandidato'); $qt_registro = 0; $qt_registro = mssql_num_rows ($resultado); $dia = date(d); $mes = date(m); $ano = date(y); $h_data = $dia .'/' .$mes .'/20' .$ano; $criacao = ConverteData($h_data); //VERIFICA SE O FORMULÁRIO FOI ENVIADO if($_POST["verOK"]) { //RECEBE OS DADOS DO FORMULÁRIO $cpf = $_POST["cpf"]; //VERIFICA SE O QUE FOI INFORMADO É NÚMERO if(!is_numeric($cpf)) { $status = false; } else { //VERIFICA if( ($cpf == '11111111111') || ($cpf == '22222222222') || ($cpf == '33333333333') || ($cpf == '44444444444') || ($cpf == '55555555555') || ($cpf == '66666666666') || ($cpf == '77777777777') || ($cpf == '88888888888') || ($cpf == '99999999999') || ($cpf == '00000000000') ) { $status = false; } else { //PEGA O DIGITO VERIFIACADOR $dv_informado = substr($cpf, 9,2); for($i=0; $i<=8; $i++) { $digito[$i] = substr($cpf, $i,1); } //CALCULA O VALOR DO 10º DIGITO DE VERIFICAÇÂO $posicao = 10; $soma = 0; for($i=0; $i<=8; $i++) { $soma = $soma + $digito[$i] * $posicao; $posicao = $posicao - 1; } $digito[9] = $soma % 11; if($digito[9] < 2) { $digito[9] = 0; } else { $digito[9] = 11 - $digito[9]; } //CALCULA O VALOR DO 11º DIGITO DE VERIFICAÇÃO $posicao = 11; $soma = 0; for ($i=0; $i<=9; $i++) { $soma = $soma + $digito[$i] * $posicao; $posicao = $posicao - 1; } $digito[10] = $soma % 11; if ($digito[10] < 2) { $digito[10] = 0; } else { $digito[10] = 11 - $digito[10]; } //VERIFICA SE O DV CALCULADO É IGUAL AO INFORMADO $dv = $digito[9] * 10 + $digito[10]; if ($dv != $dv_informado) { $status = false; } else $status = true; }//FECHA ELSE }//FECHA ELSE(is_numeric) }//FECHA IF($_POST) if($qt_registro >= 1) { $error = "CPF já consta em nosso banco de dados"; } else { if($_POST["verOK"]) { if($status) { $cpass = base64_encode($pass); mssql_query("INSERT INTO Candidato (CodCandidato, Email, Pass) VALUES ($cpf, '$email', '$cpass')"); mssql_query("INSERT INTO ComplementoCandidato (CodCandidato, NroCpf) VALUES ($cpf, '$cpf')"); mssql_query("INSERT INTO CandidatoWeb (CodCandidato, Ultima_atualizacao) VALUES ($cpf, '$criacao')"); //mssql_query("INSERT INTO idiomascandidato (CodCandidato) VALUES ($cpf)"); } else { $error = "CPF é INVÁLIDO"; ?> <script language="JavaScript"> alert('CPF INVALIDO'); location.href="cadastro_login.php"; </script> <?php } } ?> <script language="JavaScript"> alert('Cadastro OK'); //location.href="index.php?cpf=<?php echo($cpf) ?>& email=<?php echo($email) ?>"; location.href="index.php"; </script> <?php } mssql_close($con); } else{$error = "Senha ou email nao confere!";} } } if (!$submit || $error) { echo $error; ?> <form method="post" action="<?php echo $PHP_SELF ?>"> <p> </p> <center> <table width="970" border="3"> <tr> <td align="center" bgcolor="#0000CC"><strong class="titulo"><em>Cadastramento de Candidato</em></strong></td> </tr> </table> </center> <p> </p> CPF: <input type="text" name="cpf" id="cpf" maxlength="11" onkeypress='return SomenteNumero(event)' value="<?php echo $cpf ?>"><br> Senha: <input type="password" name="pass" id="pass" size="56" maxlength="10" value="<?php echo $pass ?>"><br> Confirma Senha: <input type="password" name="confirma_senha" id="confirma_senha" size="56" maxlength="10" maxlength="20" value="<?php echo $confirma_senha ?>"><br> Email: <input type="text" name="email" id="email" size="56" maxlength="40" value="<?php echo $email ?>"><br> Confirma Email: <input type="text" name="email2" id="email2" size="56" maxlength="40" value="<?php echo $email2 ?>"> <input type="Submit" name="submit" value="Next"> <input type="hidden" name="verOK" value="1"> <?php } // end if ?> </body> <p> </html> Muito Obrigado! Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Fevereiro 3, 2010 Neste tópico tem várias explicações simples sobre o tema e sobre como se proteger. Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
mendofh 0 Denunciar post Postado Fevereiro 3, 2010 Neste tópico tem várias explicações simples sobre o tema e sobre como se proteger. Carlos Eduardo Dei uma olhada em todos, vi muitas funções de proteção porém não sei utilizalas. Quando, como, onde eu devo charma a funcao? por exemplo quero usa essa funcao: function anti_injection($sql) { // remove palavras que contenham sintaxe sql $sql = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$sql); $sql = trim($sql);//limpa espaços vazio $sql = strip_tags($sql);//tira tags html e php $sql = addslashes($sql);//Adiciona barras invertidas a uma string return $sql; } ?> Caso eu queria usar essa variavel eu vou precisar por "anti_injection($nome);" em todas variaveis que eu for usando na query? Compartilhar este post Link para o post Compartilhar em outros sites
The XeoN 0 Denunciar post Postado Fevereiro 3, 2010 Sinceramente cara, isso ai e tudo gambiarra. O melhor jeito para evitar sql inject, é usar uma biblioteca, como o PDO. Eu uso, e nunca tive problemas. http://br2.php.net/manual/en/book.pdo.php da uma lida ae. Compartilhar este post Link para o post Compartilhar em outros sites
Willian Gustavo Veiga 0 Denunciar post Postado Fevereiro 3, 2010 Também voto no PDO. Um abraço :) Compartilhar este post Link para o post Compartilhar em outros sites
mendofh 0 Denunciar post Postado Fevereiro 3, 2010 Sinceramente cara, isso ai e tudo gambiarra. O melhor jeito para evitar sql inject, é usar uma biblioteca, como o PDO. Eu uso, e nunca tive problemas. http://br2.php.net/manual/en/book.pdo.php da uma lida ae. Nossa não entendi nada. hehe Compartilhar este post Link para o post Compartilhar em outros sites
RobertoPC 0 Denunciar post Postado Fevereiro 4, 2010 Primeiro vou te dar uma noção de como funciona o SQLInjection, é o seguinte. Primeiro visualize a sequinte instrução sql: SELECT * FROM tabela WHERE usuario = '$_POST['usuario']' AND senha = '$_POST['senha']'; Então, nesse caso só vai retornar algum resultado se o usuário e a senha forem iguais as do banco, ou seja, só vai logar se for os mesmos do banco, até ai normal. O problema que acontece é que as variáveis $_POST não possuem tratamento, então o que você digitar no campo do formulário, será inserido na instrução sql, digamos que os valores de $_POST['usuario'] e $_POST['senha'] sejam 'joao' e '123', a instrução vai ficar dá seguinte maneira: SELECT * FROM tabela WHERE usuario = 'joao' AND senha = '123'; Mas imagine que o cara seja malicioso e queira invadir seu sistema, com um usuário inválido, ele pode utilizar a seguinte instrução no formulário: SELECT * FROM tabela WHERE usuario = 'joao' AND senha = '' OR 1 = '1'; Nesse caso a variável $_POST['usuario'] é igual a "joão", mas a variável $_POST['senha'] é igual a "' OR 1 = '1", ou seja será inserido uma condição na instrução, que será sempre verdadeira, porque 1 sempre será igual a 1. Ou seja, sistema invadido! Mas pode acontecer de o cara ser mais malicioso e utilizar uma instrução para apagar todos os dados do banco, utilizando instruções DROP, DELETE entre outras. E pode também fazer o que ele quiser com o seu banco de dados. Para evitar isso nós devemos validar os dados inseridos nos formulários e também os passados por url(http://www.site.com/index.php?variavel=valor), para evitar outros tipos de ataque. Para isso basta apagarmos ou escaparmos os seguintes caracteres (') e ("). E para evitar outros tipos de ataque, apagar ou escapar os caracteres (<) e (>). Como?! Há várias formas de fazer isso, eu uso dessa maneira: //Apagando os caracteres ', ", < e > $usuario = ereg_replace("['\"<>]","",$_POST['usuario']); $senha = ereg_replace("['\"<>]","",$_POST['senha']); //Escapando os caracteres ', ", < e > $usuario = addslashes($_POST['usuario']); // ' vira \' e " vira \" $usuario = str_replace("<","<",$usuario); // < vira < $usuario = str_replace(">",">",$usuario); // > vira > $senha = addslashes($_POST['senha']); // ' vira \' e " vira \" $senha = str_replace("<","<",$senha); // < vira < $senha = str_replace(">",">",$senha); // > vira > Existem outras maneira de fazer mas essa é a que eu utilizo. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif vlw Compartilhar este post Link para o post Compartilhar em outros sites
mendofh 0 Denunciar post Postado Fevereiro 4, 2010 Obrigado RobertoPC ! Vou testar aqui esse modo que você faz pois aqueles POD é mto dificil Compartilhar este post Link para o post Compartilhar em outros sites
Will Fernando 2 Denunciar post Postado Fevereiro 4, 2010 tem uma funcao tambem mysql_real_escape que pode ajuda... creio que para o seu caso seja o mais indicado, caso fosse trabalhar com mysqli ou DAO ae tem outras funcões =] como os amigos disseram la do PDO... de uma olhada tambem no topico que o matias indico.. valww Compartilhar este post Link para o post Compartilhar em outros sites
mendofh 0 Denunciar post Postado Fevereiro 4, 2010 tem uma funcao tambem mysql_real_escape que pode ajuda... creio que para o seu caso seja o mais indicado, caso fosse trabalhar com mysqli ou DAO ae tem outras funcões =] como os amigos disseram la do PDO... de uma olhada tambem no topico que o matias indico.. valww Como que utilizo esse mysql_real_escape ? Poderia me mandar um exemplo? obrigado Compartilhar este post Link para o post Compartilhar em outros sites
Denis Lins 0 Denunciar post Postado Fevereiro 4, 2010 http://br.php.net/manual/en/function.mysql-real-escape-string.php ;) Compartilhar este post Link para o post Compartilhar em outros sites
Williams Duarte 431 Denunciar post Postado Fevereiro 4, 2010 Sempre em apresentações sobre segurança no PHP elas ficam muito superficiais e essa conseguiu ir além http://www.phpit.com.br/artigos/construindo-uma-aplicacao-php-a-prova-de-balas.phpit Compartilhar este post Link para o post Compartilhar em outros sites
Will Fernando 2 Denunciar post Postado Fevereiro 4, 2010 bah bem legal a apresentação =] Compartilhar este post Link para o post Compartilhar em outros sites
mendofh 0 Denunciar post Postado Fevereiro 5, 2010 Sempre em apresentações sobre segurança no PHP elas ficam muito superficiais e essa conseguiu ir além http://www.phpit.com.br/artigos/construindo-uma-aplicacao-php-a-prova-de-balas.phpit Muito boa essa apresentação.Obrigado. Compartilhar este post Link para o post Compartilhar em outros sites