Quinta-feira, 14 de Agosto de 2008

String Sanitize - Como previnir XSS em páginas que usam AJAX

Quem nunca precisou varrer uma string para substituir alguns caracteres inválidos?

Ontem à noite, me deparei com o seguinte problema:
Possuía uma página que recebia um objeto javascript, este, porém, possuía uma propriedade que receberia um valor previamente informado pelo usuário.

Exemplo:


De cara, nota-se uma possível falha de segurança, imagine caso um usuário mal intencionado informasse um valor como:

xss', poison:function(){alert('xss')}(), foo: '

A minha resposta seria:



Que como vocês podem notar, ainda é um objeto javascript válido, porém esta envenenado com xss.

Caso eu desejasse consumir este objeto na página, receberia uma mensagem de alerta durante o eval.

Para corrigir este problema desenvolvi esta pequena função em VB.NET



Que simplesmente substitui os caracteres especiais por suas representações Unicode ref http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide:Unicode

Então, apos este método, quando recebo strings envenenadas meu objeto Javascirpt fica assim:



Espero que ajude, abraços

Segunda-feira, 11 de Agosto de 2008

Primeira letra de cada palavra em maiúscula.

Olá pessoal, hoje me deparei com um pequeno problema:
Estava recebendo do banco uma string com os caracteres todos em lowercase, porém teria que exibi-los para o usuário como titulo na página.

Bem, sei que o CSS sozinho poderia fazer esta conversão para mim (utilizando a propriedade text-transform), porém como sou teimoso, fui direto no site da MSDN e acabei encontrando uma solução para o meu problema da forma como eu queria, eis abaixo:

public static string Capitalize(string str)
{
System.Globalization.TextInfo textInfo = new CultureInfo("pt-BR",false).TextInfo;
return textInfo.ToTitleCase(str);
}

Descobri também que em VB.NET é mais fácil ainda olhem:

Dim strName As String = "tom spink"
strName = StrConv(strName, VbStrConv.ProperCase)
MsgBox(strName)

Então é isso ai... Espero que estes snippets ajudem vocês também!

Abraços

Quarta-feira, 23 de Julho de 2008

String.Format em Javascript

Já faz algum tempo que não posto aqui no blog, muita coisa aconteceu nestes últimos dias, consegui passar nas provas, virei moderador do fórum imasters (sessão javascript) mudei de emprego, deixei de morar de aluguel e assim vai... Bem, deixando minha vida pessoal de lado, segue abaixo uma situação interessante que tive que passar.

Bem, foi lançado um desafio entre meus amigos para redução de uma implementação em javascript do método String.Format ( do .NET), a ideia era apenas de “copiar” a funcionalidade básica deste método, ganharia quem fizesse em uma menor quantidade de caracteres possível e este deveria ser compatível com os browsers mais utilizados (IE, Firefox, Opera etc)... Antes de começar com a minha implementação, fiz uma consulta básica na internet para conhecer as versões já existentes e fiquei impressionado com a dificuldade e o esforço algorítmico em que os à maioria autores tiveram para alcançar comportamento similar... Certo de que teria um desempenho melhor, iniciei com a escrita do meu algoritmo que ao final ficou assim:

String.Format = function(a) {
var b = Array.prototype.slice.call(arguments,1);
return a.replace(/{(\d+)}/g, function(){return b[RegExp.$1]});
};

Ele possui apenas 136 caracteres, valendo lembrar que ela pode ser reduzida em mais 6 caracteres*. Mas não para por ai, se a competição considerasse apenas o Firefox como navegador padrão, teria conseguido o valor impressionante de apenas 106 caracteres*!

//Executa apenas no Firefox V3.0 ou superior
String.format=function(a){
let b = Array.slice(arguments,1);
return a.replace(/{(\d+)}/g, function() b[RegExp.$1]);
}


*versão sem palavras reservadas e ponto-e-virgulas

Ao final, fiquei orgulhoso do meu desempenho, sem falar que acabei ganhando a competição e o prêmio que foi não precisar pagar o almoço de hoje hehehe.

Abraço pessoal, até a próxima!

Terça-feira, 18 de Março de 2008

Surpresa desagradável

As vésperas da prova 70-536 hoje acessei o site da prometric para marcar meu Appointment para a próxima que farei, a 70-528, quando por minha surpresa me deparo com a seguinte mensagem: No Dates Found. We're sorry. We couldn't find any Exam Dates based on the selections you've made. Please try another Test Center. O problema é que existem apenas dois Centros em Brasília, Hepta e a CT Fóton e a mesma mensagem foi exibida em ambas. A minha intenção era para que até o final de Abril deste ano ter feito as duas provas, confesso que estou um pouco desapontado e temeroso, porém amanhã entrarei em contato com estas duas empresas para obter maiores informações, ficarei torcendo para que seja apenas um 'erro do site'.

---
Atualização (01-04-2008)
Eu fiz a prova 70-536 dia 25 de março e passei!!!
Não marquei ainda a prova 70-528.

Sexta-feira, 29 de Fevereiro de 2008

Fim do Nestcape!

Hoje ao ler meus feeds me deparei com uma notícia entristecedora, segundo uma nota divulgada pela a AOL o navegador Netscape será descontinuado amanhã, dia 01 de março. Confesso que não fiquei feliz com a noticia, o Netscape foi o primeiro navegador que fui apresentado, foi nele que aprendi o que significava aquele 'bixo novo' chamado internet, embora hoje utilize o IE7 para navegar pela web senti uma certa nostalgia (Cheguei até a baixar e instalar no Netscape aqui na minha máquina rsrs). O fim do Netscape já havia sido anunciado no final de 2007, mas AOL havia adiado para que desse tempo para que os seus usuários migrassem para outros navegadores. O Netscape chegou a ser um dos navegadores mais utilizados no inicio da década de Noventa, mas seu uso foi vencido pelo seu concorrente o Internet Explorer, hoje a guerra esta entre IE e Firefox, será que a Microsoft vencerá mais esta batalha?


Se quiser saber mais sobre esta notícia, aconselho que leia a nota publicada no Netscape Blog.

Quinta-feira, 20 de Dezembro de 2007

Aprendendo com o erros dos outros...

ErroQue o livro oficial da Microsoft para a prova 70-536 esta coberto de erros, não preciso dizer, mas alguns são realmente irritantes, hoje estava relendo o capitulo 9, Installing and Configuring Applications, uma das mais interessantes do livro (ainda vou escrever um post sobre ele) e de novo esbarrei em alguns dos seus erros, porém o que mais me irritou foi os das páginas 490/491, primeiro o último parágrafo da página 490, iniciado em "In the previous versions of the Framework, no real distiction was made..." é repetido inteiramente na página 491 e para piorar o exemplo de código da página 490 esta totalmente incorreto! O problema é que eu já havia lido esta parte e este segundo erro me passou despercebido, sem falar que já havia conferido sobre todas as erratas no site de suporte da microsoft... Hoje porém, como estava lendo com mais atenção notei a discrepância, que faço questão de postar abaixo:


NameValueCollection AllAppSettings = ConfigurationManager.AppSettings;
Int32 Counter = 0;
IEnumerator SettingsEnumerator = AllAppSettings.Keys.GetEnumerator();
while (SettingsEnumerator.MoveNext())
{
Console.WriteLine("Item: {0} Value: {1}", AllAppSettings.Keys[Counter],
AllAppSettings[Counter]);
}

Bem no final, dei uma nova conferida na página de suporte e vi que este erro já havia sido relatado, abaixo o código correto(segundo a Microsoft):

NameValueCollection AllAppSettings = ConfigurationManager.AppSettings;
IEnumerator SettingsEnumerator = AllAppSettings.Keys.GetEnumerator();
while (SettingsEnumerator.MoveNext())
{
Console.WriteLine("Item: {0}Value: {1}", SettingsEnumerator.Current,
AllAppSettings[(string)SettingsEnumerator.Current]);
}


Como a página foi revisada pela ultima vez em novembro deste ano, creio que este tenha sido incluído lá (ou não) bem depois de minha última visita, de qualquer forma, aos que estão lendo este mesmo livro, tomem cuidado para não 'aprenderem o que não devem'.

O que veio de novo com a Web2.0

Hoje recebi um e-mail de um amigo dizendo que haviam "infectado o orkut", quando li, logo imaginei que seria só mais um do tipo "vejam as fotos do acidente da TAM", mas ao ler a estória por completo pelo site do Terra entendi do que se tratava.
O "vírus", como o autor denominou, apenas aproveitava de uma falha do próprio orkut para se espalhar, falha esta que já foi corrigida. Mas o que mais me surpreendeu, foi que esse 'tal virús', foi escrito por um de meus antigos amigos que conheci lá mesmo pelas bandas do orkut. Acho fantástico como as pessoas possam evoluir, aprender em tão pouco tempo(mesmo que não usem este conhecimento proveitosamente), quando conheci o Rodrigo à quase um ano e meio atrás, ele ainda estava iniciando no mundo da programação, tinha problemas em assimilar a diferença entre Java, linguagem de programação, e Javascript, linguagem de scripting. Hoje, ele é um dos maiores programadores em PHP que conheço, possui ótimos conhecimentos em Javascript, tecnologias relacionadas a Web e pelo que podem ver, esta sendo um terror para a staff da google, com sua 'perícia' em descobrir falhas de XSS e Deface(vejam no blog dele suas outras façanhas).

Embora o seu script não tenha sido original, veja a história Samy is my hero em inglês , mostra uma nova forma de 'worms' muito mais poderosa, e que se você, desenvolvedor, não tomar cuidado pode acabar tirando o seu emprego(Ou fazendo você ir trabalhar às pressas no meio da madruga:D).