Parâmetros opcionais em Funções

Tags: , — July 11, 2007 @ 5:43 pm

Este post é um complemento para o próximo post. Como minha intenção era falar sobre funções com número de parâmetros indefinidos, achei melhor postar primeiro sobre funções com parâmetros opcionais, uma vez que, na maioria dos casos, esta solução é suficiente.

Caso precise declarar uma função que receba de 0 a n parâmetros, desde que n seja um quantidade definida, podemos utilizar funções com parâmetros opcionais, estes parâmetros terão um valor padrão (sempre uma constante, nunca uma variável) que será utilizado caso não seja passado nenhum parâmetro à função. Veja o exemplo:

function sayHello ($name = ‘SamuraiDio’)
{
    echo “Hello $name;
}
sayHello (’Paulo Diovani’) ; //imprime ‘Hello Paulo Diovani’
sayHello (); //imprime ‘Hello SamuraiDio’

Os últimos parâmetros que devem ser os opcionais, no caso de mais de um parâmetro.

/*funciona, desde que seja passado o
 *primeiro parâmetro, pelo menos
 */
function sayHello ($name1, $name2 = ‘SamuraiDio’)
{
    echo “Hello $name;
}
/*não funciona, pois a função esperará pelo
*segundo parâmetro,
*e para este ser informado deverá ser
*também informado o primeiro
*/
function sayHello ($name1 = ‘SamuraiDio’, $name)
{
    echo “Hello $name;
}

Este método para declarar funções é muito útil, e geralmente usado em funções de ordenação e afins:

/*ordena o array passado em $array
*em ordem crescente.
*se o segundo parâmetro for passado
*como TRUE, o array será
*ordenado em ordem decrescente.
*/
function arrayOrder (&$array, $desc = FALSE)
{
    if ($desc == FALSE)
    {
        sort($array);
    }
    else
    {
        rsort ($array);
    }
    return ($array);
}

Esse tipo de função, com parâmetros opcionais, geralmente são documentadas da seguinte forma: array arraySort ( array array [, bool desc] )

Gif Injection

Tags: , — June 20, 2007 @ 12:29 pm

Recebi um artigo nesta manhã, do PHP Classes, sobre uma falha de segurança em PHP usando imagens *.gif, onde um usuário poderia inserir códigos php malicioso na imagem.

Eu mesmo fiz alguns testes quanto a vulnerabilidade, que pode ser encontrada em websites que não verifiquem a extensão e conteúdo de um arquivo enviado por upload, verificando, no máximo, as dimensões da imagem.

A função getimagesize() retornará valores nulos caso usada em um arquivo que não seja uma imagem válida, assim, um website que verifique o tamanho de uma imagem antes de serví-la não aceitará normalmente scripts PHP em seus uploads… porém, caso o código PHP seja inserido ao final de uma imagem, a função getimagesize() ainda retornará as dimensões da imagem e o tipo mime corretamente.

Em meu teste utilizei uma imagem GIF de 15×15 brasil.gif. então eu renomeei o arquivo para brasil.gif.php e simplesmente inseri meu código php ao final do arquivo, utilizando um editor de texto simples, com o vi.

PHP Injection on GIF Image

Assim, ao servir a imagem simplesmente apontanto o browser para o arquivo ‘brasil.gif.php’ o código php será executado normalmente, e a função getimagesize() ainda retornará o tamanho da imagem corretamente (achei interessante o modo como o Thunar, gerenciador de arquivos do Xfce4, descreve o arquivo em questão: ‘”brasil.gif.php” (403 B) Script PHP, Tamanho da Imagem: 15×15′).

Esta não chega a ser uma flaha de segurança muito problemática, visto que não é difícil de resolver, para isto, basta seguir algumas precauções de segurança:

  • Renomeio os arquivos (verifique o tipo mime do arquivo, <? $size = getimagesize($filename); $mime = $size['mime']; ?> e renomeio com a extensão adequada);
  • Não sirva diretamente as imagens enviando a url da imagem ao browser, utilize funções como readfile() para isso (envie o tipo de cabecalho e utilize uma função php para exibir a imagem, como <? header (‘Content-Type: image/gif’); readfile ($image_path); ?>

Com pequenos cuidados como estes você não precisará se preocupar…

Fontes: http://www.phpclasses.org/blog/post/67-PHP-security-exploit-with-GIF-images.html, http://ha.ckers.org/blog/20070604/passing-malicious-php-through-getimagesize/

PHPTAL – Template Attribute Language para PHP5

Tags: , , — May 18, 2007 @ 3:13 pm

Como meu primeiro Post específico sobre PHP, vou dar uma boa dica aos desenvolvedores Web.

Qualquer Desenvolvedor de Web Sites dinâmicos, use PHP, ASP, JSP ou Ruby, já se deparou com um fator importante que muitas vezes é um problema… Separar a Lógica da Aplicação do Design de Templates. Assim como é extremamente incômodo para programadores web se peocuparem com o design das páginas (experiência própria) a maioria dos bons designers de templates não conhecem, ou não se interessam por aprender PHP ou outra linguagem de programação.

Quem já se deparou com este dilema provavelmente já procurou por linguagens próprias de templates, desenvolvidas para separar a lógica do design da aplicação. Uma destas linguagens, a qual inclusive tem um espaço no portal php.net, é a Smarty Template Engine (http://smarty.php.net), trata-se de uma classe php que interpreta os arquivos de template (*.tpl), e grava o resultado num cache, para evitar que o trabalho se repita desnecessáriamente. O problema é que: 1. o designer precisa aprender Smarty, o que nao deixa de ser uma linguagem de programação; 2. os templates desenvolvidos para ela servem apenas para PHP.

Recentemente me deparei com uma extenção para o PHP5 que facilita, e muito, o trabalho dos designers. Trata-se do PHPTAL (http://phptal.motion-twin.com), que é uma imlementação do ZPT (Zope Page Templates), ou seja, uma biblioteca de templates XML/XHTML para PHP.

Antes de falar mais sobre como a TAL funciona, vamos observar um fragmento de código de uma template PHP:

Usando a sintexe alternativa do PHP:

<?php foreach ($values as $value): ?>
    <div id=”item”>
        <div id=”title”>
            <?php if ($value->hasDate()): ?>
                <?=$value->getDate()?>
            <?php endif; ?>
            <a href=”<?= $value->getUrl() ?>”>
                <?=htmlentities($value->getTitle())?>
            </a>
        </div>
        <div id=”content”>
            <?= htmlentities($value->getContent()) ?>
        </div>
    </div>
<?php endforeach; ?>

Agora, usando o PHPTAL:

<div id=”item” tal:repeat=”value values”>
    <div id=”item”>
        <span tal:condition=”value/hasDate” 
        tal:replace=”value/getDate”/>
        <a tal:attributes=”href value/getUrl” 
        tal:content=”value/getTitle”/>
    </div>
    <div id=”content” tal:content=”value/getContent”/>
</div>

Usando uma outra biblioteca de templates, o código não ficaria muito diferente do primeiro exemplo, apenas um pouco mais simples de entender. Já o PHPTAL provê uma template com tags XHTML e propriedades XML, sem inserir código alienígena à template.

As propriedades TAL podem parecer um pouco estranhas quando iniciamos com a linguagem. Vamos alterar o código da template um pouco:

<div id=”item” tal:repeat=”value values”>
    <div id=”item”>
        <span tal:condition=”value/hasDate” 
        tal:replace=”value/getDate”>
            2005-01-28
        </span>
        <a href=”sample.html”
            tal:attributes=”href value/getUrl”
            tal:content=”value/getTitle”>
            My item title
        </a>
    </div>
    <span id=”content” tal:content=”value/getContent”>
        This is a sample content which is replaced by the
        real content when the template is run with real
        data.
    </span>
</div>

Assim podemos adicionar textos exemplos ou explicativos as tags, que serão substituidos pelo conteúdo das variáveis. Esta é, na minha opinião, uma das melhores vantagens do PHPTAL sobre outras bibliotecas de templates. Pois permite que os templates seja visualizados por qualquer navegador mesmo sem um servidor PHP.

Vejamos algumas vantagens em se utilizar PHPTAL:

  • separação da lógica da apresentação;
  • avisa se sua tag html estiver mal formatada ou não estiver fechada;
  • sem mais htmlentities();
  • templates bastante limpas e legíveis;
  • possibilidade de inserir textos exemplos para pré-visualizar a template sem um servidor PHP;
  • integração fácil com editores HTML visuais;
  • sistema de internacionalização (i18n) integrado;
  • pouquíssima perda de velocidade;
  • suporte da comunidade ZPT (http://zope.org);
  • portabilidade, os templates produzidos com TAL podem, geralmente, ser utilizados com qualquer linguagem (PHP, ASP, etc.).

O PHPTAL funcionará apenas com PHP5, por causa das funcionalidades de Orientação a Objeto adicionadas no PHP5, e não terá suporte às versões anteriores da linguagem. Mas como diz o desenvolvedor da biblioteda: “Forget PHP4″.

Não vou extender mais o artigo mas, se desejarem posso postar mais conteúdo sobre o PHPTAL aqui. Para quem quiser discutir a biblioca apenas comente. Podemos também montar um grupo para traduzir o Manual do PHPTAL para português.
Fontes: http://phptal.motion-twin.com, http://zope.org.

TIOBE Programming Community Index

Tags: , , — May 16, 2007 @ 3:44 pm

A Comunidade de Programação TIOBE divulga todo mês uma pesquisa da popularidade das linguagens de programação.

Este mês o PHP ficou em quarto lugar, precedido por Java, C e C++. Conforme a pesquisa, a popularidade da linguagem Ruby, que vinha crescendo nos últimos meses, parou no décimo lugar.

Veja a pesquisa no índice da comunidade TIOBE em
http://www.tiobe.com/index.htm?tiobe_index

<<< Previous Page