Denegar Acceso

LR

Buenas, tengo la siguiente duda.

Quiero bloquear el acceso a todos los archivos y carpetas del servidor.

La idea es, que solamente se pueda acceder al index y que si el index te redirecciona a alguna de las paginas, entonces si tengas acceso.

He estado mirando diferentes opciones para el .htaccess y las unicas que veo "utiles" para eso son estas:

<Limit GET POST PUT>
deny from all
allow from localhost
</Limit>

<files index.php>
allow from all
</files>

El problema es, que solamente puedo acceder al index.php y solamente si especifico ese archivo,
estoy trabajando en local, y solo me sirve si pongo: localhost/carpeta/index.php

Otra opcion que igual funciona creo que seria poner esto:

Options All -Indexes

y jugar con constantes o variables, pero supongo que tendra que habar alguna opcion mejor y menos "chapucera"

NeB1

#1 no te vale quitando todos los permisos de esos archivos? de forma que solo se pueda acceder a esos archivos desde la propia máquina?

es decir, ponerle a todos los archivos por ejemplo los permisos 444 entonces solo el propietario del archivo, y PHP podrán acceder a esos archivos. Después PHP que 'lea' esos archivos para mostrartelos, dependiendo de su naturaleza, mediante include, o fopen o como sea.

(no sé si estoy diciendo alguna barbaridad...)

LR

no habia pensado en lo de los permisos....

La idea es, que si yo tengo carpetas con fotos, o .php que uso pasandole parametros por url, no puedas acceder a menos que hayas llegado alli a traves de otro php.

Supongo que simplemente con mirar si esa carpeta tiene un index y jugando con variables o constantes se podra hacer, pero no se si seria muy...chapucera esa solucion xD

Por eso lo de algo tipo .htaccess

l31m

Lo mas rapido y seguro es hacer lo siguiente,

En el index.php principal defines:

define( 'PERMITIR_ACCESO' , 1);

y luego en cada una del resto de páginas php compruebas al principio:

defined( 'PERMITIR_ACCESO' ) or die( 'Acceso denegado' );

Claro que esto solo funciona si haces include de esas paginas php en el index...

LR

esa opcion es una de las que digo, pero no hay alguna mas "limpia"?? tipo restricciones por .htaccess o algo asi?

l31m

más limpia? yo no le daría muchas vueltas. Este método es el que usa Joomla y si lo usan los programadores de este CMS tan famoso será por algo digo yo... xD

BLZKZ

no solo en joomla, sino en cantidad de cms, ademas de que la mayoria tiene un sistema de permisos del estilo y funciones "checkrights" definidas

NeB1

Si, pero lo entiendo a él también, es un poco perro a cada archivo añadirle una cabecera, y si el día de mañana cambias ese define por cualquier otra cosa, tener que cambiarlo en todos los lados.

#9 eso es cierto, si al principio pones algo rollo:

is_include();

en todos los ficheros, y en esa función ya haces lo que quieres, como coger el define ese de PERMITIR_ACCESO == '1'

BLZKZ

#8 también lo puedes hacer con una función sin parametros y de ahi que compruebe todo lo que debe y devuelva un bool, simplemente son 3 lineas extra :S, mal que mal...

Además leches, no todo tiene por qué ser cómodo xD. Aún asi, con javascript puedes controlad de donde vienes

GamA

#9 Javascript y control de accesos = acceso autorizado a todo :D

No, en serio, ¿Como pretendes controlar con javascript temas de acceso? Eso no se tiene que gestionar del lado del cliente. Te desactivan JS y fin del control. Se debe gestionar del lado del servidor, en este caso PHP.

Ahí #1 te deniega el acceso porque accede a www.tudominio.com/ y esta carpeta tiene prohibido mostrarse por lo que no deja. Deberías gestionar los permisos de / y decir que puedan acceder todos.

#4 Con eso solo controlarías que ha pasado al menos una vez por index.php, pero no que viene de allí, con lo que tampoco es un buen control.

#2 Con eso no evitas que el usuario lea tus ficheros, los cuales es posible que no quieras que se vean. Con un simple crawling a tu dominio te podría ver los ficheros y descargarlos sin dificultad, sin venir de index :P. Sin embargo con un 400 restringirías a que se leyese en cualquier momento, lo cual tampoco se busca :(.

La manera más "gocha" pero rápida sería usar la variable $_SERVER['HTTP_REFERER'] la cual te dice de donde viene el usuario, si viene de tu index déjale pasar, sino mata la conexión (die).

Yo lo que haría para algo serio, sería una index, en la cual se recibiera un parámetro GET y según ese parámetro mostrar una parte u otra de la web.

Por ejemplo:

index.php?p=1 > Index
index.php?p=2 > Fotos
index.php?p=3 > Videos
index.php?p=4 > Noticias

En cualquier otro caso (es decir, p=x) matas la conexión (die). Y el resto de ficheros protegidos por el deny all. Eso si, haz que la carpeta / redirija a index.php, de lo contrario no podrán navegar.

Desde la index lo único que tendrás que hacer es un switch del $_POST['p'] y en función de lo que venga haces include de la parte de la web que desees, si viene un p distinto haces include de error.php el cual dice que no existe dicho apartado.

Esta forma de hacer las webs la he empleado bastantes veces y me resulta bastante efectiva con webs de pequeño o mediano tamaño (si no tienes más de 20 apartados es manejable, en otro caso avísame y te propongo otra manera de hacerla).

LR

#10 así es como lo hago actualmente, pasandole un parametro por get y comprobando que la constante este definida en las paginas que incluyo. El problema es que igual me interesa tener 2 - 3 paginas sueltas sin incluirlas en ningun lado, y ahi es donde surge el problema.

Mirare de usar $_SERVER['HTTP_REFERER'] y a ver que solucion encuentro. ^^

GamA

#11 Si utilizas la constante definida alguien te podría navegar a index.php luego ir a otra zona y entrar en la zona restringida que quieres que vengan de index.php, luego no vienen de index.php sino que ha pasado por allí hace un tiempo. No es exactamente lo que creo que pretendes, pero mejor mírate el referer que seguro que te ayuda :)

NeB1

#10 te has patinado 50 veces.

1º - No sé si he perdido facultades para leer, pero en #9 y todas sus respuestas habla de hacer un control del lado del servidor, nada de javascript.

2º - No sé muy bien de que vá lo del crawling, pero si tienes bien configurado un servidor, no se puede acceder a un fichero que tiene permisos 444 a no ser que seas el owner (aquí puede que tu tengas razón, pero yo no tengo ni idea de como se conseguiría leer ficheros sin tener los permisos necesarios). suphp + permisos bien puestos...

3º - No, no te aseguras de que ha pasado UNA vez por index... en cada ejecución de un script PHP tienes que tener la constante definida, si vas a index.php y luego te vás a archivoSinDefines.php, en el segundo, las constantes no están definidas, solo estarán definidas SIEMPRE que pases por el index (o por donde se defina la constante). (aquí es donde más te has patinado)

4º - Si haces lo de index.php?id=x (que es como se hace, y nadie, en ninguno de sus métodos ha dicho que no se haga así) no estás solventando el problema de que no pasen por el index, tienes que hacer algo, además de esto (COMO DEFINIR EN EL INDEX UNA CONSTANTE XD).

LR

por lo pronto estoy usando lo de siempre de definir una constante para los archivos incluidos en el index y usando el HTTP_REFERER para los que no incluyo y parece que va bien.

Por cierto NeB1, si asigno los permisos a 444, tengo por fuerza que incluir los archivos en el index para que sea el propio index el que los ejecute no? ya que si redirijo a alguna de las paginas, no tendria permisos para verlas no?

NeB1

#14 ezacto. Realmente creo que necesitas 640 para que PHP pueda acceder correctamente

LR

#15 Pero entonces volveriamos al mismo problema del principio de que si no esta incluido en el index, cualquiera puede acceder no?

NeB1

#16 para nada, es como creer que pueden acceder a tus archivos de sistema desde internet por arte de magia. Alguna forma de hackeo habrá, pero en principio no, desde un navegador web o servicio FTP el usuario que accede al fichero es 'otros' que tiene permiso 0 sobre esos archivos.

LR

Pero entonces... si no pueden acceder al archivo.... si los reenvio a otra pagina desde un formulario, no podran verlo.. no?

Pfff.... hay sueño, no estoy para pensar xD

NeB1

#18 si lo haces bien, solo tienen que pasar por el index.php.

<form action="./index.php?pid=envio_formulario" method="post">

y en el index.php

switch($_POST['pid']){
  case "envio_formulario":
      include "envio_formulario.php";
  break;
  default:
      include "error404.php";
  break;

}
LR

Eso es lo que uso ahora, lo de incluirlos en el index, la cosa era si habia algo para no incluirlos en el index y obtener los mismos resultados, en en lo que a acceso se refiere

NeB1

#20 si tienes suPHP activado no vas a tener problemas tampoco.

LR

oks, thx #21 ^^

GamA

#13 Tienes razón me he patinado con el define, estaba pensando en hacerlo con Session y no se porqué. Con el sessión pasaría lo que comentaba, pero con el define no.

Pero si que #9 dijo lo de Javascript y cito textualmente:
"Además leches, no todo tiene por qué ser cómodo xD. Aún asi, con javascript puedes controlad de donde vienes "

Controlar de donde vienes con Javascript => Basura

Eso es un control de accesos del lado del cliente, por lo que el que se ha patinado ahí eres tú NeB1 :P. 1-1 "touché"

Con respecto a lo del punto 4, me refería a que haciendo que no accedan desde fuera, luego puedes hacer que pasen por index así, index.php?id=X. No que haciendo eso ya no se pudiera acceder desde fuera, me debiste entender mal (o me expliqué mal yo, que puede ser :P)

NeB1

#23 jajaja, ok, tampoco quiero que esto sea una discusión personal. No sé como no ví lo de 'javascript'

BLZKZ

os pegais por mi, que gonito :**

al final como ha quedado el tema? porque me parece interesante xD

LR

#25 al final ha quedado...

en las paginas que incluyo en el index, lo compruebo normal con un defined y las que no incluyo juego con el HTTP_REFERER para ver si vienen desde el dominio.

Para el tema de "bloquear" imagenes, archivos y demas, supongo que metere en el htaccess esta opcion

Options All -Indexes

ya que en esas carpetas solo estaran los archivos en cuestion.

GamA

#24 No puedo tener nada personal con un campusero que me dijo como se llamaba la pechugona de su perfil ^. Na, nunca tengo pollos personales en MV, aunque puede que lo parezca.

#26 No se si no estoy viéndo algo pero con el HTTP_REFERER solo ya valdría (que repito que igual me estoy olvidando de algo ¿eh?)

LR

#27 ya se que con eso se puede, pero ya que incluyo archivos, en vez de estar viendo de donde viene y comprobando si es de mi dominio, lo hago con un defined y listo. La pereza me puede xD

Usuarios habituales

  • LR
  • GamA
  • BLZKZ
  • NeB1
  • l31m