Buthy 0 Denunciar post Postado Maio 11, 2011 Dae galera, então, fui informado que um site está vulnerável a SQL Injection... Desde então, estou pesquisando, e achei uma função para evitar isso... A função é a seguinte: function anti_injection($sql) { $seg = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$sql); //remove palavras que contenham a sintaxe sql $seg = trim($seg); //limpa espaços vazios $seg = strip_tags($seg); // tira tags html e php $seg = addslashes($seg); //adiciona barras invertidas a uma string return $seg; } $us = anti_injection($_POST[usr]); $se = anti)injection($_POST[pas]); //começa a comparar a senha criptografada $salt ='93asd85jgf5ndsgk567dnf58456852jasd0dsam44'; $se = sha1($_POST['pas']); $se = $salt . $se; $sql="SELECT * FROM usuario WHERE usrlogin='$us' and usrsenha='$se'"; Essa função protegeria o meu formulario de login e senha? Gostaria de saber se tem alguma função melhor, mais completa, sei lá... E tem outros formulários no site, de contato, matrícula, etc... Como eu protegeria esses daí? E para proteger SQL Injection através de barra de endereços, como eu faço? Muito obrigado Compartilhar este post Link para o post Compartilhar em outros sites
vieira.rrafael 2 Denunciar post Postado Maio 11, 2011 Se está seguro ou não depende do que você quer se prevenir. Pra mim, tá bom! E para proteger SQL Injection através de barra de endereços, como eu faço? É o mesmo esquema. Basta trocar $_POST por $_GET. Compartilhar este post Link para o post Compartilhar em outros sites
Buthy 0 Denunciar post Postado Maio 11, 2011 Ok, e para formulários grandes, tipo um formulário para contato, onde vão mensagens longas e etc... Teria que fazer alguma alteração na função? Tipo retirar a parte do: $seg = trim($seg); que tira os "espaços" entre as palavras Alguma outra alteração? Valeu cara Compartilhar este post Link para o post Compartilhar em outros sites
Alaerte Gabriel 662 Denunciar post Postado Maio 12, 2011 Leia este tópico, preste atenção e entenderá. http://forum.imasters.com.br/topic/276729-seguranca-em-php/ Compartilhar este post Link para o post Compartilhar em outros sites
Matheus Tavares 167 Denunciar post Postado Maio 12, 2011 $seg = trim($seg); Isso não vai retirar espaços entre as palavras, mas sim ao redor da string $seg. Compartilhar este post Link para o post Compartilhar em outros sites
Buthy 0 Denunciar post Postado Maio 12, 2011 Ok, muito obrigado.. vou dar uma olhada no tópico! Compartilhar este post Link para o post Compartilhar em outros sites
mangakah 217 Denunciar post Postado Maio 13, 2011 Comece pela fitragem e validação dos campos e depois, se quiser dar ainda mais segurança, faça a detecção de injection. Então eu sugiro que você faça o seguinte: Baixe o Zend Framework e pegue as classes Zend_Filter_Input e Zend_Validate (você não precisa usar o framwork todo, pode pegar só as classes que quer). Para saber como usar essas classes e suas sub-classes, consulte a documentação do ZF. Se tiver alguma dúvida que não pode ser resolvida na documentação, é só perguntar. Infelizmente nem todas as strings são passíveis de filtragem e validação, apenas aquelas citadas na documentação do framework. Em todas as strings use a função mysql_real_escape_string() (ela é bem mais poderosa que addslashes) para escapar os caracteres especiais e sprintf para posicionar os valores exatamente no lugar correto em sua string (como está na documentação da função mysql_real_escape_string). A função sql_regcase() está obsoleta. Use também a função htmlspecialchars() para prevenir javascript injection. Por fim pode-se ainda criar uma classe para detectar palavras-chave específicas no uso da linguagem SQL, mas se você fizer todos os passos acima corretamente, mesmo que essas palavras sejam inseridas em sua consulta, elas não devem representar nenhum perigo. Mas é sempre bom detectar para saber que aquele usuário está mal intensionado e seria prudente bloquear o ip dele. Outra coisa muito importante é não passar informações para o cracker. Muitas vezes o desenvolvedor faz tudo certo, cria até soluções sofisticadas de detecção de ataques mas deixa que informações sobre o script ou sobre o banco de dados vazem para os usuários. Portanto, coisas como... mysql_connect($host,$user,$pass) or die("não consegui conectar ao $host como $user usando a senha $pass"); mysql_select_db($dbname) or die("nao consegui conectar ao banco $dbname"); E da mesma forma: mysql_query("SELECT * FROM tabela WHERE id=" . $_GET['id']) or die(mysql_error()); SÃO UMA GRANDE BURRICE! Compartilhar este post Link para o post Compartilhar em outros sites
ro.fonseca 1 Denunciar post Postado Maio 13, 2011 Comece pela fitragem e validação dos campos e depois, se quiser dar ainda mais segurança, faça a detecção de injection. Então eu sugiro que você faça o seguinte: Baixe o Zend Framework e pegue as classes Zend_Filter_Input e Zend_Validate (você não precisa usar o framwork todo, pode pegar só as classes que quer). Para saber como usar essas classes e suas sub-classes, consulte a documentação do ZF. Se tiver alguma dúvida que não pode ser resolvida na documentação, é só perguntar. Infelizmente nem todas as strings são passíveis de filtragem e validação, apenas aquelas citadas na documentação do framework. Em todas as strings use a função mysql_real_escape_string() (ela é bem mais poderosa que addslashes) para escapar os caracteres especiais e sprintf para posicionar os valores exatamente no lugar correto em sua string (como está na documentação da função mysql_real_escape_string). A função sql_regcase() está obsoleta. Use também a função htmlspecialchars() para prevenir javascript injection. Por fim pode-se ainda criar uma classe para detectar palavras-chave específicas no uso da linguagem SQL, mas se você fizer todos os passos acima corretamente, mesmo que essas palavras sejam inseridas em sua consulta, elas não devem representar nenhum perigo. Mas é sempre bom detectar para saber que aquele usuário está mal intensionado e seria prudente bloquear o ip dele. Outra coisa muito importante é não passar informações para o cracker. Muitas vezes o desenvolvedor faz tudo certo, cria até soluções sofisticadas de detecção de ataques mas deixa que informações sobre o script ou sobre o banco de dados vazem para os usuários. Portanto, coisas como... mysql_connect($host,$user,$pass) or die("não consegui conectar ao $host como $user usando a senha $pass"); mysql_select_db($dbname) or die("nao consegui conectar ao banco $dbname"); E da mesma forma: mysql_query("SELECT * FROM tabela WHERE id=" . $_GET['id']) or die(mysql_error()); SÃO UMA GRANDE BURRICE! Em relação a exibição de erros, é só configurar ou verificar se no servidor a exibição de erros esteja ON, pois se estiver OFF nem precisa se preocupar com isso, quanto a segurança no SQL INJECTION o proprio PDO(caso a pessoa esteja usando) faz isso, correto?? Compartilhar este post Link para o post Compartilhar em outros sites
mangakah 217 Denunciar post Postado Maio 13, 2011 ro.fonseca Se você chamar uma função de erro dentro de um die() ou exit() como a grande maioria dos iniciantes faz, esse erro será mostrado mesmo que você tenha desabilitado a exibição de erros. Quanto ao PDO, usar consultas preparadas (statements) com PDO é a melhor maneira de evitar injection. Infelizmente a grande maioria dos inicantes não usam. Se eles ao menos fizessem assim já seria uma boa: $res = mysql_query($sql); if(!$res) { mysql_error(); } Compartilhar este post Link para o post Compartilhar em outros sites
ro.fonseca 1 Denunciar post Postado Maio 13, 2011 ro.fonseca Se você chamar uma função de erro dentro de um die() ou exit() como a grande maioria dos iniciantes faz, esse erro será mostrado mesmo que você tenha desabilitado a exibição de erros. Quanto ao PDO, usar consultas preparadas (statements) com PDO é a melhor maneira de evitar injection. Infelizmente a grande maioria dos inicantes não usam. Se eles ao menos fizessem assim já seria uma boa: $res = mysql_query($sql); if(!$res) { mysql_error(); } Poutz, nem sabia q tais funçoes, mesmo com os erros desabilitados, exibiam os erros, de qualquer maneira, o ideal é nunca exibir, só na hora de debugar mesmo, pq quando for jogar no ar, o ideal é sempre tirar, pelo menos é assim q faço. Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Maio 13, 2011 a MINORIA dos injections são baseados em aspas .. <_< Compartilhar este post Link para o post Compartilhar em outros sites
Buthy 0 Denunciar post Postado Maio 13, 2011 e cada vez surgem mais dúvidas ehehe mas vamos lá: baixei o zend framework. usar as classes Zend/Filter/Input.php e Zend/Validate.php seria só utilizar esses dois arquivos? Retirando os "requires" deles... Ou eu preciso instalar algo? a função mysql_real_escape_string() seria usada nas variaveis que vem dos formulários? exemplo: $usuario = mysql_real_escape_string($_POST[usuario]); após usar essa função, dai seria usar, na mesma variável, a função htmlspecialchars(). ficando assim: $usuario = mysql_real_escape_string($_POST[usuario]); $usuario_novo = htmlspecialchars($usuario); Quando você diz "Por fim pode-se ainda criar uma classe para detectar palavras-chave específicas no uso da linguagem SQL", isso seria criar uma função parecida com a que eu postei? Dai juntando tudo, ficaria tipo assim: $usuario = mysql_real_escape_string($_POST[usuario]); $usuario2 = htmlspecialchars($usuario); $novo_usuario = anti_injection($usuario2); Nunca tinha mexido com isso antes... Seria mais ou menos isso? Ou errei tudo :ermm: Muito obrigado! Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Maio 13, 2011 :seta: Filter_Input :D Compartilhar este post Link para o post Compartilhar em outros sites