Oi pessoal.
já procurei no google, na documentação do php, mais não achei nada.
como tem um pessoal aqui que desenvolve pra Web talvez possam me ajudar.
Tô criando um projeto (PHP + Mysql) em que os dados de um formulário (tipo nome, endereço...) são passados direto para o Banco de Dados.
Tô usando addslashes, mysql_real_escape, que previnem contra aspas e barras.
Uso também o Strip_tags para prevenir injeção de código html e php.
Para prevenir contra DROP, UNION, e tals eu estava usando o preg_replace que barrava comandos SQL e sinais como #, --, ;.
consegui fazer tudo, mas não estou sabendo onde encaixar o código tipo:
$insertSQL = sprintf("INSERT INTO princ (city, nome) VALUES (%s, %s)",
GetSQLValueString($_POST['city'], "text"),
GetSQLValueString($_POST['nome'], "text"));
Onde eu coloco o preg_replace nesse exemplo ?
Ps: coloquei a variavel passando pelo preg_replace, mais quando ela é inserida no banco de dados, aparece sem tratamento.
Alguém tem alguma outra dica de segurança?
Esperando sugestões. Obrigado!!
É dreamweaver sim :D
então, é isso mesmo o que eu queria, mais infelizmente não funcionou.
Fazendo um form que posta na mesma página o que foi digitado, ele filtra direitinho as palavras, mais com o Banco de dados não funciona.
Mais pelo menos vc me deu uma luz.
Vlw.
You must defeat me to stand a chance
Tens o código todo para dar uma olhada ?
Simplesmente resgate as variaveis antes. aplique o pre_replace nelas e utilize-as depois para inserir no banco:
//Resgato os valores por POST
$city = $_POST["city"];
$nome = $_POST["nome"];
//Crio uma array com os objetos a serem eliminados
$eliminar = array("#", "-", ";");
//Executo o str_replace
$city = str_replace($eliminar, "", $city);
$nome = str_replace($eliminar, "", $nome);
//Insiro os dados no BD
$insertSQL = sprintf("INSERT INTO princ (city, nome) VALUES ($city, $nome)",
Esse código está bem simplificado mas funciona perfeitamente sem ter frescuras pra lhe atrapalhar. ;)
_____________________
Muita Pimenta Blogs em breve mais bonito e mais forte.
E no caso da informação a ser salva tiver alguma dessas palavras?
Algum texto em inglês, por exemplo.
Como salvar essas palavras sem sofrer SQL Injection?
__________________________________________________________
Anti-fanático
Se eu quisesse realidade, eu não jogava videogame.
Só fazer o str_replace ou preg_replace substituir por um código.
Exemplo:
//Executo o str_replace
$city = str_replace("#", ".sharp.", $city);
E na hora de resgatar os valores refaz o str_replace invertendo os valores.
Exemplo:
//Executo o str_replace
$city = str_replace(".sharp.", "#", $city);
Lembrando que no caso da " (aspa) você precisa usar uma \ (contra barra) antes para o php considera-la parte da string e não da syntax...
_____________________
Muita Pimenta Blogs em breve mais bonito e mais forte.
Na real, eu sou contra esta abordagem paranóica contra SQL injection, que corta um monte de palavras e entrega a informação capada pro banco.
A lógica mais simples é a seguinte: Se você mantiver as aspas da string SQL de modo correto, e impedir que as mesmas aspas sejam inseridas no banco, as chances de injection são reduzidas a zero.
Algo como:
$sql="INSERT INTO tabela SET campo1='".$campo1."' campo2='".$campo2."'";
Concorda que tudo o que estiver dentro de $campo1 e $campo2, desde que sem nenhuma aspa simples, vai ser contado como string, correto?
Logo, basta evitar que aspas simples cheguem via tal string, e você pode gravar o que quiser no banco. Você faz isso de modo simples:
$campo1=mysql_real_escape_string($campo1);
O comando, além de outras coisas, vai "escapar" todas as aspas simples e elas não farão efeito na consulta.
Concordo plenamente, mas existem casos e casos..
Por exemplo textos necessitam de aspas, logo acho mais prático usar o str_replace pra substituir as aspas por um código e depois descodificar na hora de exibir.... ;)
_____________________
Muita Pimenta Blogs em breve mais bonito e mais forte.
Mas o que o mysql_real_escape_string() faz é substituir as aspas ' por \'...
Caso seja do interesse exibir as aspas (na real, apóstrofos, que vão bastante em nomes americanos), é só 'refazer' a string com stripslashes() na volta.
Eu faço isso por padrão. E nem tinha idéia que era tão útil. :D
Recentemente tive tanta dor de cabeça com codificação que acabei usando o htmlentities. Ele também resolve as aspas simples e duplas.
__________________________________________________________
Anti-fanático
Se eu quisesse realidade, eu não jogava videogame.
E ai Fabião.
Agora tô no trabalho, depois posto quando chegar em casa :D
Então, eu acho que precisa "capar" a informação mesmo.
Por exemplo em um input nome, não quero que o usuario digite @, aspas, etc. só letras.
não tem razão dele digitar outra coisa!
Infelizmente temos que esperar pelo pior.
e não é só injections. tem também XSS que não usa aspas e sim tags html e código javascript.
E já entendi o que eu estava fazendo errado, o Rocky me ajudou.
Eu tava tentando passar a variavel e tratar na hora do insert, mais era bobeira.
Como o rocky falou era só tratar a variavel antes e ela ia normal pro BD. Viajei :D
You must defeat me to stand a chance
Tem doido p/ tudo nesse mundo. Vai que um pai coloca o nome do filho M@rio? (Tem aquele chinês que ainda vence com o '@')
Para começar qualquer tag em HTML é necessário o '<' e o '>', coisa que o htmlentities transforma também.
Se tiver um tempo, dê uma olhada em: http://br2.php.net/htmlentities
Vai te explicar melhor do que eu.
__________________________________________________________
Anti-fanático
Se eu quisesse realidade, eu não jogava videogame.
Aspas você quer que ele digite sim. Como eu disse lá em cima, o que é aspas simples pro programa, é apóstrofo no nome de um americano:
Meu nome é John Mc'Cain. "Como fas?"
O problema desta abordagem de previsão, usando replace, é que você terá de criar uma expressão regular e ter certeza absoluta que cobriu todas as possibilidades de injection. E é um risco contar com 100% de certeza que você não esqueceu alguma palavra chave obscura na documentação do MySql que o cara vai usar justo no seu site.
Aliás, chama-me a atenção que num fórum sobre tecnologia, discuta-se tão pouco diretamente sobre programação...
Bom:
Ponto 1: GetSQLValueString é coisa do Dreamweaver, né? Pelo que eu lembro é: Sei que ela não é parte do PHP nativo.
Ponto 2: Você "insere" o preg_replace em qualquer string que venha através do browser (no caso, $_POST).
Em resumo: Você cria uma função que trate toda e qualquer string contra sql injection, e aplica ela em qualquer variável $_POST (no caso) que advenha do formulário da web que lhe envia tais informações.
No seu caso, acho que aplicaria mais ou menos assim:
$insertSQL = sprintf("INSERT INTO princ (city, nome) VALUES (%s, %s)",
GetSQLValueString(preg_replace(sql_regcase("/(from|select|insert|name|like|delete|where|drop table|show tables|#|*|--|\\\\)/"),"",$_POST['city']), "text"),
GetSQLValueString(preg_replace(sql_regcase("/(from|select|insert|name|like|delete|where|drop table|show tables|#|*|--|\\\\)/"),"",$_POST['nome'], "text"));
Você substitui a regexp citada por aquela que deseja.
Era isso ?