URL Rewriting contra ataques ?(!)
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&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!
Web Security – You’re Doing it WRONG
É triste o estado de descuido em que se encontram a maior parte dos WebSites nacionais… Não falo ao nível de organização, acessibilidade, usabilidade, design… mas sim ao nível da segurança, ou melhor, à falta dela…

Navegar por sites de grandes empresas, de universidades e respectivas faculdades, de sites governamentais, etc. aleatoriamente é quase como encontrar a cada clique um potencial alvo de ataque, quer ao site em si só para fazer defaces estúpidos, quer para atacar os seus visitantes ou para roubar dados e bases de dados importantes.
Porquê que isto acontece ? Porque é que não há cuidado em aplicar filtros nos formulários e nas querys que são feitas client-side ? Existem já filtros desenvolvidos, open-source, que podiam ser aplicados rapidamente aquando do processo de desenvolvimento e que mais ou menos eficientes já eram algo melhor do que nada!! Não custava nem uma hora no desenvolvimento final de um website, e para empresas cujo negócio é o desenvolvimento de soluções web à medida para grandes entidades é inadmissível nunca se terem preocupado em criar uma solução por mais simples que fosse para aplicar a todos os seus trabalhos…
Depois há sempre os bons da fita que quando se apercebem de alguma coisa avisam os developers do site em questão e tentam ajudar. Quando isto acontece existem três tipos de empresas / pessoas:
- não ligam nenhum à sugestão dada e o site continua vulnerável
- ameaçam a pessoa que os está a alertar de lhes pôr um processo em cima (aqui ainda não percebi se é com medo que se peça dinheiro ou que fale com o cliente afectado)
- agradecem a sugestão, corrigem o erro e em alguns casos oferecem recompensas (dinheiro, serviços e até empregos)
Eu pessoalmente já tive estas experiências e desde que as minhas boas intenções foram levadas a mal e fui ameaçado por uma grande empresa portuguesa de desenvolvimento web que deixei de me interessar por ajudar.
Depois claro que aparecem sempre problemas com bases de dados com informações confidenciais roubadas, session hijacking, ou os famosos defaces.
Vamos lá pessoal, não é nada de impossível, é só preciso querer. Com o mínimo de cuidado podem ser evitadas muitas situações embaraçosas para vocês, para os vossos clientes e para o público alvo dos vossos clientes.
Imagem de http://www.fireblog.com/
PHP RSS Feed Generator Class
English Version | Versão Portuguesa
It’s been a while since I’ve planned on developing a new platform for my work as Web Developer, and next to all Web Developers, and I started to develop some modules and this RSS Generator Class born to fulfill my needs.
Supported versions:
RSS 2.0
Download:
Download it
Features:
Generates RSS 2.0 feeds
All feeds are validated by feed validator
Supports all feed elements
Simple & easy to define channel proprieties
Simple & easy to define item elements
Enables usage of sub-tags and attributes
Example
It’s a minimum “how to” example needed to understand how to use this class. It’s part of the download package.
include( "feed.php" ); //Create a new Feed $feed = new Feed( ); //Setting the channel elements //Helper -> http://www.rssboard.org/rss-specification $feed->setFeedTitle( 'Demo - RSS Generator Class' ); $feed->setFeedLink( 'http://joaopedropereira.com/blog/rss' ); $feed->setFeedDesc( 'This is demo of generating a RSS feed. ONLY RSS Version 2.0 Supported' ); $feed->setFeedImage( 'Oh, my photo...', 'http://joaopedropereira.com/projects/rss_gen', 'http://s3.amazonaws.com/twitter_production/profile_images/63969619/imagemresized.jpg' ); //Is possible to use setChannelElm() function for setting other optional channel elements $feed->setChannelElm( 'language', 'en-us' ); //Create a new Item $item1 = new Item( ); //Setting the Item elements //Helper -> http://www.rssboard.org/rss-specification $item1->setItemTitle( 'Item nº 1' ); $item1->setItemLink( 'http://joaopedropereira.com' ); $item1->setItemDate( time( ) ); $item1->setItemDesc( 'Bla, bla, bla, item nº 1.' ); $item1->setItemEnclosure( 'http://www.beardodisco.com/beatelectric/music/Loverboy12Mix.mp3', '17121349', 'audio/mpeg' ); $item1->setItemAuthor( 'contacto@joaopedropereira.com (João Pedro Pereira)' ); //As in Channel is possible to use setItemElm() function for setting other optional item elements //Create another Item $item2 = new Item( 'Item nº 2', 'http://twitter.com/joaoppereira', 'Bla, bla, bla, twitter of the owner of the blog of a webdeveloper' ); $item2->setItemDate( time( ) ); $item2->setItemAuthor( 'contacto@joaopedropereira.com (João Pedro Pereira)' ); //Adding both created items $feed->addItem( $item1 ); $feed->addItem( $item2 ); //Now we're ready to generate the Feed, Awesome! $feed->genFeed( );

EDIT
HOT NEWS, PHP XML-RSS Feed Generator Was Accepted on PHPClasses.org!!
Há já algum tempo que pretendo desenvolver uma nova plataforma para o meu trabalho como Web Developer, e numa fase posterior abrir como serviço para todos os Web Developers, e por isso comecei a desenvolver alguns módulos para essa plataforma, trabalho que deu, entre outros, no módulo de RSS Feed’s surgindo assim a RSS Generator Class para satisfazer as necessidades.
Versões Suportadas:
RSS 2.0
Download:
Download it
Funcionalidades:
Gera RSS Feeds versão 2.0
As feeds são válidas conforme o feed validator
Suporta todos os elementos quer dos channel’s quer dos item’s
É simples definir as propriedades do channel
É simples definir as propriedades dos items
É possível utilizar sub-tags e atributos
Exemplo
Um pequeno exemplo que mostra como se pode fazer uso desta classe. Faz parte do pacote disponível para download.
include( "feed.php" ); //Create a new Feed $feed = new Feed( ); //Setting the channel elements //Helper -> http://www.rssboard.org/rss-specification $feed->setFeedTitle( 'Demo - RSS Generator Class' ); $feed->setFeedLink( 'http://joaopedropereira.com/blog/rss' ); $feed->setFeedDesc( 'This is demo of generating a RSS feed. ONLY RSS Version 2.0 Supported' ); $feed->setFeedImage( 'Oh, my photo...', 'http://joaopedropereira.com/projects/rss_gen', 'http://s3.amazonaws.com/twitter_production/profile_images/63969619/imagemresized.jpg' ); //Is possible to use setChannelElm() function for setting other optional channel elements $feed->setChannelElm( 'language', 'en-us' ); //Create a new Item $item1 = new Item( ); //Setting the Item elements //Helper -> http://www.rssboard.org/rss-specification $item1->setItemTitle( 'Item nº 1' ); $item1->setItemLink( 'http://joaopedropereira.com' ); $item1->setItemDate( time( ) ); $item1->setItemDesc( 'Bla, bla, bla, item nº 1.' ); $item1->setItemEnclosure( 'http://www.beardodisco.com/beatelectric/music/Loverboy12Mix.mp3', '17121349', 'audio/mpeg' ); $item1->setItemAuthor( 'contacto@joaopedropereira.com (João Pedro Pereira)' ); //As in Channel is possible to use setItemElm() function for setting other optional item elements //Create another Item $item2 = new Item( 'Item nº 2', 'http://twitter.com/joaoppereira', 'Bla, bla, bla, twitter of the owner of the blog of a webdeveloper' ); $item2->setItemDate( time( ) ); $item2->setItemAuthor( 'contacto@joaopedropereira.com (João Pedro Pereira)' ); //Adding both created items $feed->addItem( $item1 ); $feed->addItem( $item2 ); //Now we're ready to generate the Feed, Awesome! $feed->genFeed( );
EDIT
HOT NEWS, PHP XML-RSS Feed Generator foi aceite no PHPClasses.org!!
PHP Simple Events System Overview
O PHP-SimpleEventsSystem é uma simples classe em PHP que permite a qualquer programador criar uma aplicação orientada a eventos em PHP. Sendo assim, esta classe possibilita a criação mais facilmente de aplicações web com possibilidade de adicionar plugins, sem que estes tenham de mexer com o código interno da aplicação, permite que uma framework use internamente a classe PHP-SES e melhorando consideravelmente a interacção entre a framework e a aplicação. Mas permite muito mais, permite até onde a sua imaginação chegar.
Basic Overview
Quem quiser ver a documentação completa da framework, pode aceder aqui. No entanto, aqui vai ficar uma explicação da classe e de como ela funciona, que é bastante simples.
A classe cria um array multi-dimensional onde guarda as funções e o respectivo evento a que elas foram anexadas. Sempre que se anexa uma função, a classe pode ou não verificar se a função existe, conforme os parâmetros que o programador introduzir. Se passar nesse teste, verifica se a função já está anexada a esse mesmo evento, e só depois anexa a função (as funções caso seja um array).
Ao executar-mos um determinado evento, a classe verifica se este existe, e em caso afirmativo, percorre o array com as funções anexadas a esse evento, e executa-as a todas pela ordem com que forma anexadas. Caso a opção Auto_run esteja activa, a função vai ainda percorrer todas as funções definidas pelo utilizador (programador da aplicação, utilizador da classe entenda-se) e verifica se alguma coincide com a formatação obrigatória e com o nome do evento em questão (um_nome_qualquer_handles_nome_do_evento). Se essa função já estiver anexada ao array, e por consequente já tiver sido executada, a classe não a executa novamente. Se ainda não estiver anexada, a classe executa-a e, caso a opção Auto_index esteja activa, indexa a função ao array do respectivo evento.
Sugestões de sintaxe dos nomes dos eventos
Numa aplicação de grandes dimensões torna-se importante a sintaxe que usamos e a forma como organizamos os nomes dos eventos, para que não existam conflitos e seja mais fácil memorizar o grande número de eventos que uma aplicação possa ter. Para isso os nomes dos eventos necessitam de ter lógica, e apesar de serem um pouco compridos, serão óbvios. Primeiro teremos de ter em conta algumas considerações.
Os nomes dos eventos podem conter qualquer carácter, incluindo pontos, que podem servir de separador entre as várias “secções virtuais” do nome do evento. No entanto nomes de eventos com pontos não serão possíveis de aceder através da funcionalidade Auto-Index e Auto-Run pois as funções não suportam, obviamente, este tipo de caracteres no seu nome. Assim sendo, sugiro o uso do underscore como separador.
Em todas as aplicações há uma “secção” que deve existir em todos os eventos, que indica se o evento retrata alguma acção em PHP ou HTML. Ou seja, e apesar de todas as instruções em código PHP sejam de PHP, poderão existir eventos que retratam a impressão de texto para o browser, e assim sendo, o nome do evento deve começar por html_, senão, caso retratem acções PHP, como uma conexão a uma Base de Dados, a leitura de um ficheiro, o fim de um ciclo, a execução de uma qualquer estrutura de controlo, etc., deverão começar por php_.
Para a secção de HTML, podemos ainda destinguir se nos estamos a referir a alguma parte genérica do HTML, como por exemplo, um menu, que seja constituído por vários elementos HTML, deve-se adicionar um generic_ a seguir ao html_, ou seja, ficaria html_generic_menu, por exemplo.
Caso seja em PHP, deve-se adicionar o nome da “categoria” da acção que se está a utilizar. Por exemplo se for uma acção qualquer relacionada com a base de dados MySQL, como inserir um registo, coloca-se o mysq_ depois do php_, ficando, por exemplo, php_mysql_query_insert_user.
Nota: Isto é apenas um exemplo de nomenclatura dos eventos, nada de obrigatório.
Exemplos e Demos
Plugins
Actualmente, é quase obrigatório qualquer aplicação, seja ela Web ou Desktop, suportar plugins. Só que isto é muitas vezes uma fonte de dor de cabeça para quem programa em PHP, criar um sistema versátil suficiente para suportar plugins. O PHP-SES permite a criação de Aplicações Web que facilmente suportam plugins. Vamos ver o seguinte exemplo.
require("..\..\Events.php"); //Inicia a configuração Events::setConf("Auto_run", true); Events::setConf("Auto_index", true); //Carrega os nomes ficheiros dos plugins. $plugins = scandir("plugins"); //Percorre o array com todos os ficheiros de plugins foreach ($plugins as $index=> $file_name){ //Verifica se o index actual é um ficheiro e não uma pasta if (is_file("plugins/".$file_name)){ //Inclui e executa o plugin require("plugins/".$file_name); //Por uma questão de segurança e para não comprometer o funcionamento da aplicação //Depois de se carregar um plugin deve-se sempre habilitar a classe //Para não se dar o caso de algum plugin a desabilitar e não a habilitar novamente. Events::Enable(); } } echo '< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8856-16" />'; //Declara uma variável que permitirá adicionar conteúdo dentro dos plugins para a página $content = ""; //Corre todos os eventos anexados para quando os headers HTML são mostrados //Esta é apenas um exemplo da sintaxe para o nome dos eventos. Events::Run("html_headers"); echo $content; echo '<title>'; $content = "PHP-SES Plugins Example"; Events::Run("html_show_title"); echo $content.'</title> </head><body>'; echo "<h1>Título</h1>"; $content = "<a href=\"#\">Link1</a><br />"; //Aqui corre os eventos que permitem alterar o menu Events::Run("html_generic_body_menu"); echo $content; echo '</body> </html> '
JavaScript Events
Muitas vezes torna-se cansativo estar a chamar vários exemplos por AJAX, ou até fazer a verificação no PHP através de QueryStrings. Assim sendo, e com este exemplo aplicado, basta, no evento JavaScript, chamar uma função, JavaScript também, o nome do evento em PHP, e depois é só ir adicionando funções PHP ao código PHP.
index.php
< ?php require("..\..\Events.php"); ?> < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8856-16" /> <script type="text/javascript"> function RunEvent(event_name){ if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else {// code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange=function(){ if (xmlhttp.readyState==4 && xmlhttp.status==200){ document.getElementById("count_number").innerHTML=xmlhttp.responseText; } } xmlhttp.open("GET","run.php?event=" + event_name + "",true); xmlhttp.send(); } </script> <title>JavaScript Buttons Example</title> </head> <body> <input type="button" name="btn_sample" id="btn_sample" onclick="RunEvent('html_buttons_click_btn_sample')" value="Test me. Click me." /> <div id="count_number">0</div> </body> </html>
run.php
require("..\..\Events.php"); if (!defined(IS_AUTH)){ exit; } //Se a variável $_GET["event"] não estiver declarada, termina a execução da página. if (!isset($_GET["event"])){ echo "Não foi definido nenhum evento."; exit; } //Define algumas configurações para não ser necessário anexar a função. Events::setConf("Auto_run", true); Events::setConf("Auto_index", true); //Declara uma função anexada ao clique do botão function update_file_handles_html_buttons_click_btn_sample (){ //Vai buscar o número de clicks que o botão já tem $number_clicks = file_get_contents("clicks.txt"); //Escreve outra vez para o ficheiro adicionando um clique file_put_contents("clicks.txt", $number_clicks + 1); echo $number_clicks + 1; } //Corre todos os eventos associados ao clique do botão. Events::Run($_GET["event"]);
Pode ver os exemplos em funcionamento, aceda aqui.
New Features WordPress 3 Review
É provavelmente ainda um bocado cedo para falar do WordPress 3.0 pois o lançamento desta só está previsto para finais de Maio, mas tenho vindo a brincar um pouco com ele e com as suas novas funcionalidades.
A versão 3.0 do WordPress promete um visual mais soft da página de administração, vai também introduzir uma nova default theme, a “Twenty Ten”, que permite personalizar o fundo e as opções do cabeçalho ( header ), possibilidade de criar os menus com categorias, tags, posts, links externos, etc., entre outras modificações que podem ver na página oficial.
Neste post vou dar realce a apenas duas características que surgirão na versão 3.0 do WordPress, ou pelo menos que estão prevista e que estão em desenvolvimento.
WordPress + WordPress MU == WordPress 3.0
O WordPress MU ou WordPress Multi-User era uma versão modificada do sistema WordPress para permitir redes de blogs numa só instalação.
Site: http://mu.wordpress.org
Create a Network of Multiple Sites on WordPress 3.0
É tão simples como adicionar no ficheiro wp-config.php a seguinte linha:
define ('WP_ALLOW_MULTISITE', true);
Seleccionar o menu Tools -> Network e seguir as instruções.
Este é o menu que vos espera depois de tudo configurado.

Ver artigo: http://codex.wordpress.org/User:Andrea/Create_A_Network
Custom Post Types on WordPress 3.0
Quem já teve de desenvolver uma theme para WordPress um pouco mais complexo provavelmente já teve de fazer uns quantos hacks de forma a conseguir ter estilos diferentes para categorias diferentes… Os developers do WordPress pensaram em nós e decidiram tornar a possibilidade de ter vários estilos para diferentes tipos de posts de uma forma mais simples na versão 3.0 do WordPress.
Para tirar partido desta funcionalidade é necessário adicionar o seguinte código no ficheiro wp-content/themes/yourtheme/functions.php :
register_post_type('testemunials', array( 'label' => __('Testemunials'), 'singular_label' => __('Testemunial'), 'description' => 'Here goes my testemunials', 'public' => true, 'show_ui' => true, 'capability_type' => 'post', 'hierarchical' => false, 'rewrite' => false, 'query_var' => false, 'supports' => array( 'title', 'editor', 'author', 'excerpts', 'comments' ) ));

Tal como é possível definir vários tipos de posts também é possível utilizar esta funcionalidade para páginas diferentes alterando o parâmetro ‘capability_type’ para ‘capability_type’=>’page’.
Function Reference/register post type: http://codex.wordpress.org/Function_Reference/register_post_type
Patrocinio – CD Submundos
É com orgulho que vos apresento o mais recente projecto patrocinado pelo The Blog of a WebDeveloper. O CD Submundos um Projecto Nacional do Mundo da Música.

O CD Submundos é um CD criado com músicas dos membros do fórum submundos, e partilhado pela Internet, com a finalidade de divulgar os seus talentos. O CD Submundos é partilhado na Internet através de vários sites, com as melhores músicas escolhidas através de votação pelos membros.
Esta versão contou com 7 músicas, organizadas de acordo com a maior percentagem de votos.
CD Submundos:
1 – Insubmysso – 69
2 – Dj Bu5a – My Soul (DJ DeepBlue & Maurillo Remix)
3 – Isolaz – Mudam os Tempos
4 – Mister Music – How I feel
5 – Vedeta – Honey i got money
6 – dmL – Sem Ar
7 – MRK – Se Soubesses (O Quanto)
Download: [35mb]
PHP Security Check-List CheatSheet
Para cada projecto que tenho desenvolvido ultimamente utilizando a linguagem de programação server-side PHP, tenho-me guiado por uma checklist de forma a não me esquecer de nada evitando assim falhas graves nas aplicações que desenvolvo. Pois a segurança é uma das preocupações que tenho.
Esta checklist aborda diversas situações como, casos gerais, casos de input, file uploads, autenticação, entre outros.
Recomendo vivamente a sua utilização e até sugestões de melhorias, apesar de ela não ser da minha autoria.
O que acham desta checklist? Conhecem alguma melhor? Como se guiam no desenvolvimento de aplicações web de forma a manter a segurança da mesma?
Hoje, dia 17 de Março de 2010, lanço uma primeira versão “estável” de um serviço que já corre à algum tempo no dominio ConnectionDetails.info.
Este serviço pretende dar informações precisas relativas ao browser bem como algumas características da ligação do utilizador. Numa primeira fase as informações disponíveis são:
- IP
- Browser
- Sistema Operativo
- De onde veio o utilizador (Referrer)
- Porta que está a ser usada para efectuar a ligação
- Velocidade da ligação
Ainda existem alguns bugs quer na aquisição de informações quer no design. Agradecia que fosse feito o report das falhas encontradas e imprecisões.
No futuro pretendo lançar uma versão mais precisa a identificar as informações, bem como adicionar funcionalidades como tentar descobrir qual os routers por trás da ligação, identificar características especificas do browser como as versões de JavaScript suportadas, CSS, versão do Java e do Flash em utilização, etc. Uma outra funcionalidade é o fetching das bases de dados de vulnerabilidades existentes online de forma a encontrar falhas de segurança para a versão dos software instalados.
Agradeço desde todo o suporte que possam dar em especial ao nível de sugestões de funcionalidades, bug catching, criticas/comentários e divulgação.
Já há algum tempo que tenho andado a investigar sites nacionais em busca de falhas de segurança e quase todos as têm, as mais frequentes são as falhas XSS mas também é muito comum encontrar falhas de SQL Injection.
Hoje tive acesso através de um tweet do Público (http://bit.ly/aU0kuy) à informação de que o site das Novas Oportunidades tinha sido explorado e alterado por alguém… Decidi então enquanto era tempo verificar as falhas que existiam no site e qual o meu espanto (not) quando vejo presentes falhas de XSS, falhas de SQL Injection e falhas de validação de parâmetros que permitem Impersonation Attack através de injecção de URL.
O ataque relatado pelo público foi feito através de SQL Injection possivelmente na página seguinte pois esta está totalmente aberta a ataques deste género: http://testemunhos.novasoportunidades.gov.pt/detalhe_video.aspx
O ataque que referi relativo a problemas de validação de parâmetros que permitem injecção de URL: http://www.novasoportunidades.gov.pt/outerFrame.jsp?link=http://joaopedropereira.com/blog/
Com alguma imaginação pode-se fazer alguns ataques interessantes a partir daqui…
Na pesquisa também podemos facilmente fazer ataques de XSS (Cross Site Scripting) como referi anteriormente: http://www.novasoportunidades.gov.pt/np4/q?q=%3Cscript%3Ealert%28%22The+Blog+of+a+WebDeveloper%22%29%3C%2Fscript%3E
Isto mostra a preparação e conhecimentos ao nível de segurança informática que os WebDevelopers que o estado contrata têm… Atenção este não é o único site governamental com problemas graves de segurança, existem mais e talvez que transaccionem dados mais importantes…
Nota: Este post não tem como intuito incentivar qualquer tipo de ataque informático, pretende apenas informar e alertar para os problemas informáticos que podem surgir num futuro nas infraestruturas governamentais (e não só). É importante ter as nossas plataformas o mais seguras possíveis, para não sermos surpreendidos um dia.
EDIT
As falhas estão a ser corrigidas, quase completas por isso para registo futuro adicionei screenshots das falhas. É também de valor ler e participar nos comentários a este post que estão a dar uma boa análise do Web Development nacional.
EDIT 2
Governo desmente ataque informático: Portal Novas Oportunidades não foi alvo de ataque informático . Provavelmente precisam que venha algo abaixo e que cause danos a muitas pessoas para admitirem os erros…

Sitemap – É uma excelente forma de utilizar o espaço do footer pois é útil para os visitantes que se encontrem perdidos ou que simplesmente tenham pressa para encontrar o que procuram sem terem de fazer um scanning por todo o conteúdo do site, que pode ser moroso e por consequência pode fazer-nos perder utilizadores e possíveis clientes. Ninguém gosta de não encontrar rapidamente o que procura e cabe-nos a nós dar-lhes o que desejam.













