Sheng Long's picture
Posts: 76
Membro desde: 05-Abr-2008
88 tibs
Ajuda: como usar preg_replace + strip_tags com INSERT
31/08/2008 - 21:35

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!!


Fabião's picture
Posts: 2666
usuário VIP

Membro desde: 26-Dez-2007
2706 tibs
+ conexão
Bom: Ponto 1:
01/09/2008 - 00:12

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 ?


Sheng Long's picture
Posts: 76
Membro desde: 05-Abr-2008
88 tibs
+ conexão
É dreamweaver sim então,
01/09/2008 - 02:10

É dreamweaver sim Laughing out loud
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


Fabião's picture
Posts: 2666
usuário VIP

Membro desde: 26-Dez-2007
2706 tibs
+ conexão
Re: É dreamweaver sim então,
01/09/2008 - 10:39

Tens o código todo para dar uma olhada ?


Rocky's picture
Posts: 2310
usuário VIPUsuário Windows

Membro desde: 19-Out-2007
2012 tibs
+ conexão
Re: Ajuda: como usar preg_replace + strip_tags com INSERT
01/09/2008 - 07:02

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. Eye-wink
_____________________

Meu Twitter
About Me

Muita Pimenta Blogs em breve mais bonito e mais forte.


Posts: 102
Membro desde: 25-Out-2007
109 tibs
+ conexão
Re: Ajuda: como usar preg_replace + strip_tags com INSERT
01/09/2008 - 10:37

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.

EU QUERO DIVERSÃO, CARAMBA!


Rocky's picture
Posts: 2310
usuário VIPUsuário Windows

Membro desde: 19-Out-2007
2012 tibs
+ conexão
Re: Re: Ajuda: como usar preg_replace + strip_tags com INSERT
01/09/2008 - 10:45

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...

_____________________

Meu Twitter
About Me

Muita Pimenta Blogs em breve mais bonito e mais forte.


Fabião's picture
Posts: 2666
usuário VIP

Membro desde: 26-Dez-2007
2706 tibs
+ conexão
Re: Re: Ajuda: como usar preg_replace + strip_tags com INSERT
01/09/2008 - 10:50

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.


Rocky's picture
Posts: 2310
usuário VIPUsuário Windows

Membro desde: 19-Out-2007
2012 tibs
+ conexão
Re: Re: Re: Ajuda: como usar preg_replace + strip_tags com INSER
01/09/2008 - 10:58

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.... Eye-wink

_____________________

Meu Twitter
About Me

Muita Pimenta Blogs em breve mais bonito e mais forte.


Fabião's picture
Posts: 2666
usuário VIP

Membro desde: 26-Dez-2007
2706 tibs
+ conexão
Re: Re: Re: Re: Ajuda: como usar preg_replace + strip_tags com I
01/09/2008 - 11:10

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.


Posts: 102
Membro desde: 25-Out-2007
109 tibs
+ conexão
Quote:$sql="INSERT INTO
01/09/2008 - 11:04

Quote:
$sql="INSERT INTO tabela SET campo1='".$campo1."' campo2='".$campo2."'";

Eu faço isso por padrão. E nem tinha idéia que era tão útil. Laughing out loud

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.

EU QUERO DIVERSÃO, CARAMBA!


Sheng Long's picture
Posts: 76
Membro desde: 05-Abr-2008
88 tibs
+ conexão
E ai Fabião. Agora tô no
01/09/2008 - 11:18

E ai Fabião.
Agora tô no trabalho, depois posto quando chegar em casa Laughing out loud
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 Laughing out loud

You must defeat me to stand a chance


Posts: 102
Membro desde: 25-Out-2007
109 tibs
+ conexão
Re: E ai Fabião. Agora tô no
01/09/2008 - 11:41

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.

EU QUERO DIVERSÃO, CARAMBA!


Fabião's picture
Posts: 2666
usuário VIP

Membro desde: 26-Dez-2007
2706 tibs
+ conexão
Re: E ai Fabião. Agora tô no
01/09/2008 - 11:46

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.


Fabião's picture
Posts: 2666
usuário VIP

Membro desde: 26-Dez-2007
2706 tibs
+ conexão
Re: Ajuda: como usar preg_replace + strip_tags com INSERT
01/09/2008 - 11:11

Aliás, chama-me a atenção que num fórum sobre tecnologia, discuta-se tão pouco diretamente sobre programação...


Rocky's picture
Posts: 2310
usuário VIPUsuário Windows

Membro desde: 19-Out-2007
2012 tibs
+ conexão
Re: Re: Ajuda: como usar preg_replace + strip_tags com INSERT
01/09/2008 - 11:25

Verdade...

_____________________

Meu Twitter
About Me

Muita Pimenta Blogs em breve mais bonito e mais forte. Sad


Opções de exibição de comentários

Selecione seu modo de exibição dos comentários favorito e clique "Salvar opções" para ativar suas mudanças.



Design Wenetus