Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Kimura

[Resolvido] Alguns métodos usados

Recommended Posts

Olá,

 

Quero desde já pedir desculpas caso eu esteja cometendo alguma infração em postar este tipo de situação, mas como trabalho há algum tempo com PHP, às vezes, me surgem algumas dúvidas quanto a alguns recursos utilizados por algumas pessoas.

 

Bom, vamos lá.

 

Vejo muito por aí sistemas/sites usando recursos de inclusão de arquivos via QueryString. Ex.:

 

uma situação...

<?php
$page = isset($_GET['page']) ? $_GET['page']: null;

if(file_exists($page.'.php'))
{
	include ($page.".php");
}
?>
A minha dúvida é: Até onde isso se torna benéfico ou maléfico?

 

continuando a situação...

Acompanhando a situaçao teríamos uma index com abertura de sessões, conexões, o html inicial(html, head, title...). Imaginando uma forma de não se repetir nas outras páginas(as que serão incluídas), ou até mesmo, deixar as outras página mais enxutas.

 

O que esta outra situação traz consigo?

 

Tenho várias outras dúvidas que vou postar ao longo do tempo que com muito respeito e profissionalismo peço que cada uma responda da forma mais correta possível.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Trás beneficios, facilidade na manutenção, você faz apenas 1 layout para index e tudo funciona em função disso.

 

acho que complicação não deve trazer, pois o processo como um todo é simples. então ficam os beneficios mesmo.

 

flw

Compartilhar este post


Link para o post
Compartilhar em outros sites

Depende do caso.Na maioria das vezes beneficios.

Mas seguinte,seu código é vulneravel e ineficiente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá,

 

Quero agradecer todos os comentários postados aqui. É muito bom saber que há gente que participa seriamente.

 

Uma coisa que quero deixar claro, o exemplo que estou dando é estritamente hipotético, ou seja, estou levantando um código simples, neste não estão envolvidas questões de segurança etc.

 

Quero saber quais são, basicamente, os contras e os prós.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prós:

 

-Simplificação da estrutura do seu site

-Quando for alterar o código, basta fazê-lo uma vez

 

Contras:

 

-Como foi mencionado, a segurança.

 

Do jeito que está, alguem poderia usar a query string assim:

 

?pagina=http:\\www.sitedomau.com/deleta_banco.php...

 

E aí???

 

Se for o caso, seria oportuno também usar AJAX ao invés da query string do jeito convencional

Compartilhar este post


Link para o post
Compartilhar em outros sites

<?php
$page = isset($_GET['page']) ? $_GET['page']: null;
if(file_exists($page.'.php')){
        include ($page.".php");
}
?>

nesse caso, a estrutura não está lá grande coisa, mas não está vulnerável devido ao parâmetro na função file_exists()

 

file_exists( $page.'.php' )

 

 

 

mesmo que um usuário tente burlar fazendo

 

?pagina=http:\\www.sitedomau.com/deleta_banco.php

 

não retornará sucesso.

nesse caso, como não há tratamento de erros e exceções, a página retornará mensagem de erro do PHP.

 

file_exists( 'http:\\www.sitedomau.com/deleta_banco.php.php' )

 

 

uma forma mais organizada seria conforme comentaram acima.

 

defina os arquivos num array e contrle-os com funções de controle de fluxo

 

IF ELSE, SWITCH CASE, etc...

 

 

se quiser continuar com esse mesmo script, faça modificações para maior consistência

 

 

 

<?php
$error = false;
$page = isset( $_GET['page'] ) ? $_GET['page'] : 'default_page';
if( @!file_exists( $page . '.php' ) ){
    $error = $php_errormsg; // precisa ativar track_errors no php.ini para usar essa variável (http://www.php.net/manual/en/reserved.variables.phperrormsg.php)
}
$error ? $page = 'default_page' : null;

include ( $page . '.php' );
?>

 

obs: é apenas um exemplo.

não quer dizer que seja algo obsoleto ou a melhor forma.

faça o que for conveniente para o seu caso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só uma coisa:

 

A supressão de erros com o @ torna a execução mais lenta...

 

Crie um array com as páginas permitidas e verifique se a página que chegou está contina nele com array_search, ou algo similar...

Compartilhar este post


Link para o post
Compartilhar em outros sites

essa abordagem pode tornar sua aplicação vulnerável...

 

se você quer (e deve querer huauhaua) reaproveitar código, html etc..

utilize um framework, é mais seguro e você se concentra no que deve se concentrar hehhee

Compartilhar este post


Link para o post
Compartilhar em outros sites

hinom...lembre-se que tal função aceita o urlwrapper ftp (caso algumas diretivas do php.ini estejam habilitadas,e geralmente estão) e nesse caso a função is_file é mais consistente.

E devo ser bem oldschool pra ser o unico a lembrar o vetor de null-byte injection...

Mete basename no que veio e faz uma checagem pra ver se existe e pode ser lido (exemplo...) e já era.

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara pessoalmente não curto esse tipo de "montagem" de sites não pelo seguinte:

 

1 - mais fácil de ser atacado

2 - por ser mais fácil de ser atacado você tem que se preocupar o dobro com segurança

3 - no site da w3c existem diversos artigos que deixam bem claro para evitar usar GET por questões de segurança.

 

Existem milhões de formas mais fáceis de estruturar um site e ficando mais seguro que esse tipo de utilização, como foi dito acima use um framework que é muito mais prático e seguro.

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu faço assim

 

$pagina = (isset($_GET['pagina']))? $_GET['pagina'] : '' ;
switch ($pagina) 
{
   case 'contato':
       include 'contato.php';
   break;
   case 'empresa':
       include 'empresa.php';
   break;    

   ...
   default:
       include 'home.php';
   break;
}

 

O que acontece. Se o GET['pagina'] for uma das opções dentro do switch, ele entra na devida opção. Se for diferente, cai no default.

 

Ao meu ver, está seguro. Até é bom, que se não estiver o pessoal já fala.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

concordo com o matias ... *tambem faço assim

 

não é legal joga variaveis diretamente em include, require, readfile .. por guestao de segurança. deste modo você "verifica" a variavel antes e direciona ao caso . como o matias explico.. caso algum espertinho da um ?var=www.site.com.br/pagina_do_mal ou algo assim... ele nao vai inclui mas sim cai no default.

 

valwww =]

Compartilhar este post


Link para o post
Compartilhar em outros sites


<?php

$pagina = 'default.php';

if(isset($_GET['pagina'])) {

/*nos prevenimos de null-byte injection (pode levar o LFI a ser malicioso) e RFI*/

$pag = str_replace(chr(0), '', basename($_GET['pagina'])).'.php';

if(is_file($pag) && is_readable($pag)) $pagina =& $pag;

}

require $pagina;

?>

Qual a dificuldade e problema?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá,

 

Volto a agradecer a colaboração de todos.

 

O tópico fora aberto justamente com essa intenção, para que Usuários, Moderadores, Administradores etc., viessem aqui dar a sua visão profissional deste método.

 

Notei que a grande maioria colocou o ponto da segurança, que pra mim é o mais importante. Ótimo.

 

A utilização de Frameworks é, sem sombra de dúvida, muito importante pra qualquer aplicação.

 

Quero pedir a todos que continuem dando suas sugestões e se tiverem algo similar postem aqui

 

Vamos fazer um tópico sobre esse tipo de assunto.

 

Tenho certeza que servirá pra muitos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A utilização de Frameworks é, sem sombra de dúvida, muito importante pra qualquer aplicação.

Discordo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

//...
$pag = str_replace(chr(0), '', basename($_GET['pagina'])).'.php';
if(is_file($pag) && is_readable($pag)) $pagina =& $pag;
//..

Concordo com o eibon em partes; Se estamos lidando com um sistema onde passamos as páginas via GET, apenas um file_exists pode não ser eficiente, é preciso levar em consideração outras coisas, por exemplo:

 

Se o sistema em questão estiver sendo desenvolvido para rodar "localmente" em relação ao servidor então não podemos deixar que coisas como http:// ou ftp:// passem por uma página válida, ou que caracteres que não possam ser utilizados na nomenclatura de um arquivo possam ser aceitos.

 

Uma outra coisa que eu acho interessante, é não mandar para a página padrão quando uma página inválida é pedida, isso porque, se você desenvolveu a aplicação, testou todos os seus links e tem certeza que todos estão funcionando; Se uma página inválida foi solicitada, você sabe que não foi sua aplicação que a solicitou, nesse caso, o uso de um cabeçalho HTTP para avisar que o pedido é inválido pode ser interessante:

 

$pagina = '';

if ( isset( $_GET[ 'pagina' ] ) ){
    /**
     * Aqui retiramos qualquer coisa que não for a-zA-z0-9_, isso evita que caracteres "estranhos" sejam aceitos
     */
    $pag = sprintf( 'views/%s.php' , preg_replace( '/[^\w]+/' , '' , basename( $_GET[ 'pagina' ] ) ) );

    /**
     * Agora que já tiramos coisas como http://, ftp://, NULL, etc... verificams se o arquivo existe na nossa pasta views:
     */
    if( file_exists( $pag ) ) $pagina = $pag;
    else {
        /**
         * Se o arquivo solicitado não existe, então enviamos um bad request para o usuário com o conteúdo do
         * nosso arquivo de erros:
         */
        header( 'HTTP/1.0 400 Bad Request' );
        readfile( 'error/badrequest.html' );
    }
/**
 * Se não foi solicitado nenhuma página então nesse caso, definimos a página padrão
 */
} else $pagina = 'views/home.php'

if ( !empty( $pagina ) ){
    header( 'HTTP/1.0 200 Ok' );
    require( $pagina );
}

Dessa forma, coisas como http://qqrcoisa/outracoisa, ftp://qqrcoisa/outracoisa, ../../../../../etc/passwd, /etc/shadow, ~root, %0pagina, não serão aceitos pelo sistema e a página de erros será mostrada.

 

Outro ponto, é a utilização de uma pasta para a camada de apresentação, isso evitará que uma requisição:

 

?pagina=index

 

Cause uma 'recursão' dentro do sistema e consequentemente uma saída inesperada. Enfim, acho que segurança tem a ver com três coisas:

 

1. Planejamento

2. Padronização

3. Execução

 

Se você tem sua aplicação planejada desde o início, todos os fluxos e pedidos são conhecidos; você sabe o que vai acontecer depois e sabe também o que não pode acontecer agora; E se você tem uma aplicação padronizada, você sabe como tomar uma atitude para uma ação inesperada. E nunca pense que um snippet que você encontrar em qualquer lugar vá tornar sua aplicação segura, porque não vai.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá pessoal,

 

Só tenho uma coisa pra falar pra vocês: Parabéns!

 

Vocês estão exemplificando de uma forma simplesmente magnífica.

 

Os exemplos, as teorias e conceitos estão perfeitos.

 

Acho que vocês entenderam o sentido de eu ter criado esse tópico.

 

Aproveito para levantar mais situações H-I-P-O-T-É-T-I-C-A-S:

 

1ª) Imaginem que na minha index.php, que é onde está este código de QueryString, eu também inicio sessões, que, talvez, serão usadas em algumas páginas. Eu não estaria cometendo um gravíssimo erro em fazer isso?

 

2ª) Seguindo a primeira questão: E se eu abrisse conexões com bases de dados, mas nem todas as páginas a usassem?

 

 

Mudando de assunto: Questões SEO.

Uma das regras de SEO que vemos muito por aí é: As palavras-chave(meta keywords) devem acompanhar o conteúdo da página processada (no caso a incluída) de forma a simplificar o trabalho dos motores de busca.

 

Como eu conseguiria fazer isso de forma prática e lógica? Sabendo que as metas estão presas na index(que é a estrutura padrão) e, logicamente, acima das páginas que serão incluídas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como eu conseguiria fazer isso de forma prática e lógica? Sabendo que as metas estão presas na index(que é a estrutura padrão) e, logicamente, acima das páginas que serão incluídas.

sabe utilizar URL_REWRITE ?

 

o seu código não precisará ser modificado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.