« Léo » 0 Denunciar post Postado Janeiro 27, 2010 Fala Galera, blza? Andei lendo bastante na internet sobre SQL Injection e como evitá-lo. Achei muito material bom, mas continuo com algumas dúvidas. A principal é: Porque não utilizar o htmlentities?? Não é mais simples converter toda a entrada de informação em caracteres HTML ao recebê-la? Desta forma seria dispensável um tratamento posterior (na extração do banco, por exemplo) como o stripslashes. Estou errado? Montei um arquivo com o seguinte código e pretendo utilizá-lo em todas as páginas do meu site afim de evitar o SQL Injection. Pf, deêm suas opniões, sugestões e correções: function anti_sql_injection($v) { $r = htmlentities($v); // Converte tudo pra entidades HTML $r = str_replace("'", '′', $r); // Substitui a aspas simples por uma entidade HTML similar $r = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$r); // Remove comandos SQL [vlw Fabyo] $r = addslashes($r); // Por fim, caso tenha passado algo, insere as contrabarras return $r; } // Aplica o anti_sql_injection aos inputs $_GET = array_map('anti_sql_injection', $_GET); $_POST = array_map('anti_sql_injection', $_POST); $_REQUEST = array_map('anti_sql_injection', $_REQUEST); $_COOKIE = array_map('anti_sql_injection', $_COOKIE); Desde já, agradeço à atenção de todos! Abs Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Janeiro 27, 2010 Léo, Veja a função mysql_real_escape_string e veja também a documentação do PDO Compartilhar este post Link para o post Compartilhar em outros sites
« Léo » 0 Denunciar post Postado Janeiro 27, 2010 Fala João, tudo certo? Então... eu já havia lido sobre a mysql_real_escape_string. No entanto, pelo que entendi, ela funciona +/- como a addslashes e eu gostaria de utilizar algo que não necessitasse de tratamento posterior, entende? Exemplo: Se eu inserisse com esta função o seguinte texto no banco: Este é o meu "teste"! Iria ser gravado assim: Este é o meu \"teste\"! Então eu precisaria usar o comando stripslashes (por exemplo) quando eu fosse imprimir esta info na tela. Imagino que haja uma forma se validar as infos apenas na entrada dos dados. Por isso sugeri a conversão para as entidades HTML. A validação que postei é mt falha? Abs Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Janeiro 27, 2010 Se eu inserisse com esta função o seguinte texto no banco: Este é o meu "teste"! Iria ser gravado assim: Este é o meu \"teste\"! Se você usar mysql_real_escape_string, Este é o meu "teste"! será gravado no banco exatamente como Este é o meu "teste"! Simples assim. Compartilhar este post Link para o post Compartilhar em outros sites
« Léo » 0 Denunciar post Postado Janeiro 28, 2010 Fala João, Agora entendi como se usa corretamente o comando indicado. No entanto, estou tendo que implementar rotinas de segurança em um sistema já programado e, como o sistema adotou um pouco da "Orientação à Gambiarras", gostaria de saber se o código que postei poderia ser utilizado como paliativo para o mysql_real_escape_string, neste caso. Visto que alterar tooo... ooodas as querys do sistema ia levar mto tempo. O que acha? Obrigado pela atenção. Abs Compartilhar este post Link para o post Compartilhar em outros sites
hinom 5 Denunciar post Postado Janeiro 28, 2010 baseado nas sua situação, acho que pode fazer algo assim: function anti_sql_injection($v) { $r = htmlentities($v); // Converte tudo pra entidades HTML $r = str_replace("'", '′', $r); // Substitui a aspas simples por uma entidade HTML similar $r = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$r); // Remove comandos SQL [vlw Fabyo] $r = addslashes($r); // Por fim, caso tenha passado algo, insere as contrabarras return $r; } http://forum.imasters.com.br/public/style_emoticons/default/seta.gif function anti_sql_injection($v) { return mysql_real_escape_string($v); } "simples assim.." ou function anti_sql_injection($v) { return addslashes($v); } pessoalmente prefiro "addslashes" pois já experimentei problemas com "mysql_real_escape_string". não lembro exatamente agora, mas o que ocorria é que não estava convertendo o caracter ' (single quote) em determinadas situações. Compartilhar este post Link para o post Compartilhar em outros sites
« Léo » 0 Denunciar post Postado Janeiro 29, 2010 Fala hinom, blza? Desculpa a ignorancia, mas eu devo declarar uma fonte seguida da outra? não entendi bem... tentei colocar assim, no entanto, da erro de "redeclaração" de função: Fatal error: Cannot redeclare anti_sql_injection() (previously declared in C:\wamp\www\trata_erros\classes\TrataInputs.php:3) in C:\wamp\www\trata_erros\classes\TrataInputs.php on line 13 Sobre o addslashes, não gostaria de usar para nao precisar tratar a saida das infos do banco. Abs Compartilhar este post Link para o post Compartilhar em outros sites
Will Fernando 2 Denunciar post Postado Janeiro 29, 2010 você deve te declarado a funcao dentro de um laço ou ja deve te uma função com esse nome :P da uma olhada no script =] Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Janeiro 29, 2010 Não deve redeclarar uma função assim. O @hinom te disse para usar uma ou outra. Eu nunca tive de tratar a saída, usando tanto addslashes como mysql_real_escape_string; Compartilhar este post Link para o post Compartilhar em outros sites
« Léo » 0 Denunciar post Postado Janeiro 29, 2010 Testei aqui o addslashes numa query e realmente a info vai pro banco corretamente. No entanto, tenho certeza q ja enfrentei problemas com ele em circunstâncias parecidas. Bom, já percebi que preciso estudar ainda mais esta questão. (rs) Sobre o codigo que postei, imagino que ele também seja bom pra envitar o HTML Injection, correto? Aplicando ele neste caso, acham q posso vir a ter algum problema? Agradeço a atenção de todos! ;) abs Compartilhar este post Link para o post Compartilhar em outros sites
hinom 5 Denunciar post Postado Janeiro 29, 2010 Testei aqui o addslashes numa query e realmente a info vai pro banco corretamente. No entanto, tenho certeza q ja enfrentei problemas com ele em circunstâncias parecidas.provavelmente devido a configurações do ambiente.no php tem uma função magic_quotes, a qual atualmente está em desuso e será completamente removida da versão php6 Sobre o codigo que postei, imagino que ele também seja bom pra envitar o HTML Injection, correto???isso é outro assunto. é bom não misturar SQL Injection com XSS injection, html, etc... basicamente, quando precisar exibir dados, provindos do usuário, sob o formato HTML, é boa prática utilizar algum filtro que elimine possíveis caracteres maliciosos. Uma função específica do PHP é strip_tags Evite criar aqueles monstros de SQL injection, que misturam vários filtros que nao tem nada a ver com SQL.. infelizmente, hoje em dia existem centenas de blogs que só copiam e colam códigos sem saber o que estão fazendo.. Simplesmente copiam conteúdo de um outro blog que também copiou de outro que também não sabe nada do que está fazendo. O resultado está aí. Uma grande confusão e milhares de profissionais mal informados sobre o assunto. Inclusive, é um assunto já resolvido há mais de 10 anos e continuam criando monstros de sete cabeças. Compartilhar este post Link para o post Compartilhar em outros sites
« Léo » 0 Denunciar post Postado Janeiro 30, 2010 Opa Hinon, valeu pelo toque! Sobre o XSS Injection, imaginei que a minha htmlentities já seria o bastante para inibir inserções HTML no site. Enfim, o que estou buscando é um include unico que me deixe tranquilo para manipular as infos no restante do código. ;) Abs Compartilhar este post Link para o post Compartilhar em outros sites
Willian Gustavo Veiga 0 Denunciar post Postado Janeiro 30, 2010 Boa noite tudo bem? Simplifique: Utilize PDO. Um abraço, tudo de bom. Compartilhar este post Link para o post Compartilhar em outros sites
« Léo » 0 Denunciar post Postado Fevereiro 1, 2010 Fala Willian, então. Conforme o João tmb indicou, dei uma olhada no PDO e pretendo usa-lo daqui para frente. No entanto, este projeto já está pronto e sem tratamento de segurança. Por isso, seria muito desgastantes mudar o relacionamento com o banco do site inteeeiro. Então estou buscando um include que impeça o usuário malicioso de manipular o site de qqr forma. De qqr forma, valeu pela dica e atenção. Abs Compartilhar este post Link para o post Compartilhar em outros sites