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.
Perdóname por no estar al tanto de mi Apache-fu: ¿eso no es más que verificar la existencia de una cookie? –
@Brock: N ope. –
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. –