Sophie

Sophie

distrib > Mandriva > 2008.1 > i586 > by-pkgid > 703d980c580707c382b4e43e25965bc5 > files > 12146

php-manual-pt_BR-5.2.4-1mdv2008.1.noarch.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML
><HEAD
><TITLE
>Usando a diretiva Register Globals</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
REL="HOME"
TITLE="Manual do PHP"
HREF="index.html"><LINK
REL="UP"
TITLE="Segurança"
HREF="security.html"><LINK
REL="PREVIOUS"
TITLE="Relatando Erros"
HREF="security.errors.html"><LINK
REL="NEXT"
TITLE="Dados Enviados pelo Usuário"
HREF="security.variables.html"><META
HTTP-EQUIV="Content-type"
CONTENT="text/html; charset=UTF-8"></HEAD
><BODY
CLASS="chapter"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Manual do PHP</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="security.errors.html"
ACCESSKEY="P"
>Anterior</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="security.variables.html"
ACCESSKEY="N"
>Próxima</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="chapter"
><H1
><A
NAME="security.globals"
>Capítulo 29. Usando a diretiva Register Globals</A
></H1
><P
>&#13;    Talvez a mudança mais controversa no PHP foi quando o valor padrão da
    diretiva do PHP <A
HREF="ini.core.html#ini.register-globals"
>&#13;    register_globals</A
> passou de ON (Ligado) para OFF (Desligado) na versão
    <A
HREF="http://www.php.net/releases/4_2_0.php"
TARGET="_top"
>4.2.0</A
>. Era muito comum as
    pessoas dependerem da diretiva e muitas delas nem sabiam que ela existia
    e presumiam que era a maneira como o PHP funcionava. Essa página explica como
    alguém pode escrever código inseguro com essa diretiva, mas tenha em mente que
    a diretiva em si não é insegura, o uso incorreto dela é que é.
   </P
><P
>&#13;    Quando ligada, a diretiva register_globals criará para seus scripts vários
    tipos de variáveis, como as variáveis oriundas de formulários HTML. Isso,
    combinado com o fato de que o PHP não requer inicialização de variáveis,
    significa que é mais fácil escrever código inseguro. Foi uma decisão
    difícil, mas a comunidade do PHP decidiu que, por padrão, essa diretiva
    deveria ser desabilitada. Quando habilitada, é possível usar variáveis sem saber ao
    certo de onde elas vieram. Variáveis internas que são definidas no script em si
    se misturam com dados enviados pelos usuários e
    desabilitando a diretiva muda isso. Vamos demonstrar
    um exemplo de uso incorreto de register_globals:
   </P
><P
>&#13;    <TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
CLASS="EXAMPLE"
><TR
><TD
><DIV
CLASS="example"
><A
NAME="AEN6588"
></A
><P
><B
>Exemplo 29-1. Exemplo de uso incorreto de register_globals = on</B
></P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
CELLPADDING="5"
><TR
><TD
><code><font color="#000000">
<font color="#0000BB">&lt;?php<br /></font><font color="#FF8000">// define $authorized = true somente se o usuário for autenticado<br /></font><font color="#007700">if (</font><font color="#0000BB">authenticated_user</font><font color="#007700">()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$authorized </font><font color="#007700">= </font><font color="#0000BB">true</font><font color="#007700">;<br />}<br /></font><font color="#FF8000">// Porque nós não inicializamos $authorized como false, ela pode ser<br />// definida através de register_globals, como usando GET auth.php?authorized=1<br />// Dessa maneira, qualquer um pode ser visto como autenticado!<br /></font><font color="#007700">if (</font><font color="#0000BB">$authorized</font><font color="#007700">) {<br />&nbsp;&nbsp;&nbsp;&nbsp;include </font><font color="#DD0000">"/highly/sensitive/data.php"</font><font color="#007700">;<br />}<br /></font><font color="#0000BB">?&gt;</font>
</font>
</code></TD
></TR
></TABLE
></DIV
></TD
></TR
></TABLE
>
   </P
><P
>&#13;    Quando register_globals estiver habilitada, sua lógica pode ser comprometida. Quando
    desligada <CODE
CLASS="varname"
>$authorized</CODE
> não pode ser configurada via GET, então
    estará correto, embora geralmente seja uma boa prática de programação
    inicializar as variáveis primeiro. Por exemplo, no nosso exemplo acima nós podemos
    executar primeiro <TT
CLASS="literal"
>$authorized = false</TT
>. Dessa forma
    o código funcionaria com register_globals ligada ou desligada, já que
    os usuário não seriam autorizados a não ser que a autenticação tenha sucesso.
   </P
><P
>&#13;    Outro exemplo é o quando usando <A
HREF="ref.session.html"
>sessions</A
>.
    Quando a diretiva está ligada, nós também podemos usar
    <CODE
CLASS="varname"
>$username</CODE
> no exemplo mas novamente é preciso
    perceber que <CODE
CLASS="varname"
>$username</CODE
> também pode vir de outro lugar,
    como via GET (através da URL).
   </P
><P
>&#13;    <TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
CLASS="EXAMPLE"
><TR
><TD
><DIV
CLASS="example"
><A
NAME="AEN6599"
></A
><P
><B
>Exemplo 29-2. Exemplo de uso de sessões com register_globals ligada ou desligada</B
></P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
CELLPADDING="5"
><TR
><TD
><code><font color="#000000">
<font color="#0000BB">&lt;?php<br /></font><font color="#FF8000">// Nós não saberiamos de onde $username veio mas sabemos que $_SESSION<br />// guarda dados da sessão.<br /></font><font color="#007700">if (isset(</font><font color="#0000BB">$_SESSION</font><font color="#007700">[</font><font color="#DD0000">'username'</font><font color="#007700">])) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;echo </font><font color="#DD0000">"Hello &lt;b&gt;</font><font color="#007700">{</font><font color="#DD0000">$_SESSION</font><font color="#007700">[</font><font color="#DD0000">'username'</font><font color="#007700">]}</font><font color="#DD0000">&lt;/b&gt;"</font><font color="#007700">;<br /><br />} else {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;echo </font><font color="#DD0000">"Hello &lt;b&gt;Guest&lt;/b&gt;&lt;br /&gt;"</font><font color="#007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;echo </font><font color="#DD0000">"Would you like to login?"</font><font color="#007700">;<br /><br />}<br /></font><font color="#0000BB">?&gt;</font>
</font>
</code></TD
></TR
></TABLE
></DIV
></TD
></TR
></TABLE
>
   </P
><P
>&#13;    Além disso tudo, é possível tomar medidas preventivas para avisar quando alguém
    está tentando criação de variáveis falsas. Se você sabe de antemão de onde uma
    variável deve vir, você pode verificar se os dados enviados estão
    chegando de maneira incorreta. Embora isso não seja garantia
    de que os dados não são forjados, torna necessário ao atacante
    adivinhar o tipo certo de falsificação. Se você não se importar de onde os
    dados vierão, você pode usar o array <CODE
CLASS="varname"
>$_REQUEST</CODE
>, que
    contêm a mistura dos dados de GET, POST e COOKIE. Veja também a seção do manual
    sobre como usar <A
HREF="language.variables.external.html"
>variáveis de fora
    do PHP</A
>.
   </P
><P
>&#13;    <TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
CLASS="EXAMPLE"
><TR
><TD
><DIV
CLASS="example"
><A
NAME="AEN6606"
></A
><P
><B
>Exemplo 29-3. Detecção simples de falsificação de variáveis</B
></P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
CELLPADDING="5"
><TR
><TD
><code><font color="#000000">
<font color="#0000BB">&lt;?php<br /></font><font color="#007700">if (isset(</font><font color="#0000BB">$_COOKIE</font><font color="#007700">[</font><font color="#DD0000">'MAGIC_COOKIE'</font><font color="#007700">])) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#FF8000">// MAGIC_COOKIE vem de um cookie.<br />&nbsp;&nbsp;&nbsp;&nbsp;// Valide os dados do cookie!<br /><br /></font><font color="#007700">} elseif (isset(</font><font color="#0000BB">$_GET</font><font color="#007700">[</font><font color="#DD0000">'MAGIC_COOKIE'</font><font color="#007700">]) || isset(</font><font color="#0000BB">$_POST</font><font color="#007700">[</font><font color="#DD0000">'MAGIC_COOKIE'</font><font color="#007700">])) {<br /><br />&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">mail</font><font color="#007700">(</font><font color="#DD0000">"admin@example.com"</font><font color="#007700">, </font><font color="#DD0000">"Possível tentativa de ataque"</font><font color="#007700">, </font><font color="#0000BB">$_SERVER</font><font color="#007700">[</font><font color="#DD0000">'REMOTE_ADDR'</font><font color="#007700">]);<br />&nbsp;&nbsp;&nbsp;echo </font><font color="#DD0000">"Violação de Segurança, o Administrador foi alertado."</font><font color="#007700">;<br />&nbsp;&nbsp;&nbsp;exit;<br /><br />} else {<br /><br />&nbsp;&nbsp;&nbsp;</font><font color="#FF8000">// MAGIC_COOKIE não foi criada por essa REQUEST<br /><br /></font><font color="#007700">}<br /></font><font color="#0000BB">?&gt;</font>
</font>
</code></TD
></TR
></TABLE
></DIV
></TD
></TR
></TABLE
>
   </P
><P
>&#13;    É óbvio que só desligar register_globals não significa que seu código
    está seguro. Cada dado que é enviado deve ser validado de
    outras maneiras. Sempre valide os dados enviados pelos usuário e inicialize
    suas variáveis! Para checar por variáveis não inicializadas, você pode configurar
    <A
HREF="function.error-reporting.html"
><B
CLASS="function"
>error_reporting()</B
></A
> para mostrar erros do nível
    <TT
CLASS="constant"
><B
>E_NOTICE</B
></TT
>.
   </P
><P
>&#13;    Para mais informações sobre emulação de register_globals como ligada ou desligada, veja esse <A
HREF="faq.misc.html#faq.misc.registerglobals"
>FAQ</A
>.
   </P
><DIV
CLASS="note"
><BLOCKQUOTE
CLASS="note"
><P
><B
>Disponibilidade das superglobais:: </B
>Desde o PHP 4.1.0, os arrays superglobais como <CODE
CLASS="varname"
>$_GET
 </CODE
>, <CODE
CLASS="varname"
>$_POST</CODE
>, <CODE
CLASS="varname"
>$_SERVER</CODE
>,
 etc. sempre estão carregados. Para mais informações, leia a seção do manual
 sobre <A
HREF="language.variables.predefined.html"
>superglobals</A
></P
></BLOCKQUOTE
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="security.errors.html"
ACCESSKEY="P"
>Anterior</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
ACCESSKEY="H"
>Principal</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="security.variables.html"
ACCESSKEY="N"
>Próxima</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Relatando Erros</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="security.html"
ACCESSKEY="U"
>Acima</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Dados Enviados pelo Usuário</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>