sábado, 9 de fevereiro de 2008

print_r em JavaScript

Este post é um clone do post do blog do Anselmo Battisti.

Pra quem programa em PHP e conhece a função print_r(), abaixo segue uma função em JavaScript que se propõe a fazer o mesmo, exibir todas as entradas de um vetor passado como parâmetro.

function print_r(theObj)
{
if(theObj.constructor == Array || theObj.constructor == Object)
{
document.write("<ul>");
for(var p in theObj)
{
if(theObj[p].constructor == Array || theObj[p].constructor == Object)
{
document.write("<li>["+p+"] => "+typeof(theObj)+"</li>");
document.write("<ul>");
print_r(theObj[p]);
document.write("</ul>");
} else
{
document.write("<li>["+p+"] => "+theObj[p]+"</li>");
}
}
document.write("</ul>");
}
}
Para testar a função basta:
var vetor = new Array( "casa", "loja", "barraco", "apartamento", "piscina", "carro" );
print_r(vetor)
O resultado é algo como:

* [0] => casa
* [1] => loja
* [2] => barraco
* [3] => apartamento
* [4] => piscina
* [5] => carro

quinta-feira, 31 de janeiro de 2008

Alterar idioma do Firefox

Para os entusiastas do idioma inglês e adeptos do Firefox, existe uma extensão que permite alterar entre idiomas no Firefox, ou seja, independente do idioma da versão que você instalou, tal idioma pode ser modificado.

O primeiro passo para modificar o idioma do Firefox é instalar a extensão Locale Switcher, que permite alternar entre os idiomas instalados. Feito isso basta escolher o idioma desejado no (veja logo abaixo como fazer isso) e instalá-lo. A Locale Switcher irá criar um menu adicional em Ferramentas->Idiomas, onde será possível alterar o idioma do Firefox.

Para acessar o repositório de idiomas do Firefox, siga os seguintes passos:

  1. Entre no site http://releases.mozilla.org/pub/mozilla.org/firefox/releases/
  2. Selecione a versão do seu Firefox (ou uma compatível);
  3. Clique na pasta do seu sistema operacional;
  4. Abra a pasta xpi (uma das últimas da listagem);
  5. Faça o download do idioma desejado.

terça-feira, 29 de janeiro de 2008

Cálculo de juro simples e composto

Siglas:
C ou P Capital ou Principal
J Juro
i Taxa de juro
M Montante
n Número de períodos

Juros simples são sempre calculados sobre o valor inicial da transação, não importando o montante final e o período.
J = P * i * n (Quanto vai pagar de juro)
M = P + (i * P) (Montante)


Exemplo: Um homem tem uma dívida de R$ 1000,00 que deve ser paga com juros de 8% a.m. (ao mês) pelo regime de juros simples e deve pagá-la em 1 meses. Os juros que o homem pagará serão:
J = P * i * n
J = 1000 * 0.08 * 1
J = R$ 80,00


Qual o total que terá que pagar no final?
M = P + (i * P)
M = 1000 + (0.08 * 1000)
M = R$ 1080,00


Juros compostos de cada período de tempo é calculado sobre o saldo no início do período anterior, ou seja, os juros de cada intervalo de tempo é incorporado ao capital inicial e passa a render juros também.
M = P * (1 + i)n

Exemplo: Um homem empresta R$ 1000,00 com juros de 10% a.m. (ao mês) para ser pago em 1 ano.
M = 1000 * (1 + 0.10)12
M = R$ 3138,42


A taxa de juros e o número de períodos devem ser equivalentes, ou seja, se a taxa de juro é mensal, o cálculo deve levar em consideração os meses. No exemplo, o homem irá pagar a dívida em 1 ano, ou seja, 12 meses. Dessa forma a medida de períodos se iguala a medida da taxa de juro.

quarta-feira, 16 de janeiro de 2008

Evitar injection em formulários web

Quando se fala em segurança, o que se deve ter em mente é a integridade dos dados no banco de dados e a possível utilização de formulários para fins não esperados.

A função abaixo em PHP é um exemplo simples - não totalmente abrangente e completo - para se evitar injeções de códigos em formulários de sites.

/**
* @abstract Tratamento de injections em formulários.
* @return string
*/
function antiInjection($str)
{
# Remove palavras suspeitas de injection.
$str = preg_replace(sql_regcase("/(\n|\r|%0a|%0d|Content-Type:|bcc:|to:|cc:|Autoreply:|from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"), "", $str);
$str = trim($str); # Remove espaços vazios.
$str = strip_tags($str); # Remove tags HTML e PHP.
$str = addslashes($str); # Adiciona barras invertidas à uma string.
return $str;
}


Para garantir que nenhum dado passado por formulário, seja ele GET ou POST, ou passado via URL (GET), contenha qualquer tipo de código malicioso, deve-se validar todos os valores que são passados. O código a seguir exemplifica como isto pode ser feito. No exemplo é abordado o vetor POST, mas o mesmo pode ser aplicado aos demais vetores, como GET, COOKIE, SESSION, etc.

UPDATE

Como formulários podem conter vetores dentro de vetores (p.e. vetor de checkbox dentro do POST, que é um vetor), adicionei mais uma função que faz essa verificação, ou seja, se existir um vetor dentro de um vetor, para cada valor existente é verificado os injections.

/**
* @abstract Antes de tratar os injections, verifica se é vetor ou não.
*/
function validaParametro($vetor)
{
if (is_array($vetor))
{
foreach ($vetor as $chave => $valor)
{
if (is_array($valor))
{
$vetor[$chave] = validaParametro($valor);
} else $vetor[$chave] = antiInjection($valor);
}
} else $vetor[$chave] = validaParametro($valor);
return $vetor;
}


Para chamar a função basta:
# Para cada entrada de POST, faz a verificação de possíveis injections.
$_POST = validaParametro($_POST);


Caso queira fazer um teste, basta criar um formulário com campos normais e vetores e, ao final dar um var_dump($_POST); para ver o resultado.

A dica de validar vetores internos foi do Anselmo Battisti, meu parceiro de faculdade!

sábado, 12 de janeiro de 2008

Formulário de solicitação de mudança (CRF)

Todo software passa por mudanças. As solicitações de mudança devem ser registradas em banco de dados de configuração. Isto facilita o acompanhamento do status das solicitações de mudança que são associadas com componentes de software específicos.

Abaixo é mostrado um exemplo de formulário de solicitação de mudança parcialmente preenchido.

Projeto: Projetus/PCL-TOOLS    Número: 23/94
Requisitante da mudança: I. Sommerville Data: 1/12/98
Mudança solicitada: O que deve ser feito.

Analista da mudança: G. Dean Data de análise: 10/12/98
Componentes afetados: Display-Icon.Select, Display-Icon.Display

Componentes associados: FileTable

Avaliação da mudança: Relativamente simples de implementar quando uma tabela de nomes está
disponível. Requer o projeto e a implementação de um campo de display. Nenhuma mudança é
requerida nos componentes associados.

Prioridade da mudança: Baixa
Implementação da mudança:
Esforço estimado: 0,5 dia
Implementador da mudança: Data da mudança:
Comentários:

Compare Preços de: Celular, DVD, câmera digital, livros no JáCotei.

sexta-feira, 4 de janeiro de 2008

Formatar Números com PHP

Com o PHP é possível formatar números com casas decimais, vírgulas e pontos. A função utilizada para isto é a number_format().

Vale lembrar que esta função aceita somente 1, 2 ou 4 parâmetros.

Segue alguns exemplos da utilização da função:

$valor = 123456;

echo number_format($valor); # 123,456
echo number_format($valor, 2, ",", " "); # 123 456,00
echo number_format($valor, 2, ".", ""); # 123456.00
echo number_format($valor, 2, ",", "."); # 123.456,00

O JavaScript possui funções específicas para obter a resolução da tela do usuário. O seguinte código obtém a altura e largura da resolução do monitor:

<script type="text/javascript">
function getResolucao()
{
if (self.screen)
{
largura = screen.width;
altura = screen.height;
}
}
</script>


Dessa forma as variáveis largura e altura irão possuir respectivamente a largura e a altura da resolução do monitor.

quinta-feira, 3 de janeiro de 2008

Desabilitar Botão Direito do Mouse

Com JavaScript é possível desabilitar o menu contextual que aparece quando se clica com o botão direito do mouse em um site. Vale ressaltar que este é apenas um método para incrementar a segurança, não sendo referência definitiva no quesito segurança. Qualquer usuário com um pouco mais de conhecimento pode desabilitar ou burlar esta função.

O seguinte código desabilita o menu contextual exibido a partir do clique com o botão direito do mouse:

<script language=JavaScript>
function desabilitaConexto()
{
alert("Tratamento qualquer para a chamada da função.");
return false;
}

document.onContextMenu = desabilitaConexto();
</script>

Lembrando que qualquer script deve estar entre as tags <head> e </head>.

O termo "validação em JavaScript" é um pouco incorreto para descrever o processo de amparar os usuários no momento de preencher corretamente formulários. Na verdade, a linguagem server-side adotada executa a validação - JavaScript meramente provê uma assistência. Mas quando a validação e a assistência não vem da mesma origem, não faz mais do que confundir as pessoas.

Formulários web são os meios pelos quais o HTML se faz interativo - é através destes formulários que as aplicações web recebem dados dos usuários. As vezes estes dados podem não possuir restrições. Em outras ocasiões, os dados devem ser avaliados para garantir que os dados inseridos estão no formato correto, particularmente informações como endereços de e-mail, URLs e cartões de crédito. É sabido que a chave para dados bem formatados é a validação no lado do servidor, e o JavaScript apenas ajuda o usuário a saber o formato correto desejado sem ter que esperar por um processamento no lado do servidor. Desenvolvedores têm combinado funcionalidades do JavaScript com validações no lado do servidor. Contudo, a maioria das formas de validação realizam a mesma tarefa, usando tecnologias diferentes. Um sistema bem implementado e relativamente seguro implementa validações no lado do servidor e utiliza JavaScript para melhorar a interatividade com o usuário.

Estritamente falando a validação com JavaScript não é uma validação - apenas auxilia na entrada de dados. Qualquer um pode burlar o JavaScript; é uma ajuda, não a palavra final. Ele simplesmente ajuda a dar confiança para o usuário no momento de pressionar o botão para submeter as informações.

JavaScript fornece assistência quando construído separadamente à validação no lado do servidor, mas não é o ideal. Na pior das hipóteses, as duas validações irão funcionar diferentemente, e o que é válido no cliente não é válido no servidor. Na melhor das hipóteses, as validações irão trabalhar corretamente. Mas com a validação em vários locais, há uma crescente probabilidade de que apenas uma irá receber os dados atualizados quando mudanças forem requeridas, obtendo neste ponto resultados inconsistentes.

Um exemplo da obrigatoriedade do uso de validações no lado do servidor é quando da entrada de dados pelo usuário, onde tais dados interagem com o banco de dados. Dependendo de como os scripts do aplicativo web foram construídos, existe a possibilidade de tentar uma invasão indireta. Suponha que uma página tenha um campo que permite ao usuário digitar um palavra a ser buscada. Quando insere os dados e envia ao servidor, o script cria uma consulta simples:

SELECT * FROM tabela WHERE campo = 'padrao';

Como neste caso o caractere delimitador usado é o apóstrofo, pode-se enganar o sistema digitando algo como:
"padrao'; DELETE * FROM tabela;"

O resultado disto é que todos os dados da tabela "tabela" serão apagados. Ou seja, se existe apenas um mecanismo de validação em JavaScript que impessa de entrar com caracteres especiais SQL, este mecanismo pode ser facilmente burlado e a string contendo funções SQL irá para o servidor e será executada.

Finalmente, a validação no lado do servidor é requerida. JavaScript auxilia de maneira agradável. Se você busca segurança, pense primeiro em todas as possibilidades de validações no lado do servidor e só então valide com JavaScript.

Livre tradução de JavaScript: It's Just Not Validation!
Adaptado por Anderson Dias

O Internet Explorer leva em conta não a altura indicada de um elemento, mas sim as alturas dos elementos desse elemento.

Com o código abaixo é possível fazer com que a altura indicada em porcentagem para uma DIV seja respeitada no Internet Explorer, ou seja, se uma DIV é pra ter 100% de altura, então ela terá!

Testei este código no Internet Explorer, Firefox e Opera, funcionou em todos. Provável que funcione para qualquer nevegador.

<style type="text/css">
html {
height: 100%;
}
body {
margin:0;
padding:0;
height:100%;
}
#camadaTeste {
min-height:100%;
height:auto;
width:100px;
background:#FFCC00;
}
/* Para Internet Explorer */
* html #camadaTeste {
height:100%;
}
</style>

<div id="camadaTeste">Conteúdo</div>


UPDATE

#camadaTeste: removida a propriedade height:100% e acrescentada min-height:100%; height:auto;
Acrescentada a correção para casos de conteúdo extenso que necessitem de redimensionamento automático:

/* Para Internet Explorer */
* html #camadaTeste {
height:100%;
}


Valeu "Anônimo" pela observação!