2010-02-12 14 views
6

Tengo una configuración LAMP y solo quiero proteger el contenido de la página web (imágenes, CSS, videos, etc.) para que solo los usuarios que hayan iniciado sesión puedan acceder a él.Restringir el acceso al contenido a usuarios registrados con PHP

Me doy cuenta de que puedo hacerlo fácilmente con .htaccess. Sin embargo, no quiero usar la ventana emergente de autenticación, y quiero poder usar sesiones y también poder desconectarme.

Estoy usando php para hacer el trabajo de autenticar con mysql y crear sesiones. Esto funciona genial Pero las imágenes, css, javascript, etc. siguen siendo accesibles.

¿Cómo se permite el acceso al contenido solo si existe una sesión de php válida?

Me he encontrado usando mod_rewrite para reenviar archivos a un archivo php (como auth.php? File = ...) y hacer la verificación de sesión allí. Esto parece ineficiente para verificar la sesión de cada imagen en una página que ya se ha verificado. Parece un truco y sigo pensando que hay una forma más limpia de hacerlo.

¿Existe un mod para apache como mod_session_cookie que pueda verificar si existe una cookie con una clave de sesión en la base de datos de mi sesión y, de ser así, establecer Permitir de todos para el directorio?

Alternativamente, ¿es posible usar mod_auth_mysql pero también ser capaz de usar sesiones e iniciar sesión usando un formulario php y no la ventana emergente de autenticación?

EDIT:

Aquí está mi solución al problema:

En mi archivo de configuración de Apache (no .htaccess) añadí:

RewriteLock /var/www/lib/rewrite.lock 

<VirtualHost> 
    #... 
    RewriteEngine on 
    RewriteMap sessionValid prg:/var/www/lib/allow.php 

    <Directory /var/www/client/*> 
      RewriteEngine on 

      RewriteCond %{HTTP_COOKIE} !client-cookie=([^;]+) 
      RewriteRule .* - [L,R=403] 

      RewriteCond %{HTTP_COOKIE} client-cookie=([^;]+) 
      RewriteCond ${sessionValid:%1} !valid 
      RewriteRule .* - [L,R=403] 
    </Directory> 
</VirtualHost> 

Y permitir que el guión .php:

#!/usr/bin/php5 
<?php 
set_time_limit(0); 

echo ""; 
$stdin = fopen("php://stdin","r"); 
$db = mysql_connect(...); 
mysql_select_db(..., $db); 
$querypre = "SELECT ID FROM Sessions WHERE ID='"; 

while (1) { 
    $line = trim(fgets($stdin)); 

    $query = $querypre.mysql_real_escape_string($line)."'"; 
    $result = mysql_query($query); 

    if (mysql_num_rows($result) > 0) 
    echo("valid\n"); 
    else 
    echo("0\n"); 
} 

mysql_close($db); 
?> 

Esto funciona como un encanto. Usando esto y session_set_save_handler pude usar sesiones php respaldadas por mysql para asegurar las páginas php y todo el contenido dentro de. Espero que alguien encuentre esto útil.

Algunas advertencias:

comunicado
  • El RewriteMap necesita ser definido dentro del bloque de la máquina virtual si se va a utilizar dentro de la máquina virtual. Colocarlo fuera del bloque no funcionará.
  • Debe haber configurado RewriteEngine antes de definir RewriteMap o se ignorará.
  • RewriteLock no puede estar en el bloque de host virtual.
  • Al igual que con cualquier script de shell, el archivo php debe ser ejecutable por el usuario apache y carecer de^M
  • Las declaraciones RewriteMap no pueden colocarse en .htaccess, pero las otras instrucciones que usan el mapa sí pueden.

Respuesta

5
RewriteCond %{HTTP_COOKIE} !mysessioncookie=([^;]+) 
RewriteRule .+\.(jpg|css|js) forbidden.html [R=403] 
+1

Perdóname por no estar al tanto de mi Apache-fu: ¿eso no es más que verificar la existencia de una cookie? –

+0

@Brock: N ope. –

+1

Entonces, ¿no sería increíblemente fácil eludirlo? El OP quiere que la cookie se verifique contra una sesión adecuada en su base de datos. –

0

En lugar de vincular directamente a los recursos, utilice algún tipo de controlador para servir las imágenes.

Por ejemplo, vincular a 'images/bob.jpg 'en realidad no apunta a un recurso, sino a un script, que comprueba el inicio de sesión, y si tiene éxito, envía encabezados de imagen/jpeg con los datos correctos.

+0

Él nota esa técnica en su respuesta; pregunta si existe una alternativa que no requiera la ejecución de un script para cada parte del contenido. –

0

En realidad, no uso Apache; Utilizo lighttpd, que incluye un complemento que puede usar para restringir el acceso a una carpeta en función de si se pasa un hash correcto en el URI. Básicamente, la lógica de la aplicación y el servidor web comparten una sal secreta que luego se usa para generar un hash con la hora actual, que también se pasa con el hash. Si el tiempo está dentro de los últimos 5 minutos, entonces otorga acceso. Si no, o si el hash no es válido, entonces no es así. Estoy buscando en Google para ver si hay un complemento similar para Apache en este momento.

Editar: mod_auth_token parece hacer lo mismo para Apache.

+0

Desafortunadamente, esto parece requerir el cambio de las URL, lo cual no es una opción para mí. – Luke

Cuestiones relacionadas