Bloqueando acesso direto em scripts PHP

Bloquear scripts contra acesso direto, é algo bastante necessário pra quem desenvolve para web, principalmente se o arquivo a ser bloqueado seja um arquivo de configurações, com funções úteis, etc.

O ideal nestas situações, é que se mantenha o arquivo acima da pasta raiz do seu servidor, porém quando isto não é possível, temos uma outra alternativa: vamos comparar o nome do arquivo a ser protegido, com o nome do arquivo que esta em execução.

Para isto, basta adicionar este trecho de código ao arquivo que se deseja proteger:

<?php

if (strcmp(basename($_SERVER[‘SCRIPT_NAME’]), basename(__FILE__)) === 0){

header(“location: teste.php”);

}

?>

Vamos as explicações:

Utilizamos a função strcmp() para comparar duas strings, que são elas:

$_SERVER[‘SCRIPT_NAME’] -> Variável que contem o nome do script em execução.

__FILE__ -> Constante que contém o nome do arquivo onde a constante foi chamada.

Neste caso, dentro de __FILE__, temos o nome do arquivo a ser incluido, ou seja, o arquivo que não queremos disponibilizar o acesso direto. Dentro da variável $_SERVER[‘SCRIPT_NAME’], temos o nome do script que está em execução. Para complementar, utilizamos a função basename(), que retira todo o caminho, retornando apenas o nome do arquivo em si.

Com a função strcmp(), comparamos as duas strings. Se as duas forem iguais (retorno da função strcmp() for igual a 0), é porque o arquivo que está sendo executado, tem o mesmo nome do arquivo que desejamos proteger, ou seja, que pode ser apenas incluído por outros scripts, portanto, vamos redirecionar o usuário para algum local, caso contrário, se os valores forem diferentes, continuamos executando o script normalmente.

Assim, o arquivo pode ser chamado normalmente por um include ou require, porém quando for acessado diretamente por um usuário, o usuário será redirecionado para a página informada na função header().

Até a próxima 😉

6 pensou em “Bloqueando acesso direto em scripts PHP

  1. Fábio

    Outra alternativa: se o script tá sendo incluido por um script pai, e este último sempre define alguma variavel/constante/funcao, bastaria verificar se tal variavel/constante/funcao está definida, exemplos:

    if(!defined(‘SITE_URL’)){
    exit();
    }

    if(!isset($variavel)){
    exit();
    }

    if(!function_exists(‘geraCabecalho’)){
    exit();
    }

    Responder
  2. Rubem Alves

    Prezado, em SCRIPT_NAME eu coloco o nome do script que está em execução ou esta é uma função que chama o script o qual está sendo executado?
    Por que vc disse:”Dentro da variável $_SERVER[‘SCRIPT_NAME’], temos o nome do script que está em execução” e eu não entendi se eu tenho substituir a expressão ‘SCRIPT_NAME’ pelo nome do arquivo ou não.

    Responder
    1. Angelito Autor do post

      Olá Rubem. SCRIPT_NAME é o nome do índice que contém o caminho completo do script em execução dentro do array $_SERVER. 😉

      Responder

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.