Idioma
Categoria
Pesquisar

Impedir acesso direto aos scripts PHP

Bloqueie o acesso direto aos scripts utilizando variáveis pré definidas do PHP.

Em PHP Por Rudi Drusian Lange
Publicado em
Última atualização

Ao montar um site ou uma aplicação web, é muito comum utilizar scripts PHP separados da página principal, isso evita que o arquivo fique muito grande, ajuda a organizar os códigos, e facilita a programação com reutilização das funções. O ideal é que somente a página principal possa chamar esses scripts, e que eles não possam ser acessados diretamente. Um exemplo simples, a página principal do site, a home, é a index.php, que fica no diretório /www. Em uma página separada temos o formulário de contato, contato.php, que esta armazenada dentro do diretório scripts /www/scripts.

Pela programação do site a página contato.php é chamada para execução dentro da página index.php, através de um include ou require por exemplo. Porém se o visitante tentar acessar a página de contato diretamente em /www/scripts/contato.php, o script será executado, porém fora do contexto do site, o que deixará ele mal formatado e provavelmente não funcional.

Para impedir o acesso direto aos scripts ou páginas PHP, é possível utilizar duas variáveis predefinidas do PHP para fazer uma comparação e saber se o script que esta sendo executado foi chamado diretamente ou a partir de um outro script.

As variáveis são:

  • $_SERVER['SCRIPT_NAME'] variável que contem o nome do script em execução.
  • __FILE__ nome do arquivo onde a variável for chamada.

Estas duas variáveis retornam o caminho completo do script, através da função basename() remove-se todo o caminho, deixando somente o nome do script. Com estas informações compara-se as variáveis, e se elas forem iguais, significa que o script esta sendo executado diretamente. Se elas forem diferentes, o script foi chamado a partir de um outro script, no caso a página index.php. Com o script abaixo, faz-se esta comparação, e caso o script esteja sendo acessado diretamente, é feito um redirecionamento para a página principal. Para prevenir que qualquer outro código seja executado utiliza-se a função die().

contato.php

if (basename($_SERVER['SCRIPT_NAME']) == basename(__FILE__)) {
	header("location: ../index.php");
	die();
}

Esta condição deve ser inclusa no inicio de todo script que não deva ser acessado diretamente, lembrando também que este código não pode ser adicionado através de um include ou require, pois a variável __FILE__ retornará o nome do arquivo em que ela foi definida, o que fará com que o script perca sua função.

Acessando o script de contato através da página index.php, as variáveis retornarão os valores:

  • $_SERVER['SCRIPT_NAME'] = /www/index.php
  • __FILE__ = /www/scripts/contato.php

Utilizando a função basename(), obtem-se index.php e contato.php. Acessando o script diretamente pela página contato.php, ambas as variáveis retornarão /www/scripts/contato.php e com a função basename() somente contato.php.