Foros del Web » Programando para Internet » PHP »

Evitar acceso a páginas incluidas()

Estas en el tema de Evitar acceso a páginas incluidas() en el foro de PHP en Foros del Web. Hola a todos. Tengo un sitio web realizado tipo plantilla, donde el diseño se ecuentra en index.php y las distintas secciones son llamadas mediante index.php?go=seccion. ...
  #1 (permalink)  
Antiguo 23/09/2004, 21:10
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 13 años, 2 meses
Puntos: 5
Evitar acceso a páginas incluidas()

Hola a todos.

Tengo un sitio web realizado tipo plantilla, donde el diseño se ecuentra en index.php y las distintas secciones son llamadas mediante index.php?go=seccion.

Aca les pongo el code:

Código PHP:
cabecera en HTML... bla bla bla
<?php
$inclussion 
= isset($_GET['go'])?basename("$_GET[go].php"):'';
if(empty(
$inclussion)){
  include(
'main.php');
}else{
  if(
file_exists($inclussion)){
    include(
"$inclussion");
  } else {
    echo 
"Sección inválida";
  }
}
?>
pie en HTML... bla bla bla
Mi problema... es que no se cómo hacer para que no se pueda acceder directamente a los archivos correspondientes a las secciones.

Si entramos a index.php?go=muestras entonces se incluye() el archivo muestras.php. Pero si entramos a muestras.php directamente...se verá el contenido de dicho archivo y no quiero que eso pase.

He estado pensando como validar eso, pero no se me ocurre nada. Ni con sesiones, ni cookies funciona. Con variables sencillas no funcionaría, ya que cualquier usuario podría colocar la variable via URL en caso de que el servidor tenga register_globals=on.

Tantas horas de trabajo me han frustrado. ¿se les ocurre algún buen método para resolver este agujero de seguridad?

Mil gracias y un saludo!
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #2 (permalink)  
Antiguo 23/09/2004, 21:18
 
Fecha de Ingreso: junio-2004
Ubicación: Buenos Aires
Mensajes: 60
Antigüedad: 13 años, 6 meses
Puntos: 1
Que tal restringir la navegacion del directorio en donde guardas los includes?
Otra podria ser poner una variable "bandera" en la pagina que hace el include, y luego dentro de main.php verificar su valor.
Por ejemplo

index.php
---------
$x=true;
include('main.php');

main.php
---------
if ($x==true)
seguimos;
else
paramos;
  #3 (permalink)  
Antiguo 23/09/2004, 21:34
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 13 años, 2 meses
Puntos: 5
No, no funcionaría...porque facilmente mediante la URL podría poner algo asi:

main.php?x=true

Lo cual me daría acceso total a main.php

¿Ves? ese es mi dilema!... y más aun cuando el server tiene register_globals=on.

COn respecto a..."Que tal restringir la navegacion del directorio en donde guardas los includes?"....¿Cómo se hace eso?... me acabas de dar una muy buena posibilidad...

Podría hacer... que UNICAMENTE se acceda al index.php, y ninguno de los demás archivos puedan ser accesados directamente.

Supongo que debe ser algo con el htaccess del Apache.

PD: USO APACHE.
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #4 (permalink)  
Antiguo 23/09/2004, 21:59
 
Fecha de Ingreso: mayo-2002
Mensajes: 486
Antigüedad: 15 años, 7 meses
Puntos: 0
una solucion facil y efectiva es poner seguridad a los directorios donde almacenas esos ficheros(carpeta includes), cosa que no podran llamar directamente a ellos.
__________________
Sistemass.com - Centro de capacitación profesional
http://www.sistemass.com
  #5 (permalink)  
Antiguo 23/09/2004, 22:05
Avatar de sktrpunk  
Fecha de Ingreso: septiembre-2003
Ubicación: Montevideo
Mensajes: 227
Antigüedad: 14 años, 3 meses
Puntos: 0
Lo mejor es setear una variable en la pagina principal, luego en cada inclusion agregas la siguiente condicional:
Código PHP:
<?php
if (isset($miVariable)) {
muestro la pag;
} else {
header("Location: index.php");
exit();
}
?>
Ya que si acceden directo a la pagina includa la variable no va a estar seteada, por lo que los rebota y los manda a la principal.
Espero te sirva, es lo q se me ocurre ahora en el momento.
Suerte

AlvAro
__________________
- Sk8 FoR LiFe -
Stay away from my Black Book

Última edición por sktrpunk; 23/09/2004 a las 22:06
  #6 (permalink)  
Antiguo 23/09/2004, 22:08
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 13 años, 2 meses
Puntos: 5
Me parece buena idea... y se complementa con lo que dice boxin. Pero tendría que meter todos mis archivos dentro de otra carpeta y dejar el index.php solito en root.

Ok, por eso no habría problema. ¿Pero te refieres a ponerle contraseña al directorio?... las contraseñas son vulnerables.

¿No habrá una directiva del Apache para restringir un directorio?...

¿Servirá Deny?... podríamos poner un .htaccess dentro de la carpeta includes con el siguiente contenido:

deny from all
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #7 (permalink)  
Antiguo 23/09/2004, 22:09
 
Fecha de Ingreso: mayo-2002
Mensajes: 486
Antigüedad: 15 años, 7 meses
Puntos: 0
para darle seguridad a los directorios tienes dos opciones:
1. si eres administrador del hosting puedes hacerlo via el Cpanel en caso lo tuvieses o alguna otra herramienta alternativa
2. via script que te asegura tus careptas con login y passs:
http://www.hospedanet.net/access.rar

como funciona:
primero colocas el access.php en la carpeta que deseas proteger .
luego la abres de tal modo www.tudominio.com/carpeta/access.php
y le das sobre Neuen Admin-Bereich erstellen , que significa que quieres crear un nuevo administrador con acceso .
la carpeta que deseas proteger tienes que darle el permiso 777 y luego pulsas sobre Bereich mit nur einem User anlegen ahora tienes que poner en las 4 casillas
Vergib einen Namen für den Bereich (max. 30 Zeichen):
aqui pones el nombre de la carpeta por ejemplo /galopin

Gib den Usernamen ein: nombre del usuario para acceder a la carpeta

Gib das Passwort zweimal ein: aqui pones 2 veces la contraseña y cuando lo tengas le das a speichern que es guardar . y luego intentas entrar a la carpeta

saludos
__________________
Sistemass.com - Centro de capacitación profesional
http://www.sistemass.com
  #8 (permalink)  
Antiguo 23/09/2004, 22:09
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 13 años, 2 meses
Puntos: 5
sktrpunk el valor de esa variable se puede dar por URL... y se vulnerabiliza el sistema completamente. Ese método no es seguro del todo.
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #9 (permalink)  
Antiguo 23/09/2004, 22:13
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 13 años, 2 meses
Puntos: 5
Lo encontré... podríamos poner dentro de la carpeta includes un .htaccess con este code:

<Files *.php>
order deny
deny from all
</Files>

Y listo !!!... nadie accede a ese directorio!...

Más info en: http://www.iss.soton.ac.uk/info/www/access/filedir.html

Si se les ocurre otra idea... será bienvenida.

PD: ¿Quedé con la curiosidad... sin meter los archivos en una carpeta aparte se podrán bloquear y permitir el acceso solo al index.php?

En la página que les di dice como bloquear cada archivo individualmente... pero eso es un fastidio.
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #10 (permalink)  
Antiguo 23/09/2004, 22:32
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
De todos modos la solución que te plantea sktrpunk deberías utilizarla también.
Aunque yo lo hago con constantes.... pero es lo mismo.
En el index.php
Código PHP:
<?php
//Acá defines la constante
define("_INDEXOK_"true);
?>cabecera en HTML... bla bla bla 
<?php 
$inclussion 
= isset($_GET['go'])?basename("$_GET[go].php"):''
if(empty(
$inclussion)){ 
  include(
'main.php'); 
}else{ 
  if(
file_exists($inclussion)){ 
    include(
"$inclussion"); 
  } else { 
    echo 
"Sección inválida"
  } 

?> 
pie en HTML... bla bla bla
.
Y en cada archivo .php que vas a incluir pones al comienzo:
Código PHP:
<?php 
if(!defined('_INDEXOK_')) {
//Si no se ha definido la constante _INDEXOK_
//quiere decir que no se ha llamado a este archivo desde el index.php
die("no se puede acceder a este file directamente...");
}
?>
Saludos
  #11 (permalink)  
Antiguo 23/09/2004, 22:33
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 13 años, 2 meses
Puntos: 5
¿Y las constantes se pueden definir por URL?... o solo mediante el archivo?... si es solo mediante el script sería una excelente solución.
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #12 (permalink)  
Antiguo 23/09/2004, 22:36
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 13 años, 2 meses
Puntos: 5
Jajajajaj miren esto:

http://ve.php.net/manual/es/function.defined.php

This can be useful if you want to protect pages which get included from outsiders eyes, on your mail page (the page viewable by people) put define("X", null); then on all your other pages, you can then do something like:

if (!defined("X")) {
echo "You Cannot Access This Script Directly, Have a Nice Day.";
exit();
}

And your page is a good as protected :)

__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #13 (permalink)  
Antiguo 23/09/2004, 22:40
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 13 años, 2 meses
Puntos: 5
el método con el .htaccess no funciona. Si hacemos eso... cuando index.php incluya() al archivo dará un error INTERNAL SERVER ERROR. Por lo tanto... ha quedado descartada la opción del .htaccess.

__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #14 (permalink)  
Antiguo 23/09/2004, 22:42
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Otra cosa... sería bueno además que no pases el nombre de archivo por la URL...
Lee este post:
http://www.forosdelweb.com/showthrea...075#post776801
También los siguientes donde Cluster recomienda unos artícuos bastante buenos sobre seguridad.
Saludos
  #15 (permalink)  
Antiguo 23/09/2004, 22:44
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Cita:
Iniciado por Takitei
¿Y las constantes se pueden definir por URL?... o solo mediante el archivo?... si es solo mediante el script sería una excelente solución.
Justamente por eso se utilizan constantes.

Saludos
  #16 (permalink)  
Antiguo 23/09/2004, 22:56
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 13 años, 2 meses
Puntos: 5
Perfecto... entonces haré lo que dicen con respecto a los archivos. Usando los identificadores para evitar que accedan a algún otro archivo importante via URL.

Un saludo y gracias.!
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:33.