Serenão Serenidade e anonimato são as características do ser mais evoluído

20fev/100

Pequena reflexão sobre a vaidade

Não é exagero dizer que vaidade move o mundo, pois ela é o fomento, o estímulo de grande parte das ações humanas. Em qualquer lado que se olhe, lá está a vaidade atuando em diversas formas em que se possa expressar.

A vaidade conseguiu feitos notáveis; sem ela, o homem não teria pisado na Lua, não teria construído empreendimentos, não teria realizados feitos que deixaria seu nome gravado na história. A vaidade também é um estímulo para as boas ações, para a cordialidade, para a educação; pois os humanos preferem cumprir os regulamentos a serem chamados ou alcunhado por um nome depreciativo que fira seu ego: a vaidade prefere que nós sejamos educados a sermos chamados de mal-educados; prefere que sejamos estudados a sermos chamados de ignorantes; prefere que sejamos gentis a sermos chamados de brutos. A vaidade contribui para o progresso na medida que estimula a divulgação de conhecimento sob forma de artigos de internet, livros ou qualquer forma em que possa aparecer seu nome. A vaidade está em tudo, até nas afirmação sobre a falta de vaidade. Quem diz não ter vaidade ou humildade, já mostrou não o ter, pois faz dessas virtudes a sua própria vaidade.

Vaidade tem sua utilidade na sociedade, ela é autora de incontáveis artigos espalhados pela internet, é criadora de todos os empreendimentos humanos, é a responsável pelas invenções e inovações em todos os setores da atividade humana.

13fev/100

Como criar um objeto dinâmico no Flex

Em Flex, utiliza-se duas linguagens para compor uma aplicação: MXML e ActionScript 3 (AC3). A primeira é uma linguagem de marcação que representa objetos estáticos de uma tela, semelhante ao Document Object Model (DOM) de uma página web. ActionScript 3 por sua vez é a linguagem do FlashPlayer com suporte a orientação a objetos.

Como toda linguagem orientada a objetos ou com suporte a orientação, AC3 permite montar objetos, e uma das suas formas de criação é mostrada a seguir:

1
var objeto:Object = {propriedade1:"valor1", propriedade2:"valor2"};

Na linha acima, é criado uma variável do tipo objeto. Não é necessário instanciar um objeto usando a declaração "new", pois Object é uma classe nativa do Flex. O objeto criado contém duas propriedades e seus respectivos valores.

1
2
trace(objeto.propriedade1); // valor1
trace(objeto.propriedade2); // valor2

Objetos são constituídos de propriedades e valores. No exemplo acima, definimos quais eram as propriedades e quais eram seus valores. Os valores podem ser formados por qualquer tipo de dados, qualquer outros objeto ou qualquer classes. Os valores poderiam ser dados provenientes do banco de dados no formato de string, int ou date; poderia ser um objeto VBox, um componente customizado ou qualquer outra coisa. Entretanto, as propriedades precisam ser definidas na criação do objeto e eles não representam nenhum tipo de dado como acontece com seu valor.

1
2
// Errado
var objetoBancoDados:Object = {resultadoSqlNomePropriedade[0]: resultadoSqlValor[0]}; // Errado

No código acima, compilador do Flex acusará erro, porque propriedade de objeto não guarda, não representa nenhum tipo de dado, mas no código, a propriedade está tentando ser criada dinamicamente e recebendo um dado de algum tipo.

De vez em quando, existe a necessidade de se ter um objeto dinâmico, um que seja criado com bases em parâmetros provenientes de um banco de dados por exemplo, de um XML, de um arquivo texto, de um webService... Então como criar um objeto totalmente dinâmico?

A solução para um objeto dinâmico em Flex

Vejamos passo a passo como superar a dificuldade apresentada anteriormente. Utilizaremos uma técnica chamada JSON (JavaScript Object Notation), que, apesar do nome, não é exclusiva da linguagem JavaScript. JSON pode ser incorporada em qualquer linguagem com suporte a objetos.

Consiste em escrever todo seu objeto como tipo de dado String e seguindo a notação normal de um objeto (exceto pelo fato de a propriedade ser escrita como uma string).

1
var json:String = '{"propriedade1":"valor1","propriedade2":"valor2"}';

Uma vez escrita nosso json, precisamos tranformá-lo em objeto propriamente dito. Existe uma biblioteca capaz de faz isso automaticamente para nós. Chama-se "as3corelib.swc" (veja no final do post o link para download), nessa biblioteca, há vários métodos estáticos que podem ser usados assim que a biblioteca for alocada no projeto (assim que esteja na pasta Lib do projeto e configurada corretamente no Library path).

1
2
var json:String = '{"propriedade1":"valor1","propriedade2":"valor2"}';
var objeto:Object = JSON.decode(json);

Na linha 2, o método estático "decode" da classe JSON avalia a string e a tranforma em objeto. Se a string estiver mal formatada, uma mensagem de erro aparecerá. Seguindo o padrão de notação estabelecido pelo JSON, não haverá erros.

1
2
var jsonBancoDados:String = '{"' + resultadoSqlNomePropriedade[0] + '" : "' + resultadoSqlValor[0] + '"}';
var objeto:Object = JSON.decode(jsonBancoDados);

Pronto, no código acima, um objeto é construido dinamicamente no Flex. Os dados que constituem a propriedade e o valor vêem do banco de dados. A necessidade de um objeto dinâmico é encontrada em vários casos. Um exemplo apenas: quando se monta um gráfico de colunas em que a series do eixo X não é conhecida.

Biblioteca JSON para Flex: http://code.google.com/p/as3corelib/
JSON: http://www.json.org/

12out/090

Evitando Sql Injection com Php

Sql Injection, o que é?

Sql Injection é um ataque ao banco de dados de uma aplicação no qual uma sql é injetada principalmente através de campos abertos de entrada de dados. Por exemplo: uma página de cadastro de usuário deve ter um campo chamado "Login" em que permitirá entrada de valores alphanuméricos. Entretanto, campos abertos como esse podem se tornar verdadeiras portas de invasão, uma vez que permite introduzir instruções Sql que podem ocasionar riscos à segurança da aplicação.

Quando digo ataque, refiro-me no ato de corromper um elemento do sistema fazendo-o um instrumento de uso enodoado com o fim de interferir nas estruturas das tabelas ou do próprio conteúdo do banco de dados.

Como acontece na prática?

Imagine o seguinte excerto de cadastro de novo usuário no front-end:

1
2
3
<form action="alvo.php" method="POST">
      <input type="text" name="user"/>
</form>

O campo Login permite entrada de qualquer caracter, e esse vai direto para uma página PHP no back-end:

1
2
$user = $_POST['user'];
$sql = "insert into Usuario (usuario) values ('$user')";

Do jeito que está, o usuário mal intensionado poderá inserir no campo de cadastro:

  • some value'); delete from usuario; "
  • Ficando assim: "insert into Usuario (usuario) values ('some value'); delete from usuario; "')"
1
2
3
$user = $_POST['user'];
$sql = "insert into Usuario (usuario) values ('$user')";
// $sql = "insert into Usuario (usuario) values ('some value'); delete from usuario; "')";

Resultado: um novo registro é cadastrado e, logo em seguida, o mesmo é apagado junto com os registros da tabela de usuários.

Há solução?

Há pelo menos dois meios para contornar esse problema:

  1. Consistir os campos no front-end através de javaScript;
  2. Consistir os "inputs" no próprio back-end utilizando (no nosso caso) da linguagem extremamente simples chamada Php.

A forma mais recomendada é a 2ª (no back-end), pois evita de o usuário manipular o javaScript da página afim de burlar a consistência.

Programar em Php é muito simples e fácil, ele possui funções prontas para quase tudo além de contar com milhares de classes e códigos prontos na internet.

O comando, então, para resolver nosso problema é o addslashes. Observe abaixo como ele é implementado no código:

1
2
3
4
5
6
7
8
$user = addslashes($_POST['user']);
 
// $_POST['user'] contém: ’); delete from usuario; “
// $user contém \’); delete from usuario; \“
 
$sql = "insert into Usuario (usuario) values ('$user')";
 
// finalmente, $sql ficará "inviolável": insert into Usuario (usuario) values ('\’); delete from usuario; \“')

Explicação:
Na linha 1, o comando addslaches adicionou caracteres de escape na string vinda do formulário. Por esse motivo, qualquer coisa inserida no campo pelo usuário, será interpretada como string pelo banco de dados.

Uma outra forma é controlar o que se envia através da aplicação usando consistências nos formulários. Essa forma, como já citei, é menos recomendada pelo fato de o usuário poder alterar o comando javaScript usando plugins como firebug e outros.

1
2
3
<form action="alvo.php" method="POST">
      <input type="text" name="user" onkeydown="return addslashes(this.value)"/>
</form>

O campo user agora envia seu conteúdo para a função addslashes, e esse retorna a string tratada, com os caracteres de escapes. Veja adiante a função javaScript:

1
2
3
4
function addslashes (str) {
    retorno = str.replace(/'/g,"\\'");
    return retorno.replace(/"/g,"\"");
}

Pronto, a consistência está feita via javaScript. A linha 2, substitui todas as ocorrências de apóstrofe (') por ela mesma seguida de seu escape (\'). A linha 3 faz o mesmo, porém com as aspas duplas (").

SqlInjection pode ser evitado através de várias técnicas, as duas mais simples são as que mostrei acima, com elas (principalmente a 1ª) podemos garantir o envio de dados em vez de instruções Sql por parte do usuário.