Julio Cezar 2 Posted February 15, 2012 Report Share Posted February 15, 2012 (edited) Painel de controle, de um software.Como fazer neste código para eliminar sql injection.<?php // *************************************************************** // *************************************************************** session_start(); include('conexao.php'); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title><?php echo $titulo;?></title> <link href="netplus.css" rel="stylesheet" type="text/css" /> <style type="text/css"> body { background-color: #EAD270; } </style> <script src="SpryAssets/SpryValidationTextField.js" type="text/javascript"></script> <script src="SpryAssets/SpryTabbedPanels.js" type="text/javascript"></script> <link href="SpryAssets/SpryValidationTextField.css" rel="stylesheet" type="text/css" /> <link href="SpryAssets/SpryTabbedPanels.css" rel="stylesheet" type="text/css" /> </head> <body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0"> <table width="669" border="0" align="center"> <tr> <td colspan="3"><img src="imagens/cinema3.jpg" width="661" height="166" /></td> </tr> <tr> <td colspan="3"><table width="652" border="0" align="center"> <tr align="center" class="relatorio1"> <td width="135" class="txtAlertaBOX">Principal</td> <td width="187"><a href="index_sobre.php">Sobre o Sistema</a></td> <td width="174"><a href="index_downloads.php">Area de Downloads</a></td> <td width="138"><a href="index_contato.php">Contato</a></td> </tr> </table></td> </tr> <tr> <td> </td> <td> </td> <td> </td> </tr> <tr> <td> </td> <td> </td> <td> </td> </tr> <tr> <td width="62"> </td> <td width="62"> </td> <td width="531"> </td> </tr> <tr> <td colspan="3" align="center"><span class="txtAlertaBOX">Acesso ao CSPADM </span><br /> <table width="430" border="1" align="center"> <tr> <td align="right"><form id="form1" name="form1" method="post" action="?acao=validar_acesso"> <table width="339" border="0" align="center" cellpadding="2" cellspacing="2"> <tr> <td width="115"> </td> <td width="214"> </td> </tr> <tr> <td class="txtBOX"><div align="right">Usuario:</div></td> <td><label for="edt_login"></label> <input type="text" name="edt_login" id="edt_login" /></td> </tr> <tr> <td class="txtBOX"><div align="right">Senha:</div></td> <td><label for="edt_senha"></label> <input type="password" name="edt_senha" id="edt_senha" /></td> </tr> <tr> <td class="txtBOX"> </td> <td><input name="Validar" type="submit" class="txtBOX" id="Validar" value="Acessar o Sistema" /></td> </tr> </table> </form> <span class="edtBOX">Desenvolvido por <a href="mailto:julia@hotmail.com">JulianoSMI</a></span> </table></td> </tr> <tr> <td colspan="3" align="center" class="edtBOX"> </td> </tr> <tr> <td colspan="3" align="center" class="edtBOX"> </td> </tr> <tr> <td colspan="3" align="center" class="edtBOX"> </td> </tr> <tr> <td colspan="3" align="center" class="edtBOX"> </td> </tr> <tr> <td colspan="3" align="center" class="edtBOX"> </td> </tr> <tr> <td colspan="3" align="center" class="edtBOX"> </td> </tr> <tr> <td colspan="3" align="center" class="edtBOX">Todos os direitos Reservados.</td> </tr> </table> <?php if ($acao == "validar_acesso"){ if ($edt_login == "" || $edt_senha == ""){ echo "<script>window.alert('ERRO. Preenchimento obrigatorio Login / Senha Obrigatorio');</script>"; echo "<script>window.location='index.php';</script>"; } else { $sql="select * from usuario where (login='$edt_login') and (senha='$edt_senha')"; $exe=mysql_query($sql); $num=mysql_num_rows($exe); if ($num <=0){ $existe_revenda=0; } else { $existe_revenda=1; $tmp=mysql_fetch_array($exe); $usuario_situacao=$tmp[situacao]; if ($usuario_situacao == 0){ echo "<script>window.alert('ERRO. Login Inativo. Favor contactar o Administrador');</script>"; echo "<script>window.location='index.php';</script>"; } if ($usuario_situacao == 9){ echo "<script>window.alert('ATENCAO. Login Bloqueado. Favor contactar o Administrador');</script>"; echo "<script>window.location='index.php';</script>"; } if ($usuario_situacao == 1){ $_SESSION['acesso_idusuario']=$tmp[idusuario]; $_SESSION['acesso_idempresa']=$tmp[idempresa]; $_SESSION['acesso_admin']=$tmp[admin]; $_SESSION['acesso_revenda']=$tmp[revenda]; $idempresa=$tmp[idempresa]; $sql="select situacao from empresa where idempresa='$idempresa' and situacao=1"; $exe=mysql_query($sql); $num=mysql_num_rows($exe); if ($num >0){ echo "<script>window.location='principal.php';</script>"; } else { echo "<script>window.alert('ERRO. Seu acesso ao sistema esta temporariamente bloqueado. Favor contactar o Administrador do Sistema');</script>"; echo "<script>window.location='index.php';</script>"; } } } } if ($existe_revenda == 0){ $sql="select * from csp_user where (name='$edt_login') and (password='$edt_senha')"; $exe=mysql_query($sql); $num=mysql_num_rows($exe); if ($num <=0){ echo "<script>window.alert('ERRO. Acesso não permitido');</script>"; echo "<script>window.location='index.php';</script>"; } else { $tmp=mysql_fetch_array($exe); $usuario_situacao=$tmp[enabled]; if ($usuario_situacao == "false"){ echo "<script>window.alert('ERRO. Login Inativo. Favor contactar o seu Revendedor');</script>"; echo "<script>window.location='index.php';</script>"; } else { $_SESSION['acesso_idcliente']=$tmp[id]; $_SESSION['acesso_usuario']=$tmp[name]; $_SESSION['acesso_idempresa']=$tmp[idempresa]; echo "<script>window.location='portalcliente.php';</script>"; } } } } ?> <script type="text/javascript"> var sprytextfield1 = new Spry.Widget.ValidationTextField("sprytextfield1"); var TabbedPanels1 = new Spry.Widget.TabbedPanels("TabbedPanels1"); </script> </body> </html> Edited February 15, 2012 by Julio Cezar 2 Quote Link to comment Share on other sites More sharing options...
0 ESerra Posted February 15, 2012 Report Share Posted February 15, 2012 Use PDO. Quote Link to comment Share on other sites More sharing options...
0 Julio Cezar 2 Posted February 15, 2012 Author Report Share Posted February 15, 2012 na verdade entendo pouco muito pouco de PHP, por isso estou pedindo ajuda ate onde pesquisei é esta linha q esta deixando vulnerável:if ($acao == "validar_acesso"){ if ($edt_login == "" || $edt_senha == ""){ echo "<script>window.alert('ERRO. Preenchimento obrigatorio Login / Senha Obrigatorio');</script>"; echo "<script>window.location='index.php';</script>"; } else { $sql="select * from usuario where (login='$edt_login') and (senha='$edt_senha')"; $exe=mysql_query($sql); $num=mysql_num_rows($exe); if ($num <=0){ Quote Link to comment Share on other sites More sharing options...
0 ESerra Posted February 15, 2012 Report Share Posted February 15, 2012 Em todas as linhas onde os dados vem de alguma coisa que o usuário informa você sofre risco de sql injection, o mais simples no caso do PHP é usar PDO, assim o próprio sistema trata isto. Quote Link to comment Share on other sites More sharing options...
0 Willian Gustavo Veiga Posted February 15, 2012 Report Share Posted February 15, 2012 +1 para PDO.Um abraço. Quote Link to comment Share on other sites More sharing options...
0 Julio Cezar 2 Posted February 15, 2012 Author Report Share Posted February 15, 2012 Problema que não sei como funciona, é tipico caso de 'or'1eliminando somente este problema na validação já resolveria meu problemaa questão que não sei como fazer isso com o código acima. To curtindo d++ este fórum, muito dinâmico Quote Link to comment Share on other sites More sharing options...
0 jissa Posted February 18, 2012 Report Share Posted February 18, 2012 (edited) uma forma bem facil..crie uma função:function sql_injection( $s ){$s = str_replace("\'","",$s); $s = str_replace("'","",$s); $s = str_replace("'or","",$s); $s = str_replace("'or'","",$s); $s = str_replace("or'","",$s); $s = str_replace("=","",$s); $s = str_replace("Select","",$s); $s = str_replace("select","",$s); $s = str_replace("order by","",$s);return $s;}só ir adicionando linhas , se quiser proibir que seja enviado a palavra script para evitar que seja enviado um javascript para as variaveis só colocar$s = str_replace("script","",$s);para usar só colocar nas variaveis que receber para checar$var = sql_injection($_POST["valor"]);já vai remover o que estiver na função trocando para espaço em branco Edited February 18, 2012 by jissa Quote Link to comment Share on other sites More sharing options...
0 Markus Magnus Posted February 18, 2012 Report Share Posted February 18, 2012 Eu utilizo esta funçãofunction anti_injection($injection) { if (is_array($injection)) { foreach ($injection as $i => $inj) { $injection[$i] = anti_injection_string($inj); } return $injection; } else { if(!is_null($injection)) { $injection = htmlspecialchars(preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"), "", $injection), ENT_QUOTES); } if (is_numeric($injection)) { if (intval($injection) == $injection) { $injection = intval($injection); } else { $injection = floatval($injection); } } return $injection; } } se utiliza desse jeito $string = anti_injection($string); // voltará uma string/int/float segura // OU $array = array($string1, $string2, $string3); $array = anti_injection($array); // voltará uma matriz com string/int/float segurosEspero ter ajudadoAbrass Quote Link to comment Share on other sites More sharing options...
0 mJi Posted February 18, 2012 Report Share Posted February 18, 2012 (edited) E se o meliante entrar com dropselecttable ?Ou insfromert ? Edited February 18, 2012 by mJi Quote Link to comment Share on other sites More sharing options...
0 jissa Posted February 19, 2012 Report Share Posted February 19, 2012 E se o meliante entrar com dropselecttable ?Ou insfromert ?acredito que não faça nada, são comandos não serão reconhecidos pelos comados sqlo maximo que vai acontecer vai ser um erro de execução do script falando que é um comando inválido Quote Link to comment Share on other sites More sharing options...
0 mJi Posted February 19, 2012 Report Share Posted February 19, 2012 E se o meliante entrar com dropselecttable ?Ou insfromert ?acredito que não faça nada, são comandos não serão reconhecidos pelos comados sqlo maximo que vai acontecer vai ser um erro de execução do script falando que é um comando inválidoCorreto, mas as funções acima sugeridas iriam retirar a parte em não-negrito dos comandos, e o que iria sobrar seriam comandos válidos.A solução seria implementar um método recursivo que verifique a string até não encontrar comandos SQL. Quote Link to comment Share on other sites More sharing options...
Question
Julio Cezar 2
Painel de controle, de um software.
Como fazer neste código para eliminar sql injection.
Edited by Julio Cezar 2Link to comment
Share on other sites
10 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.