1: comprobación del recuento de archivos incluidos
if( count(get_included_files()) == ((version_compare(PHP_VERSION, '5.0.0', '>='))?1:0) )
{
exit('Restricted Access');
}
Lógica: PHP se cierra si no se cumple el recuento mínimo de inclusión. Tenga en cuenta que antes de PHP5, la página base no se considera una inclusión.
2: Definir y verificar una 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: si la constante no está definida, la ejecución no comenzó desde la página base y PHP dejaría de ejecutarse.
Tenga en cuenta que, en aras de la portabilidad a través de actualizaciones y cambios futuros, hacer que este método de autenticación sea modular reduciría significativamente la sobrecarga de codificación, ya que los cambios no necesitarán ser codificados en cada archivo.
// 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');
De esta forma, se puede agregar código adicional para checkdefined.php
fines de registro y análisis, así como para generar respuestas apropiadas.
Crédito donde se debe: la brillante idea de portabilidad surgió de esta respuesta .
3: autorización de dirección remota
// 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');
El inconveniente de este método es la ejecución aislada, a menos que se proporcione un token de sesión con la solicitud interna. Verifique a través de la dirección de bucle de retorno en caso de una configuración de servidor único o una lista blanca de direcciones para una infraestructura de servidor con varios servidores o con equilibrio de carga.
4: autorización de token
Similar al método anterior, uno puede usar GET o POST para pasar un token de autorización al archivo de inclusión:
if($key!="serv97602"){header("Location: ".$dart);exit();}
Un método muy desordenado, pero también quizás el más seguro y versátil al mismo tiempo, cuando se usa de la manera correcta.
5: configuración específica del servidor web
La mayoría de los servidores le permiten asignar permisos para archivos o directorios individuales. Puede colocar todas sus inclusiones en dichos directorios restringidos y configurar el servidor para que las denegue.
Por ejemplo, en APACHE, la configuración se almacena en el .htaccess
archivo. Tutorial aquí .
Sin embargo, tenga en cuenta que las configuraciones específicas del servidor no son recomendadas por mí porque son malas para la portabilidad en diferentes servidores web. En casos como Content Management Systems donde el algoritmo denegado es complejo o la lista de directorios denegados es bastante grande, solo puede hacer que las sesiones de reconfiguración sean bastante horripilantes. Al final, es mejor manejar esto en código.
6: La colocación incluye en un directorio seguro FUERA de la raíz del sitio
Menos preferido debido a las limitaciones de acceso en entornos de servidor, pero es un método bastante poderoso si tiene acceso al sistema de archivos.
//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:
- El usuario no puede solicitar ningún archivo fuera de la
htdocs
carpeta ya que los enlaces estarían fuera del alcance del sistema de direcciones del sitio web.
- El servidor php accede al sistema de archivos de forma nativa y, por lo tanto, puede acceder a los archivos en una computadora al igual que un programa normal con los privilegios necesarios.
- Al colocar los archivos de inclusión en este directorio, puede asegurarse de que el servidor php pueda acceder a ellos, mientras que el enlace directo es denegado al usuario.
- Incluso si la configuración de acceso al sistema de archivos del servidor web no se realizó correctamente, este método evitaría que esos archivos se hagan públicos accidentalmente.
Disculpe mis convenciones de codificación poco ortodoxas. Cualquier comentario es apreciado.