Acceder a página protegida con htaccess mediante Perl (LWP)

Ya vimos como acceder a una página que se encuentra protegida por htaccess desde un script PHP (con curl y con file_get_contents). Ahora vamos a hacer lo mismo con LWP en Perl. Las principales diferencias con los métodos vistos para PHP son que en este caso se debe indicar junto a las credenciales:

  • el dominio con el puerto
  • el “realm” (ámbito), que representa el valor del AuthName definido en el archivo htaccess.
    • Importante: Deben coincidir perfectamente

Entonces, el bloque de código modelo para implementar LWP es el siguiente:

 #!/usr/bin/perl
 use strict;
 use LWP;
 
 my $url = 'http://www.destino.com/secure/index.cgi';
 
 my $domain = 'www.destino.com';
 my $port = 80;
 my $username = 'ht_user';
 my $password = 'ht_pass';
 my $realm = 'Secured directory';
 
 my $ua = LWP::UserAgent->new();
 
 //Credenciales htaccess 
 $ua->credentials( "$domain:$port", $realm ,$username => $password);

 my $response = $ua->get($url);

 print "Content-type:text/html\n\n";
 my $data = $response->content;

En este ejemplo, obtendremos dentro la variable $data el contenido de la página index.cgi, para poder utilizarlo en el resto del script.

Se puede utilizar este medio para invocar otros scripts que devuelvan urls, json, etc. como si fuera un API a la aplicación.

 

Si desconocemos el “realm” podemos obtenerlo haciendo un get inicial de la url sin credenciales y leyendo el header WWW-Authenticate de la respuesta. El resultado para el ejemplo presentado devolvería:

Basic realm="Secured directory"

Anuncios

Bloquear acceso a directorios mediante reglas de reescritura de Apache

Si nuestra aplicación web contiene directorios, dependiendo la configuración de Apache, el contenido de los mismos podría ser accedido conociendo la URL completa al archivo. Ya sabemos evitar que los buscadores indexen páginas de nuestro sitio y ahora vamos a ser un poco más estrictos, no permitiendo acceder a ciertos directorios por web mediante el módulo rewrite de Apache.

Activar el módulo rewrite y permitir htaccess en directorios del VirtualHost

  1. En la ubicación donde instalamos Apache, abrir con un editor de textos el archivo: conf\httpd.conf
  2. Descomentar la línea: LoadModule rewrite_module modules/mod_rewrite.so
  3. En el VirtualHost correspondiente, dentro de la etiqueta Directory establecer: AllowOverride All
  4. Reiniciar el servicio de apache

Proteger directorios

  1. En la ubicación donde se encuentran los directorios a proteger, crear un archivo .htaccess
  2. Abrir este archivo con un editor de textos e indicar en su contenido:
 Options -Indexes
 RewriteEngine on
 RewriteCond %{REQUEST_URI} ^.*/<DIRECTORY>/.*$
 RewriteRule .*$ <FORBIDDEN_URL>

donde DIRECTORY es el directorio que deseamos proteger para que no pueda ser accedido y FORBIDDEN_URL es una url a la cual redirigir cuando se intente acceder a este directorio por web. No hace falta decir que:

  • se pueden bloquear todos los directorios que deseemos, incluso especificando subdirectorios, agregando más líneas de RewriteCond debajo de la presentada
  • los directorios no especificados podrán ser accedidos.

Ejemplo: Suponiendo que tenemos un blog en http://myblogtest y no queremos que se permita el acceso a los archivos de log contenidos en http://myblogtest/archive/logs, creamos el archivo .htaccess en http://myblogtest:

 Options -Indexes
 RewriteEngine on
 RewriteCond %{REQUEST_URI} ^.*/archive/logs/.*$
 RewriteRule .*$ http://myblogtest/forbidden.html

De esta manera se podrá acceder a http://myblogtest/archive/file1.zip, pero cuando intentemos http://myblogtest/archive/logs/process1.log automáticamente redireccionará a http://myblogtest/forbidden.html

Alternativamente podemos querer indicar solamente los directorios a los cuales permitimos el acceso web. Entonces el contenido del .htaccess es el siguiente:

 Options -Indexes
 RewriteEngine on
 RewriteCond %{REQUEST_URI} !^.*/<DIRECTORY>/.*$
 RewriteRule .*$ <FORBIDDEN_URL>

donde DIRECTORY es el directorio al que permitimos el acceso y FORBIDDEN_URL es una url a la cual redirigir cuando se intente acceder por web a cualquier directorio que NO sea el indicado.

Acceder a página protegida con htaccess mediante PHP (file_get_contents)

Ya vimos como utilizar curl para acceder a una página que se encuentra protegida por htaccess desde un script PHP, y ahora les presento una alternativa más simple: utilizar la función file_get_contents.

El único requisito que tiene es que debe estar activado el flag allow_url_fopen  en php.ini

Entonces, el bloque de código modelo que lo utiliza es el siguiente:

<?php
  $url = 'http://www.destino.com/secure/index.php';
 
  $username = 'ht_user';
  $password = 'ht_pass';
 
  //Credenciales htaccess
  $context = stream_context_create(array (
    'http' => array (
      'header' => 'Authorization: Basic ' . base64_encode("$username:$password")
    )));
 
  $data = file_get_contents($url, false, $context);
?>

En este ejemplo, obtendremos dentro la variable $data el contenido de la página index.php, para poder utilizarlo en el resto del script.

Se puede utilizar este medio para invocar otros scripts que devuelvan urls, json, etc. como si fuera un API a la aplicación.

Acceder a página protegida con htaccess mediante PHP (curl)

Si necesitamos acceder a una página que se encuentre protegida por credenciales htaccess desde un script PHP, podemos utilizar la extensión curl que nos provee (pueden tener problemas al intentar activarla). Para ello, les porpongo un bloque de código que la utiliza:

<?php
  $url = 'http://www.destino.com/secure/index.php';
 
  $username = 'ht_user';
  $password = 'ht_pass';
 
  $ch=curl_init();
  curl_setopt($ch,CURLOPT_URL,$url);
  
  //Credenciales htaccess
  curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");

  //curl_exec devuelve el contenido obtenido en lugar de True
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 
  $data = curl_exec($ch);
  
  curl_close($ch);
 
?>

En este ejemplo, obtendremos dentro la variable $data el contenido de la página index.php, para poder utilizarlo en el resto del script.

Se puede utilizar este medio para invocar otros scripts que devuelvan urls, json, etc. como si fuera un API a la aplicación.

Proteger acceso web a un directorio con htaccess

Teniendo Apache como servidor web de nuestra aplicación, podemos asegurar el acceso web a un cierto directorio solicitando credenciales. Para ello debemos hacer lo siguiente:

Crear un archivo .htaccess en el directorio a proteger (por ejemplo en “C:\www\myapp\secured\.htaccess”) con el siguiente contenido:

AuthUserFile /www/.htpasswd
AuthType Basic
AuthName "Login requerido"
Require valid-user

Crear un archivo .htpasswd en el directorio indicado en mediante AuthUserFile en el archivo .htaccess (“C:\www” en este caso) que tenga como contenido una línea por cada usuario y su clave encriptada, que tendrá acceso al directorio.

Esta información se puede generar a partir de una página como http://www.htaccesstools.com/htpasswd-generator/

Ejemplo utilizando como Username: admin y Password: safezone

admin:$apr1$IPCqSTX5$2xdFxOcs8o5jlwXcxqIbw0

A partir de ahora cualquier consulta HTTP al directorio (“secured” en este caso) dentro de la aplicación (por browser o webservices) requiere las credenciales.

 

Obs: Para que apliquen las definiciones establecidas en el htaccess, en la etiqueta Directory del VirtualHost correspondiente es necesario establecer: AllowOverride All