2008-10-06 21 views
9

Quiero asegurarme de que las personas no puedan escribir el nombre de un script PHP en la URL y ejecutarlo. ¿Cuál es la mejor manera de hacer esto?¿Cuál es la mejor manera de solo permitir que se incluya un archivo PHP?

Podría establecer una variable en el archivo que incluirá este archivo, y luego verificar esa variable en el archivo que se está incluyendo, pero ¿hay alguna manera más fácil?

+0

¿Podrías por favor ser más claro? Realmente no entiendo cómo quieres que un archivo no se ejecute si apuntas tu navegador hacia él ... –

+0

Tal vez si las funciones de preformas, tal vez por el bien de la seguridad, el por qué es irrelevante. – UnkwnTech

+0

@Unkwntech: mi confusión proviene del hecho de que si un archivo está debajo de la raíz web debe ser para verlo, cualquier cosa segura debe estar fuera de él ... –

Respuesta

6

se puede comprobar la URI y ver si ese archivo está siendo llamado con `

$_SERVER['SCRIPT_FILENAME'] 

o podría mover el archivo fuera de la carpeta pública, esta es una solución mejor.

+1

Esta es la respuesta que estoy buscando, gracias ... acepto que mover el archivo fuera de la carpeta pública suele ser mejor, pero en mi caso sería mejor usar esa variable $ _SERVER. –

0

Zend Framework recomienda que mantenga los archivos fuera de la raíz de la web, como lo ha sugerido Unkwntech. Yo diría que esta es la solución más segura y más infalible.

0

Desde un módulo PHP Nuke:

<?php 
if (!eregi("modules.php", $PHP_SELF)) { 
    die ("You can't access this file directly..."); 
} 
// more code ... 
?> 

Reemplazar modules.php con su nombre de archivo, y que el archivo no se puede llamar directamente.

+0

Esto está muy desactualizado. No uses esto – DanMan

+0

Seguramente está desactualizado, ya que fue hace 6 años. ¿Todavía está PHPNuke? – ThoriumBR

0

Una forma que he visto mucho es crear una variable que tiene que estar presente en todos los archivos incluidos y comprobar a primera hora de cada incluyen:

if(!isset($in_prog)){ 
exit; 
} 
4

he guardado mucho todo excepto guiones directamente visible fuera de la raíz web. Luego configure PHP para incluir su directorio de scripts en la ruta. Una instalación típica sería:

appdir 
    include 
    html

En la configuración de PHP (ya sea la configuración de PHP global o en un archivo .htaccess en el directorio html) añadir lo siguiente:

include_path = ".:/path/to/appdir/include:/usr/share/php"

o (para Windows)

include_path = ".;c:\path\to\appdir\include;c:\php\includes"

Tenga en cuenta que esta línea probablemente ya esté en su archivo php.ini, pero puede estar comentada permitiendo que funcionen los valores predeterminados. También podría incluir otras rutas. Asegúrate de mantener esos, también.

Si va a añadir a un archivo .htaccess, el formato es:

php_value include_path .:/path/to/appdir/include:/usr/share/php

Por último, se puede agregar la ruta programáticamente con algo como esto:

$parentPath = dirname(dirname(__FILE__)); 
$ourPath = $parentPath . DIRECTORY_SEPARATOR . 'include'; 

$includePath = ini_get('include_path'); 
$includePaths = explode(PATH_SEPARATOR, $includePath); 
// Put our path between 'current directory' and rest of search path 
if ($includePaths[0] == '.') { 
    array_shift($includePaths); 
} 

array_unshift($includePaths, '.', $ourPath); 
$includePath = implode(PATH_SEPARATOR, $includePaths); 
ini_set('include_path', $includePath); 

(Sobre la base de código de trabajo, pero modificado, por lo tanto no probado)

Esto debe ejecutarse en su archivo de interfaz (por ejemplo, index.php). Lo puse en un archivo de inclusión separado que, después de modificar lo anterior, se puede incluir con algo como #include '../includes/prepPath.inc'.

He utilizado todas las versiones que he presentado aquí con éxito. El método particular utilizado depende de las preferencias y de cómo se implementará el proyecto.En otras palabras, si no puede modificar php.ini, obviamente no puede usar ese método

9

En algunas de las aplicaciones de código abierto que he buscado, incluidas Joomla y PHPBB, declaran una constante en el principal incluye archivo, a continuación, compruebe que existe la constante en cada uno de los includes:

// index.php 
require_once 'includes.php'; 

// includes.php 
define('IN_MY_PROJECT', true); 
include 'myInc.php'; 

// myInc.php 
defined('IN_MY_PROJECT') || die("No direct access, plsktnxbai"); 
0

Creo que la mejor manera es poner los archivos que desea incluir en el interior "/include" carpeta y poner derecho de acceso 700 a la carpeta

Cuestiones relacionadas