Mostrando postagens com marcador htaccess. Mostrar todas as postagens
Mostrando postagens com marcador htaccess. Mostrar todas as postagens

terça-feira, novembro 25, 2008

Register Globals no PHP

Esses dias senti na pele o problema do register_globals = on.
No site do PHP diz o que e porque a diretiva foi abolido da versão 6, e sempre concordei. Era facilidade demais e tornou-se perigosa.
Quando ON, ela faz com que eu possa acessar a variável $_POST['nome'] diretamente de $nome, por exemplo, ou ainda $_SESSION['id'] através de $id ou $_GET['act'] de $act. O problema de segurança exsite porque ao perguntar $id (querendo me referir à sessão) se for passado na URL, por exemplo, ...pagina.php?id=2, $id vai assumir o valor 2, se anteriormente não tiver sido atribuido nada para essa variável. Este é o clássico exemplo do site:
O que aconteceu comigo seria isso, se não tivesse acontecido algo antes. em um projeto meu, carrego as variáveis antes de tudo. Até aí... beleza. Mas cometi um erro pois não estava acostumado com a diretiva ligada: usei sessão com o mesmo nome.
...$nome = (isset($_POST['nome']) ? $_POST['nome'] : '';
if ($_SESSION['nome']!='') ...
...

Isso fez com que toda hora eu limpasse a sessão.
Verifiquei no phpinfo(); e a benedita tava ligada; tentei mudar para "off" no próprio script e nada. Solução: mudei os nomes das variáveis de sessão para, por exemplo, sess_nomeoriginal.
Lição aprendida 1: Não usar os nomes iguais nas variáveis principalmente de sessão.
Lição aprendida 2: Não confiar em servidores de clientes; por causa de aplicações que necessitam da diretiva register_globals = on, muitas vezes é assim que fica configurado.
Pela teoria eu poderia mudá-la através do script php com
ini_set('register_globals','off');
mas não consegui.
Depois de fazer minha alteração, é que eu descobri porque não funcionou o ini_set: esta diretiva não tem efeito no script: deve ser colocada no arquivo .htaccess, já que ela só pode ser alterada no php.ini, .htaccess e no httpd.conf.
php_flag register_globals off
Você pode ver a lista completa de diretivas e onde alterá-las através do site.
Minha solução não foi ideal, mas agora vou prestrar mais atenção nos nomes das variáveis. Mesmo com a versão 6 chegando, tem lugares que usam ainda a 4.

Abraço!

terça-feira, setembro 09, 2008

Permitir somente index.php pelo .htaccess

Apesar de haver vários frameworks, tem coisa que faço sem a utilização deles. Acho que isso é comum para desenvolvedores. É legal proibir o acesso direto do usuário aos arquivos do seu site, como uma imagem ou até mesmo um script que faça algo mais delicado como excluir_usuario.php, por exemplo. No Apache é fácil fazer isso usando o arquivo .htaccess.

Vamos lá:

Crie um arquivo .htaccess. Se for Windows, copie de um diretório que já exista e pague seu conteúdo, ou baixe um exemplo da internet. O Windows não deixa criar arquivo assim que ele considera sem nome (somente com extensão).

O Conteúdo dele seria assim:

# htaccess do Daniel - testando e evoluindo - v0.1

IndexIgnore *

Options +FollowSymlinks

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule !^index.php(.*)$ index.php$1 [L]
</IfModule>

<Files .htaccess>
order deny,allow
deny from all
</Files>


A primeira linha com IndexIgnore não deixa listar o conteúdo do diretório.
A linha do Options +FollowSymlinks é para o funcionamento do módulo de rescritra.
Se o módulo de escrita estiver ativado, usa ele para substituir qualquer chamada de arquivo diferente de index.php e chama o index.php com a querystring usada inicialmente, ou seja, se eu chamar daniel.php?a=ddd, chama o caminho index.php?a=ddd.
Depois ele proíbe o acess odireto ao .htaccess. Só isso.

É simples e atende minhas necessidades. Claro que pode ser que eu melhore (com sua ajuda inclusive), mas já é um começo para evitar surpresas desagradáveis.

Esse arquivo faz efeito para os subdiretórios também. Se você quiser alterar as regras deles, basta criar um .htaccess com elas. Em caso de não criar, deve-se criar um arquivo index.php que não faz nada, pois sempre haverá redirecionamento para o index.php de cada diretório. Ou então na regra do .htaccess, basta colocar para redirecionar não apra o index.php, mas para /index.php ou /site/index.php para sempre ir para o mesmo arquivo.

Abraço!!