1: Verificando a contagem de arquivos incluídos
if( count(get_included_files()) == ((version_compare(PHP_VERSION, '5.0.0', '>='))?1:0) )
{
exit('Restricted Access');
}
Lógica: o PHP sai se a contagem mínima de inclusão não for atendida. Note que antes do PHP5, a página base não é considerada uma inclusão.
2: Definindo e Verificando uma Constante Global
// In the base page (directly accessed):
define('_DEFVAR', 1);
// In the include files (where direct access isn't permitted):
defined('_DEFVAR') or exit('Restricted Access');
Lógica: Se a constante não estiver definida, a execução não será iniciada a partir da página base e o PHP parará de executar.
Observe que, para garantir a portabilidade entre atualizações e alterações futuras, tornar esse método de autenticação modular reduziria significativamente a sobrecarga de codificação, pois as alterações não precisarão ser codificadas permanentemente em todos os arquivos.
// Put the code in a separate file instead, say 'checkdefined.php':
defined('_DEFVAR') or exit('Restricted Access');
// Replace the same code in the include files with:
require_once('checkdefined.php');
Dessa forma, código adicional pode ser adicionado a checkdefined.php
fins de registro e análise, bem como para gerar respostas apropriadas.
Crédito onde o crédito é devido: a brilhante idéia de portabilidade veio dessa resposta .
3: Autorização de endereço remoto
// Call the include from the base page(directly accessed):
$includeData = file_get_contents("http://127.0.0.1/component.php?auth=token");
// In the include files (where direct access isn't permitted):
$src = $_SERVER['REMOTE_ADDR']; // Get the source address
$auth = authoriseIP($src); // Authorisation algorithm
if( !$auth ) exit('Restricted Access');
A desvantagem desse método é a execução isolada, a menos que um token de sessão seja fornecido com a solicitação interna. Verifique através do endereço de loopback no caso de uma configuração de servidor único ou de uma lista branca de endereços para uma infraestrutura de servidor com vários servidores ou com carga balanceada.
4: autorização de token
Semelhante ao método anterior, pode-se usar GET ou POST para passar um token de autorização para o arquivo de inclusão:
if($key!="serv97602"){header("Location: ".$dart);exit();}
Um método muito confuso, mas também talvez o mais seguro e versátil ao mesmo tempo, quando usado da maneira correta.
5: Configuração específica do servidor da Web
A maioria dos servidores permite atribuir permissões para arquivos ou diretórios individuais. Você pode colocar todas as suas inclusões nesses diretórios restritos e ter o servidor configurado para negá-las.
Por exemplo, no APACHE, a configuração é armazenada no .htaccess
arquivo Tutorial aqui .
Observe, no entanto, que configurações específicas do servidor não são recomendadas por mim porque são ruins para a portabilidade entre diferentes servidores da Web. Em casos como o Content Management Systems, em que o algoritmo de negação é complexo ou a lista de diretórios negados é bastante grande, isso pode tornar as sessões de reconfiguração bastante horríveis. No final, é melhor lidar com isso no código.
6: A colocação inclui em um diretório seguro FORA da raiz do site
Menos preferido devido às limitações de acesso em ambientes de servidor, mas um método bastante poderoso se você tiver acesso ao sistema de arquivos.
//Your secure dir path based on server file-system
$secure_dir=dirname($_SERVER['DOCUMENT_ROOT']).DIRECTORY_SEPARATOR."secure".DIRECTORY_SEPARATOR;
include($secure_dir."securepage.php");
Lógica:
- O usuário não pode solicitar nenhum arquivo fora da
htdocs
pasta, pois os links estariam fora do escopo do sistema de endereços do site.
- O servidor php acessa o sistema de arquivos de forma nativa e, portanto, pode acessar arquivos em um computador, exatamente como um programa normal com privilégios necessários.
- Ao colocar os arquivos de inclusão nesse diretório, você pode garantir que o servidor php possa acessá-los, enquanto a ligação direta é negada ao usuário.
- Mesmo que a configuração de acesso ao sistema de arquivos do servidor da web não tenha sido feita corretamente, esse método impediria que esses arquivos se tornassem públicos acidentalmente.
Por favor, desculpe minhas convenções de codificação não ortodoxas. Qualquer feedback é apreciado.