15 replies [Último envio]
Sheng Long's picture
User offline. Last seen 4 dias 38 min ago. Offline
Usuário Plus
Joined: 05/04/2008
Tibs: 238
0
Your rating: None

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
User offline. Last seen 2 weeks 2 dias ago. Offline
Usuário Plususuário VIP
Joined: 26/12/2007
Tibs: 3671

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
User offline. Last seen 4 dias 38 min ago. Offline
Usuário Plus
Joined: 05/04/2008
Tibs: 238

É 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

Fabião's picture
User offline. Last seen 2 weeks 2 dias ago. Offline
Usuário Plususuário VIP
Joined: 26/12/2007
Tibs: 3671

Tens o código todo para dar uma olhada ?

Rocky's picture
User offline. Last seen 7 weeks 1 hora ago. Offline
Joined: 19/10/2007
Tibs: 6

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. ;)
_____________________

Meu Twitter
About Me

Muita Pimenta Blogs em breve mais bonito e mais forte.

Dauto's picture
User offline. Last seen 2 dias 2 hours ago. Offline
Usuário Plus
Joined: 25/10/2007
Tibs: 275

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
User offline. Last seen 7 weeks 1 hora ago. Offline
Joined: 19/10/2007
Tibs: 6

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
User offline. Last seen 2 weeks 2 dias ago. Offline
Usuário Plususuário VIP
Joined: 26/12/2007
Tibs: 3671

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
User offline. Last seen 7 weeks 1 hora ago. Offline
Joined: 19/10/2007
Tibs: 6

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

_____________________

Meu Twitter
About Me

Muita Pimenta Blogs em breve mais bonito e mais forte.

Fabião's picture
User offline. Last seen 2 weeks 2 dias ago. Offline
Usuário Plususuário VIP
Joined: 26/12/2007
Tibs: 3671

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.

Dauto's picture
User offline. Last seen 2 dias 2 hours ago. Offline
Usuário Plus
Joined: 25/10/2007
Tibs: 275

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

EU QUERO DIVERSÃO, CARAMBA!

Sheng Long's picture
User offline. Last seen 4 dias 38 min ago. Offline
Usuário Plus
Joined: 05/04/2008
Tibs: 238

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

Dauto's picture
User offline. Last seen 2 dias 2 hours ago. Offline
Usuário Plus
Joined: 25/10/2007
Tibs: 275

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
User offline. Last seen 2 weeks 2 dias ago. Offline
Usuário Plususuário VIP
Joined: 26/12/2007
Tibs: 3671

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
User offline. Last seen 2 weeks 2 dias ago. Offline
Usuário Plususuário VIP
Joined: 26/12/2007
Tibs: 3671

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
User offline. Last seen 7 weeks 1 hora ago. Offline
Joined: 19/10/2007
Tibs: 6

Verdade...

_____________________

Meu Twitter
About Me

Muita Pimenta Blogs em breve mais bonito e mais forte. :(



Design Wenetus