Uso apropriado da função include e variações
De TeHospedia
A função include(), include_once(), require() e require_once() do PHP devem ser usadas com muito cuidado.
Um simples script pode permitir acesso a qualquer arquivo dentro do seu site ou mesmo do servidor. Se a TeHospedo encontrar algum caso assim, daremos um prazo para corrigir, não toleramos vulnerabilidades em scripts.
Tabela de conteúdo |
Exemplo de script inseguro
teste.php:
<?php include $_REQUEST['pagina'] . '.php'; ?>
Você coloca um link em seu site: http://seusite.com.br/teste.php?pagina=arquivo - porém qualquer arquivo pode ser lido em seu site! Cuidado com soluções simples como esta.
Solução 1 e ideal: permitindo somente arquivos pré-aprovados
Existem várias formas de permitir expressamente que um arquivo possa ser incluído dinamicamente. Pode-se até usar banco de dados, mas a solução mais simples é usando o switch:
teste.php:
<?php
switch ($_REQUEST['pagina']) {
// cada case e' um arquivo autorizado
case "arquivo":
case "index":
case "contato":
$incluir = $_REQUEST['pagina'] . ".php";
break;
default:
die("Arquivo nao autorizado");
}
include $incluir;
?>
Assim, somente os arquivos: "arquivo.php", "index.php" e "contato.php" poderão ser incluidos.
Solução 2: usando expressões regulares
Neste caso, somente autorizamos arquivos que contenham letras e números e colocamos todos os arquivos num determinado subdiretório, assim, somente arquivos desta pasta poderão ser incluidos.
<?php
function validarInclusao($pagina)
{
// expressao regular que somente autoriza a-z, 0-9, A-Z, - e _
if (preg_match("/^[a-z0-9_-]+$/i", $pagina)) {
return true;
}
return false;
}
// pasta com os arquivos permitidos
$pasta = 'paginas/';
// se nao esta validado, acaba o script
if (validarInclusao($_REQUEST['pagina']) == false) {
die("Arquivo nao autorizado");
}
$incluir = $pasta . $_REQUEST['pagina'] . '.php';
// se arquivo nao existir, acaba o script
if (!file_exists($incluir)) {
die("Arquivo nao autorizado");
}
// por fim, inclui o arquivo
include($incluir);
?>



