Diálogo

Em um recente MacroChat

Rob Cameron: your video isn’t moving … is that normal?
Rob Cameron: or are you THAT still? 🙂
Raymond Camden: im very calm
Raymond Camden: ive reached coding nirvanna
Raymond Camden: i am 1 with 0


Totally Gridbag

Um belo post animado (em Flash) sobre uma das dificuldades que programadores Java podem enfrentar ao fazer o layout de suas aplicações.

Via Matt Chotin, que entitulou seu post a respeito como “Flex helps avoid this…“. 🙂


Resposta da Macromedia

A Macromedia respondeu meu e-mail sobre os incidentes de segurança que eu comentei recentemente (aqui e aqui)


Hi Fabio,

Thank you very much for sending both of these issues our way – we really appreciate your effort in investigating the issues and in taking the time to notify us.

We’ve confirmed that both of these are valid issues on our end. We are
looking in to the best way to address them, and hope to get them resolved as soon as we can.

(…)

Thank you again,
-David Lenoe
Macromedia Product Security


Variáveis locais à funções

Variáveis locais de funções são variáveis que existem apenas dentro da função, não existindo na página que chamou a função. Dessa maneira, não só a memória é gerenciada de melhor maneira, como também as variáveis da função não interferem nas da página que a chamou, a vice-versa.

Variáveis locais são criadas com a palavra-chave var:

var valor = 3; //dentro de um bloco CFSCRIPTou
<CFSET VAR valor="3">

Ao criar UDFs, é comum (e recomendado), já declarar todas as variáveis que você irá utilizar no início da função, com a devida palavra-chave var. Aliás, declaração de variáveis locais só podem ser no início da função.

O problema é que muitas pessoas – inclusive eu – esquecem de declarar como variáveis locais as variáveis de loops!

Veja o código abaixo:


for(i=1; i LTE 13; i=i+1) {
thisDigit = mid(thisCNPJ, i, 1);
somaDigitoDois = somaDigitoDois + thisDigit * aMultipliers[i];
}

O código é parte da função CNPJvalidate() e cria uma nova variávei i. Se já existir uma variável i na página que a chamou, o valor desta será sobreposto pelo novo valor setado nesse loop. O correto seria, no início da função já declarar a variável i, mesmo que com qualquer valor.

Em tempo: as funções CNPJvalidate() e CPFvalidate() já foram atualizadas. 🙂

Ah, e não posso esquecer de dar parabéns ao nosso mais novo milionário!


Senha do RDS do ColdFusion 7

Apenas um adendo sobre o post anterior.. Embora a senha do ColdFusion Administrator agora seja melhor criptografada, a senha do servidor RDS não.

Essa continua criptografada via Encrypt()/Decrypt(), com o algorítimo “TripleDES”. É portanto, “raqueável”. Descobrir a chave (e a “seed” que gera essa chave!) é bem mais complicado que antes, sem contar que não é “adivinhável” como antes, mas é possível, e eu posso provar. :o)

Alô administradores!, desabilitem o RDS!


Login no Administrator do ColdFusion 7

Eu fiquei contente com o login no ColdFusion Administrator da nova versão do ColdFusion.

Na versão anterior, o sistema de login, criptografia e armazenamento da senha era muito precário. Foi só eu comentar com o Alex que ele fez um post, inclusive criticando (com razão) o sistema de login.

Na versão anterior (MX 6 e 6.1) havia um formulário de login onde era necessário digitar somente a senha. Embora o ideal seria algo como usuário-senha, é algo contornável (e extremamente recomendado, basta ler os posts sobre segurança aqui do CFGIGOLÔ) protegendo a pasta CFIDE/Administrator com um usuário e senha via web server.

A senha era enviada por padrão em formato plain-text, passível de spoof. Acessar o CF Administrator via https é algo que poucas vezes vi.

No servidor a senha então era encriptada com uma função (de encriptação de duas vias – encripta e desencripta) do próprio ColdFusion (Encrypt()), e comparada com a versão encriptada em um arquivo guardado em texto puro no servidor. Se o arquivo é em texto, e a criptografia é de duas mãos, é possível desencriptar a senha…

Era um sistema que funcionava, e bem até; mas não era seguro o suficiente para os paranóicos conscientes.

Na nova versão – anteriormente conhecida como Blackstone, na tela de login, ao digitar a senha, uma função JavaScript (no cliente portanto) encripta a senha utilizando SHA-1 (de mão única), criptografa a senha já encriptada (sim, de novo) utilizando uma key (agora em duas mãos) randômica (do tipo 1108059832081) e aí sim envia para o servidor, que se encarrega de verificar se a senha está correta. Ele recebe a senha criptografada duas vezes e a chave de uma delas; ele desencripta utilizando a chave e o resultado é a senha criptografada em SHA-1, que é comparada com a do arquivo password.properties.

Update: Um senão desse novo sistema é que há uma função interna (getAdminHash()) que retorna a senha hash (em criptografia SHA-1) do Administrator; a mesma senha que está no password.properties. Se alguém realmente quiser descobrir a senha, pode deixar um brute-force rodando até descobrir a senha. Vale dizer que para acessar essa função a dupla cfobject/createObject() entra em ação.


ColdFusion built-in webserver

O ColdFusion tem um servidor web (como o IIS e o Apache) bem simples embutido (built-in webserver), que quebra um bom galho, principalmente na máquina do desenvolvedor, que não precisa ter um IIS completo com esse e aquele recurso; apenas o ColdFusion rodando, de maneira simples.

O webserver roda normalmente como na porta 8500 (http://localhost:8500/) e seus arquivos ficam sob a pasta wwwroot no diretório de instalação do ColdFusion, como por exemplo, D:CFusionMXwwwroot.

Tente digitar “localhost:8500” (sem o http://) na barra de endereços do Internet Explorer. Não sei o porque cargas d’agua, ele muda para “local:8500”!! Eu nunca digito “http://” na frente de um endereço web! Seria mais simples se o acesso fosse simplesmente localhost, rodando na porta padrão para web, a 80.

É possível mudar o número da porta em que o built-in web server opera. Abra o {cfmx_root}runtimeserversdefaultSERVER-INFjrun.xml, e localize o seguinte:


<service class="jrun.servlet.http.WebService" name="WebService">
<attribute name="port">8500</attribute>
<attribute name="interface">*</attribute>
<attribute name="deactivated">false</attribute>
<attribute name="activeHandlerThreads">10</attribute>
<attribute name="minHandlerThreads">20</attribute>
<attribute name="threadWaitTimeout">350</attribute>
</service>

Mude a porta de 8500 para 80, salve o arquivo e reinicie o serviço do CF.

Ah, é possível ver mais informações sobre o atributo threadWaitTimeout nesse post do Alex.

O outro ponto é o webroot, que fica sob a pasta de instalação do CF. Esse caminho, que pode ser mais cômodo para o desenvolvedor se for em outra pasta, ou até mesmo em outro disco, também pode ser alterado.

Abra o arquivo {cfmx_root}wwwrootWEB-INFjrun-web.xml e localize o seguinte trecho:


<virtual-mapping>
<resource-path>/*</resource-path>
<system-path>d:/cfusionmx/wwwroot/</system-path>
</virtual-mapping>

Altere o conteúdo do system-path para o caminho de sua preferência e copie o diretório “CFIDE” para o seu novo webroot. Feita a alteração, reinicie o serviço do ColdFusion.


UDFs para validar CNPJ e CPF

Os leitores da lista CF-Brasil já viram a quantidade de pedidos por uma função para validar CNPJ e CPF. No arquivo .cfm há uma exemplo (bem simples) de utilização. Ambas funções retornam valor boleano (true/false) para o número de entrada.

Em caso de bugs e sugestões, entre em contato.

CNPJvalidate.zip
CPFvalidate.zip


Macromedia tem novo CEO

Douglas (que está sem forças para fazer um post) manda avisar:

“A Macromedia nomeou seu chief operating officer (COO) Stephen Elop como o novo CEO da companhia.

(…)

Segundo Burgess, uma das maiores oportunidades da Macromedia está nos telefones celulares. De olho nesse mercado, anunciou uma parceria com a Samsung Electronics para adicionar as interfaces gráficas Flash Lite nos novos celulares vendidos em todo o mundo.”

Fonte: ITweb

Mais informações:
Elop named CEO
Samsung licenses Flash Lite


Instalando o SQL Server 2000

Semana passada eu precisei instalar o SQL Server 2000 Personal Edition (aquela que funciona em sistemas Windows sem precisar ser alguma versão “Server”, também conhecida como Developer Edition) em uma um Windows XP SP2. Nada fora do usual, já havia feito isso outras vezes.

Mas claro que não foi tão simples, caso contrário eu não postaria a respeito.

O problema da era logo no início. A instalação simplesmente não saia da tela “Setup is installing Microsoft Data Access Components (MDAC)”. Uma rápida pesquisa na Internet e um artigo no MSDN falando que realmente essa instalação poderia demorar. Tentei novamente e 10 minutos depois (e a mesma mensagem na tela) já percebi que seria mais um dia daqueles…

Procurei saber sobre a compatibilidade entre os softwares, mesmo já tendo feita essa instalação antes, inclusive na mesma máquina (há tempos atrás). As informações referentes à compatibilidade diziam sobre a instalação do SP3a no SQL Server 2000, um padrão que as pessoas devem adotar em qualquer hipótese, já que á uma questão de segurança e performance, não apenas de compatbilidade. Oras, de quê me adianta saber sobre isso se nem o software em si eu conseguia instalar?

Fui falar com o Alex. Ele foi sucinto: refaz a máquina. Nem quis saber do problema, nem ofereceu o cérebro para ajudar a pensar. Talvez ele já tenha tido experiências semelhantes, até mesmo com outros softwares, e sabe que refazer a máquina (formatar, re-instalar sistema, etc) é a melhor solução. Nada como uma máquina “limpa”.

Mas não, eu fui teimoso…

No dia seguinte, com a cuca fresca, eu já havia entendido o problema (a instalação tenta instalar o MDAC 2.6, enquanto o Windows XP SP2 já tem o MDAC 2.8) e fiz mais pesquisas no site de suporte da Microsoft e no Google (também conhecido como deus por alguns…) até que caí em um determinado thread de um fórum em que o cidadão tinha o mesmo problema que eu, e esse thread tinha uma resposta!

A resposta recomenda um KB no site da Microsoft, que assim como o outro usuário do fórum, eu também não tinha visto, mas que também resolveu o problema. Agora, o porque de a instalação ter sido feita com sucesso outras vezes e dessa vez ter dado problema é um mistério…